diff --git a/std/datetime/systime.d b/std/datetime/systime.d index 01a59d2388d..dfc7fb0c50a 100644 --- a/std/datetime/systime.d +++ b/std/datetime/systime.d @@ -7636,45 +7636,67 @@ public: writing out the result of toISOString to read in later will continue to work. The current behavior will be kept until July 2019 at which point, fromISOString will be fixed to be standards compliant.) + + Params: + writer = A `char` accepting + $(REF_ALTTEXT output range, isOutputRange, std, range, primitives) + Returns: + A `string` when not using an output range; `void` otherwise. +/ string toISOString() @safe const nothrow { + import std.array : appender; + auto app = appender!string(); + app.reserve(30); try - { - immutable adjustedTime = adjTime; - long hnsecs = adjustedTime; - - auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; + toISOString(app); + catch (Exception e) + assert(0, "toISOString() threw."); + return app.data; + } - if (hnsecs < 0) - { - hnsecs += convert!("hours", "hnsecs")(24); - --days; - } + /// ditto + void toISOString(W)(ref W writer) const + if (isOutputRange!(W, char)) + { + immutable adjustedTime = adjTime; + long hnsecs = adjustedTime; - auto hour = splitUnitsFromHNSecs!"hours"(hnsecs); - auto minute = splitUnitsFromHNSecs!"minutes"(hnsecs); - auto second = splitUnitsFromHNSecs!"seconds"(hnsecs); + auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; - auto dateTime = DateTime(Date(cast(int) days), TimeOfDay(cast(int) hour, - cast(int) minute, cast(int) second)); - auto fracSecStr = fracSecsToISOString(cast(int) hnsecs); + if (hnsecs < 0) + { + hnsecs += convert!("hours", "hnsecs")(24); + --days; + } - if (_timezone is LocalTime()) - return dateTime.toISOString() ~ fracSecStr; + immutable hour = splitUnitsFromHNSecs!"hours"(hnsecs); + immutable minute = splitUnitsFromHNSecs!"minutes"(hnsecs); + immutable second = splitUnitsFromHNSecs!"seconds"(hnsecs); - if (_timezone is UTC()) - return dateTime.toISOString() ~ fracSecStr ~ "Z"; + auto dateTime = DateTime(Date(cast(int) days), TimeOfDay(cast(int) hour, + cast(int) minute, cast(int) second)); - immutable utcOffset = dur!"hnsecs"(adjustedTime - stdTime); + if (_timezone is LocalTime()) + { + dateTime.toISOString(writer); + fracSecsToISOString(writer, cast(int) hnsecs); + return; + } - return format("%s%s%s", - dateTime.toISOString(), - fracSecStr, - SimpleTimeZone.toISOExtString(utcOffset)); + if (_timezone is UTC()) + { + dateTime.toISOString(writer); + fracSecsToISOString(writer, cast(int) hnsecs); + put(writer, 'Z'); + return; } - catch (Exception e) - assert(0, "format() threw."); + + immutable utcOffset = dur!"hnsecs"(adjustedTime - stdTime); + + dateTime.toISOString(writer); + fracSecsToISOString(writer, cast(int) hnsecs); + SimpleTimeZone.toISOExtString(writer, utcOffset); } ///