如何使用C# .NET将日期时间转换为时间戳(忽略当前时区)?我使用下面的代码:
private long ConvertToTimestamp(DateTime value) { long epoch = (value.ToUniversalTime().Ticks - 621355968000000000) / 10000000; return epoch; }
但是它根据当前时区返回时间戳值&而我需要的是不使用当前时区的结果。
7hiiyaii1#
现在你调用的是ToUniversalTime()-只要去掉它:
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的值才能起作用。不幸的是,DateTime在这方面有点不好-参见my blog post(关于DateTime的咆哮)了解更多细节。你可能想使用我的Noda Time日期/时间API,这使得一切都更清晰,IMO。
DateTime
Kind
Utc
dsf9zpds2#
我不太确定你想要什么。你想要一个时间戳吗?然后你可以做一些简单的事情,比如:
TimeStamp ts = TimeStamp.FromTicks(value.ToUniversalTime().Ticks);
既然你命名了一个变量epoch,你想用Unix时间来表示你的日期吗?
DateTime unixStart = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc); long epoch = (long)Math.Floor((value.ToUniversalTime() - unixStart).TotalSeconds);
hgb9j2n63#
从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); }
pkwftd7m4#
JonSkeet有一个很好的答案,但作为替代方案,如果你想保持结果更可移植,你可以将日期转换为ISO 8601,然后可以读入大多数其他框架,但这可能超出了你的要求。
value.ToUniversalTime().ToString("O");
4条答案
按热度按时间7hiiyaii1#
现在你调用的是
ToUniversalTime()
-只要去掉它:或者,更容易理解的是IMO:
编辑:正如注解中所指出的,当你执行减法时,你传入的
DateTime
的Kind
不会被考虑在内。你应该传入一个Kind
的Utc
的值才能起作用。不幸的是,DateTime
在这方面有点不好-参见my blog post(关于DateTime
的咆哮)了解更多细节。你可能想使用我的Noda Time日期/时间API,这使得一切都更清晰,IMO。
dsf9zpds2#
我不太确定你想要什么。你想要一个时间戳吗?然后你可以做一些简单的事情,比如:
既然你命名了一个变量epoch,你想用Unix时间来表示你的日期吗?
hgb9j2n63#
从DateTime查找时间戳:
pkwftd7m4#
JonSkeet有一个很好的答案,但作为替代方案,如果你想保持结果更可移植,你可以将日期转换为ISO 8601,然后可以读入大多数其他框架,但这可能超出了你的要求。