如何使用C#/ .NET将日期时间转换为时间戳(忽略当前时区)

如何使用C#.NET将日期时间转换为时间戳(忽略当前时区)?

我使用以下代码:

private long ConvertToTimestamp(DateTime value) { long epoch = (value.ToUniversalTime().Ticks - 621355968000000000) / 10000000; return epoch; } 

但是它根据当前时区返回时间戳值,并且我需要结果而不使用当前时区。

在你调用ToUniversalTime()的那一刻 – 只是摆脱它:

 private long ConvertToTimestamp(DateTime value) { long epoch = (value.Ticks - 621355968000000000) / 10000000; return epoch; } 

或者,更可读的是IMO:

 private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); ... private static long ConvertToTimestamp(DateTime value) { TimeSpan elapsedTime = value - Epoch; return (long) elapsedTime.TotalSeconds; } 

编辑:如评论中所述,执行减法时不会考虑传入的DateTime Kind 。 你应该用Kind Utc来传递一个值Utc实现这一点。 不幸的是, DateTime在这方面有点破碎 – 有关详细信息,请参阅我的博客文章 (关于DateTime的咆哮)。

您可能希望使用我的Noda Time日期/时间API,这使得一切都相当清晰,IMO。

我不确定你想要的是什么。 你想要一个TimeStamp吗? 然后你可以做一些简单的事情:

 TimeStamp ts = TimeStamp.FromTicks(value.ToUniversalTime().Ticks); 

既然你命名了一个变量纪元,你想要Unix时间等于你的日期吗?

 DateTime unixStart = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc); long epoch = (long)Math.Floor((value.ToUniversalTime() - unixStart).TotalSeconds); 

从DateTime查找时间戳:

 private long ConvertToTimestamp(DateTime value) { TimeZoneInfo NYTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); DateTime NyTime = TimeZoneInfo.ConvertTime(value, NYTimeZone); TimeZone localZone = TimeZone.CurrentTimeZone; System.Globalization.DaylightTime dst = localZone.GetDaylightChanges(NyTime.Year); NyTime = NyTime.AddHours(-1); DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime(); TimeSpan span = (NyTime - epoch); return (long)Convert.ToDouble(span.TotalSeconds); } 

JonSkeet有一个很好的答案,但作为一种替代方案,如果你想保持结果更便携,你可以将日期转换为ISO 8601格式,然后可以将其读入大多数其他框架,但这可能超出您的要求。

 value.ToUniversalTime().ToString("O");