Coder Perfect

What is the best way to convert a Unix timestamp to a DateTime value and vice versa?

Problem

There’s this sample code, but it quickly devolves into millisecond and nanosecond issues.

Seconds since the Unix epoch in C# is a similar question on MSDN.

So far, here’s what I’ve got:

public Double CreatedEpoch
{
  get
  {
    DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime();
    TimeSpan span = (this.Created.ToLocalTime() - epoch);
    return span.TotalSeconds;
  }
  set
  {
    DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime();
    this.Created = epoch.AddSeconds(value);
  }
}

Asked by Mark Ingram

Solution #1

Here’s what you’ll require:

public static DateTime UnixTimeStampToDateTime( double unixTimeStamp )
{
    // Unix timestamp is seconds past epoch
    DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    dateTime = dateTime.AddSeconds( unixTimeStamp ).ToLocalTime();
    return dateTime;
}

Alternatively, for Java (which differs since the timestamp is in milliseconds rather than seconds):

public static DateTime JavaTimeStampToDateTime( double javaTimeStamp )
{
    // Java timestamp is milliseconds past epoch
    DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
    dateTime = dateTime.AddMilliseconds( javaTimeStamp ).ToLocalTime();
    return dateTime;
}

Answered by ScottCher

Solution #2

Unix time conversions are now built-in to the current version of.NET (v4.6). This applies to both to and from Unix time, which is expressed in seconds or milliseconds.

DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000);
long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds();
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000);
long unixTimeStampInMilliseconds = dateTimeOffset.ToUnixTimeMilliseconds();

Note that these methods translate between UTC DateTimeOffsets and vice versa. Simply use the DateTimeOffset to get a DateTime representation. DateTimeOffset or UtcDateTime LocalDateTime has the following properties:

DateTime dateTime = dateTimeOffset.UtcDateTime;

Answered by i3arnon

Solution #3

To convert a datetime to a UNIX timestamp, use the following formula:

public static double DateTimeToUnixTimestamp(DateTime dateTime)
{
    return (TimeZoneInfo.ConvertTimeToUtc(dateTime) - 
           new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc)).TotalSeconds;
}

Answered by Dmitry Fedorkov

Solution #4

From Wikipedia:

So, here’s my code:

TimeSpan span = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0,DateTimeKind.Utc));
double unixTime = span.TotalSeconds;

Answered by gl051

Solution #5

If you require precision greater than milliseconds, proceed with caution!

This precision is not available in.NET (v4.6) methods (for example, FromUnixTimeMilliseconds).

The microseconds in the double are likewise chopped out by AddSeconds and AddMilliseconds.

These variants are quite precise:

Unix -> DateTime

public static DateTime UnixTimestampToDateTime(double unixTime)
{
    DateTime unixStart = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
    long unixTimeStampInTicks = (long) (unixTime * TimeSpan.TicksPerSecond);
    return new DateTime(unixStart.Ticks + unixTimeStampInTicks, System.DateTimeKind.Utc);
}

DateTime -> Unix

public static double DateTimeToUnixTimestamp(DateTime dateTime)
{
    DateTime unixStart = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
    long unixTimeStampInTicks = (dateTime.ToUniversalTime() - unixStart).Ticks;
    return (double) unixTimeStampInTicks / TimeSpan.TicksPerSecond;
}

Answered by Felix Keil

Post is based on https://stackoverflow.com/questions/249760/how-can-i-convert-a-unix-timestamp-to-datetime-and-vice-versa