How do I get the current Unix timestamp in milliseconds, in D?

Viewed 92

How can I get the current unix timestamp (milliseconds since January 1st, 1970) as a long variable?

In other words, how would I implement this function?

long getUnixTimestampMillis() {

}
2 Answers

Updated answer!

There are two functions in std.datetime.systime: stdTimeToUnixTime and unixTimeToStdTime, which convert between unix time (seconds since 1970-1-1) and stdTime (hecto-nanoseconds since Proleptic Gregorian Calendar epoch) See the docs for unixTimeToStdTime

If your intent is to pass the value into a function that accepts a typical unix time (in seconds, not milliseconds), then you can the following function:

time_t getUnixTimestamp() {
   import std.datetime;
   return Clock.currTime().stdTime().stdTimeToUnixTime();
}

However, if your goal truly is milliseconds since the unix epoch, the OP's code is correct. But here is a condensed version that doesn't rely on the unix epoch knowledge (this is how stdTimeToUnixTime works internally). The key is that SysTime(unixTimeToStdTime(0)) gives a SysTime that is set at the unix epoch. From there you can do whatever math you like.

long getUnixTimestampMillis() {
    import std.datetime;
    return (Clock.currTime() - SysTime(unixTimeToStdTime(0)))
        .total!"msecs";
}

I did some experimentation on my own, and I came up with the following solution:

long getUnixTimestampMillis() {
  import std.datetime;
  SysTime now = Clock.currTime();
  SysTime unixEpoch = SysTime(DateTime(1970, 1, 1), UTC());
  Duration diff = now - unixEpoch;
  return diff.total!"msecs";
}

However, I'm open to suggestions for how to improve this!

Related