Skip to content

Commit

Permalink
Merge pull request #6180 from JackStouffer/systime-toisostring
Browse files Browse the repository at this point in the history
Work On Issue 10828 - Added writer version of SysTime.toISOString
merged-on-behalf-of: Jack Stouffer <jack@jackstouffer.com>
  • Loading branch information
dlang-bot committed Feb 16, 2018
2 parents 0107a6e + 1334538 commit bc1b956
Showing 1 changed file with 49 additions and 27 deletions.
76 changes: 49 additions & 27 deletions std/datetime/systime.d
Expand Up @@ -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);
}

///
Expand Down

0 comments on commit bc1b956

Please sign in to comment.