1 回答

TA贡献2021条经验 获得超8个赞
一些东西:
DateTime
不考虑减去值DateTimeKind
。.NET Framework 4.6 及更高版本在类中内置了与 Unix 时间之间的转换函数
DateTimeOffset
,因此您根本不需要做任何减法。当你说
EST
orCST
时,我假设你指的是美国东部时间或美国中部时间。请记住,由于夏令时,这EDT
或CDT
可能适用于您的某些值。如果该值来自您的数据库,则不应从字符串中进行解析。我假设你只是在这里给出了这个例子。但是在您的实际代码中,您应该执行以下操作:
DateTime dt = (DateTime) dataReader("field");
(如果您正在使用 Entity Framework 或其他一些 ORM,那么这部分将为您处理。)
SQL Server位于哪个时区并不重要。重要的是
dbValue
您打算代表哪个时区。最佳做法是使用 UTC 时间,在这种情况下,服务器的时区应该无关紧要。如果存储在 SQL Server 中的日期时间实际上是 UTC,那么您可以简单地执行以下操作:
long apiValue = new DateTimeOffset(dt, TimeSpan.Zero).ToUnixTimeMilliseconds();
如果存储在 SQL Server 中的日期时间确实是美国东部时间,那么您需要先将东部时间转换为 UTC:
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); DateTime utc = TimeZoneInfo.ConvertTimeToUtc(dt, tz); long apiValue = new DateTimeOffset(utc).ToUnixTimeMilliseconds();
请注意,Windows 时区 ID
"Eastern Standard Time"
代表美国东部时间,包括适用时的美国东部时间,尽管中间有“标准”一词。如果您在非 Windows 平台上运行 .NET Core,请
"America/New_York"
改为传递。(如果您需要为跨平台弹性编写代码,请使用我的TimeZoneConverter库。)最后,虽然假设数据库中的时间与访问数据库的代码在同一本地时间可能有点危险,但如果您真的想进行这样的赌博,您可以这样做:
long apiValue = new DateTimeOffset(dt).ToUnixTimeMilliseconds();
这仅在
dt.Kind
isDateTimeKind.Unspecified
或时有效DateTimeKind.Local
,因为它将应用本地时区。但我再次建议不要这样做。
- 1 回答
- 0 关注
- 126 浏览
添加回答
举报