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