How can I convert a Unix timestamp to DateTime and vice versa?
这里有一个示例代码,但随后它开始讨论毫秒/纳秒问题。
同样的问题出现在msdn上,这是自c中的unix时代以来的秒数。
这就是我到目前为止所得到的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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); } } |
这是你需要的
1 2 3 4 5 6 7 | public static DateTime UnixTimeStampToDateTime( double unixTimeStamp ) { // Unix timestamp is seconds past epoch System.DateTime dtDateTime = new DateTime(1970,1,1,0,0,0,0,System.DateTimeKind.Utc); dtDateTime = dtDateTime.AddSeconds( unixTimeStamp ).ToLocalTime(); return dtDateTime; } |
然而,对于爪哇(由于时间的推移在毫秒,而不是秒):
ZZU1
最新版本的网络(V4.6)已添加到支持UNIX时间转换。这包括从Unix到United Nations time,由Either Seconds或Milliseconds代表。
- Unix time in seconds to UTC
DateTimeOffset
1 | DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeSeconds(1000); |
- To Unix Time in Seconds:
1 | long unixTimeStampInSeconds = dateTimeOffset.ToUnixTimeSeconds(); |
- Unix Time in Millesconds to UTC
DateTimeOffset
1 | DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds(1000000); |
- To Unix Time in Millesconds:
1 | long unixTimeStampInMilliseconds = dateTimeOffset.ToUnixTimeMilliseconds(); |
注:这些方法从一个UTC
1 | DateTime dateTime = dateTimeOffset.UtcDateTime; |
Datetime to UNIX Timestamp:
1 2 3 4 5 | public static double DateTimeToUnixTimestamp(DateTime dateTime) { return (TimeZoneInfo.ConvertTimeToUtc(dateTime) - new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc)).TotalSeconds; } |
"UTC does not change with a change of seasons,but local time or civil time may change if a time zone jurisdiction observers daylight saving time(summer time).例如,UTC在冬季期间离美国东岸大约5小时(这一天比)晚,但在冬季后期约4小时。"
这是我的代码
1 2 | TimeSpan span = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0,DateTimeKind.Utc)); double unixTime = span.TotalSeconds; |
小心点,如果你需要比毫秒更精确的话!
Net(V4.6)Methods(E.G.Fromunixtimemilliseconds)don't provide this precision.
添加剂和添加剂还将微秒切割到双。
These versions have high precision:
大学日期
1 2 3 4 5 6 | 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); } |
联合国大学
1 2 3 4 5 6 | 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; } |
See identitymodel.epochtimextensions
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | public static class EpochTimeExtensions { /// <summary> /// Converts the given date value to epoch time. /// </summary> public static long ToEpochTime(this DateTime dateTime) { var date = dateTime.ToUniversalTime(); var ticks = date.Ticks - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks; var ts = ticks / TimeSpan.TicksPerSecond; return ts; } /// <summary> /// Converts the given date value to epoch time. /// </summary> public static long ToEpochTime(this DateTimeOffset dateTime) { var date = dateTime.ToUniversalTime(); var ticks = date.Ticks - new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero).Ticks; var ts = ticks / TimeSpan.TicksPerSecond; return ts; } /// <summary> /// Converts the given epoch time to a <see cref="DateTime"/> with <see cref="DateTimeKind.Utc"/> kind. /// </summary> public static DateTime ToDateTimeFromEpoch(this long intDate) { var timeInTicks = intDate * TimeSpan.TicksPerSecond; return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddTicks(timeInTicks); } /// <summary> /// Converts the given epoch time to a UTC <see cref="DateTimeOffset"/>. /// </summary> public static DateTimeOffset ToDateTimeOffsetFromEpoch(this long intDate) { var timeInTicks = intDate * TimeSpan.TicksPerSecond; return new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero).AddTicks(timeInTicks); } } |
为了补充Scottcher's answer,我最近发现自己在一个年夜的场景中,两者都是第二次和毫秒的Unix Timestamps任意混合在一个输入数据集中。The following code seems to handle this well:
1 2 3 4 5 6 7 8 9 | static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); static readonly double MaxUnixSeconds = (DateTime.MaxValue - UnixEpoch).TotalSeconds; public static DateTime UnixTimeStampToDateTime(double unixTimeStamp) { return unixTimeStamp > MaxUnixSeconds ? UnixEpoch.AddMilliseconds(unixTimeStamp) : UnixEpoch.AddSeconds(unixTimeStamp); } |
UNIX time transformation is new in net framework 4.6.
现在,您可以更容易地转换日期和时间值到或从净框架类型和UNIX时间。This can be necessary,for example,when conversing time values between a Javascript client and net server.The following apis have been added to the datetimeofset structure:
1 2 3 4 | static DateTimeOffset FromUnixTimeSeconds(long seconds) static DateTimeOffset FromUnixTimeMilliseconds(long milliseconds) long DateTimeOffset.ToUnixTimeSeconds() long DateTimeOffset.ToUnixTimeMilliseconds() |
I found the right answer just comparing the transion to 1/1/1970 W/O the local time adjustment;
1 2 3 4 |
1 2 | DateTime unixEpoch = DateTime.ParseExact("1970-01-01","yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture); DateTime convertedTime = unixEpoch.AddMilliseconds(unixTimeInMillisconds); |
如果UNIX时间在后面,则需要有一次在你的项目中出现。
To go the other way:
1 | double unixTimeInMilliseconds = timeToConvert.Subtract(unixEpoch).TotalMilliseconds; |
如有必要,可使用
一张单子是第二张(如果我还记得的话),一张单子是100 。
如果你遇到纳米问题,你可能想尝试使用Addick(1000000*value).
From Net 4.6,you can do this:
1 | var dateTime = DateTimeOffset.FromUnixTimeSeconds(unixDateTime).DateTime; |
1 2 | var dt = DateTime.Now; var unixTime = ((DateTimeOffset)dt).ToUnixTimeSeconds(); |
页:1
1 | var dt = DateTimeOffset.FromUnixTimeSeconds(1510396991); |
//[11.11.2017 10:43:11+00:00]
我需要转换一个包含
1 2 3 4 5 6 7 | DateTime _epochTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); private DateTime UnixTimeToDateTime(Timeval unixTime) { return _epochTime.AddTicks( unixTime.Seconds * TimeSpan.TicksPerSecond + unixTime.Microseconds * TimeSpan.TicksPerMillisecond/1000); } |
1 2 3 4 5 6 7 8 9 | public static class UnixTime { private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0); public static DateTime UnixTimeToDateTime(double unixTimeStamp) { return Epoch.AddSeconds(unixTimeStamp).ToUniversalTime(); } } |
你可以称为UNIXTIME.UNIXTIME(双日期)
For Net 4.6 and later:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | public static class UnixDateTime { public static DateTimeOffset FromUnixTimeSeconds(long seconds) { if (seconds < -62135596800L || seconds > 253402300799L) throw new ArgumentOutOfRangeException("seconds", seconds,""); return new DateTimeOffset(seconds * 10000000L + 621355968000000000L, TimeSpan.Zero); } public static DateTimeOffset FromUnixTimeMilliseconds(long milliseconds) { if (milliseconds < -62135596800000L || milliseconds > 253402300799999L) throw new ArgumentOutOfRangeException("milliseconds", milliseconds,""); return new DateTimeOffset(milliseconds * 10000L + 621355968000000000L, TimeSpan.Zero); } public static long ToUnixTimeSeconds(this DateTimeOffset utcDateTime) { return utcDateTime.Ticks / 10000000L - 62135596800L; } public static long ToUnixTimeMilliseconds(this DateTimeOffset utcDateTime) { return utcDateTime.Ticks / 10000L - 62135596800000L; } [Test] public void UnixSeconds() { DateTime utcNow = DateTime.UtcNow; DateTimeOffset utcNowOffset = new DateTimeOffset(utcNow); long unixTimestampInSeconds = utcNowOffset.ToUnixTimeSeconds(); DateTimeOffset utcNowOffsetTest = UnixDateTime.FromUnixTimeSeconds(unixTimestampInSeconds); Assert.AreEqual(utcNowOffset.Year, utcNowOffsetTest.Year); Assert.AreEqual(utcNowOffset.Month, utcNowOffsetTest.Month); Assert.AreEqual(utcNowOffset.Date, utcNowOffsetTest.Date); Assert.AreEqual(utcNowOffset.Hour, utcNowOffsetTest.Hour); Assert.AreEqual(utcNowOffset.Minute, utcNowOffsetTest.Minute); Assert.AreEqual(utcNowOffset.Second, utcNowOffsetTest.Second); } [Test] public void UnixMilliseconds() { DateTime utcNow = DateTime.UtcNow; DateTimeOffset utcNowOffset = new DateTimeOffset(utcNow); long unixTimestampInMilliseconds = utcNowOffset.ToUnixTimeMilliseconds(); DateTimeOffset utcNowOffsetTest = UnixDateTime.FromUnixTimeMilliseconds(unixTimestampInMilliseconds); Assert.AreEqual(utcNowOffset.Year, utcNowOffsetTest.Year); Assert.AreEqual(utcNowOffset.Month, utcNowOffsetTest.Month); Assert.AreEqual(utcNowOffset.Date, utcNowOffsetTest.Date); Assert.AreEqual(utcNowOffset.Hour, utcNowOffsetTest.Hour); Assert.AreEqual(utcNowOffset.Minute, utcNowOffsetTest.Minute); Assert.AreEqual(utcNowOffset.Second, utcNowOffsetTest.Second); Assert.AreEqual(utcNowOffset.Millisecond, utcNowOffsetTest.Millisecond); } } |