C# 标准化DateTime.Now和DateTime.Utc
我正在开发一个从服务器接收警报的应用程序。在处理警报时,我通过执行以下操作来计算上次发送警报的时间:C# 标准化DateTime.Now和DateTime.Utc,c#,datetime,C#,Datetime,我正在开发一个从服务器接收警报的应用程序。在处理警报时,我通过执行以下操作来计算上次发送警报的时间: TimeSpan? alertDiffTimespan = DateTime.UtcNow - serverEventInfo.lastAlert TimeSpan? alertDiffTimeSpan = DateTime.UtcNow - serverEventInfo.lastAlert.Value.ToUniversalTime() 准确的时间跨度很重要,因为它允许我判断服务器是否处
TimeSpan? alertDiffTimespan = DateTime.UtcNow - serverEventInfo.lastAlert
TimeSpan? alertDiffTimeSpan = DateTime.UtcNow - serverEventInfo.lastAlert.Value.ToUniversalTime()
准确的时间跨度很重要,因为它允许我判断服务器是否处于活动状态
最近,我注意到有时serverEventInfo.lastAlert
是正确的(即被格式化为DateTime.UtcNow),而其他时间则比当前时间(即DateTime.Now)早/晚一个小时。我尝试了以下方法:
TimeSpan? alertDiffTimespan = DateTime.UtcNow - serverEventInfo.lastAlert
TimeSpan? alertDiffTimeSpan = DateTime.UtcNow - serverEventInfo.lastAlert.Value.ToUniversalTime()
但是这意味着所有设置为DateTime.UtcNow
的值的格式都不正确,但是设置为DateTime.Now
的值是正确的
我已经尝试过确定日期时间。种类也一样,但是每次都会标记为未指定,所以没有区别
我可以做些什么来标准化我的应用程序中传入的日期时间值,以便无论是UtcNow
还是Now
值,我都可以正确处理它并获得正确的alertDiffTimeSpan
日期的格式为
{0:MM/dd/yyyy hh:MM:ss tt}
,设置如下String.format({0:MM/dd/yyyy hh:MM:ss tt}),DateTime.Now)
或String.format({0:MM/dd/yyyyy hh:MM:ss tt}),DateTime.UtcNow)
在服务器上。如果没有以某种方式指定时区信息,则无法猜测日期时间的正确值。听起来您的服务器可能会在本地(可能是多个时区)和UTC之间“随机”选择,而您无法知道哪个是哪个
修正:
- 对齐所有服务器以返回UTC时间,并继续使用不指定时区的格式。读取服务器值时,在末尾指定Utc:
DateTime.SpecifyKind(parsedDateTime,DateTimeKind.Utc)
- 需要序列化数据中的时区信息。最好使用完整的ISO8601,如“2017-05-17T08:27:27.0314698Z”(
,更多信息,或者如果您更喜欢图片-)dateTime.ToString(“o”)
不要在序列化数据中使用任何特定于区域性的格式(如default
ToString()
),除非您100%确信所有配置了相同区域设置的服务器和解析代码在读取值时始终指定相同的区域性。同样,ISO8601是更安全的选择。如果没有以某种方式指定时区信息,则无法猜出日期时间的正确值。听起来您的服务器可能会在本地(可能是多个时区)和UTC之间“随机”选择,而您无法知道哪个是哪个
修正:
- 对齐所有服务器以返回UTC时间,并继续使用不指定时区的格式。读取服务器值时,在末尾指定Utc:
DateTime.SpecifyKind(parsedDateTime,DateTimeKind.Utc)
- 需要序列化数据中的时区信息。最好使用完整的ISO8601,如“2017-05-17T08:27:27.0314698Z”(
,更多信息,或者如果您更喜欢图片-)dateTime.ToString(“o”)
不要在序列化数据中使用任何特定于区域性的格式(如default
ToString()
),除非您100%确信所有配置了相同区域设置的服务器和解析代码在读取值时始终指定相同的区域性。同样,ISO8601是更安全的选择。您接收日期时间的格式是什么?如果他们没有指定他们是否为UTC。。你自己也猜不到。如果只有一台服务器,并且你知道它运行的时区,你可能只需要两次检查就可以了。一次将其视为UTC,一次将其视为本地服务器时间。但那很糟糕。如果您对服务器有任何控制权,请找出它发送UTC/local的原因,并确保它始终发送UTC。@methuselah您所说的标准日期时间格式是什么意思?有许多“标准”格式。它包括补偿吗?@methuselah我想你错过了我的要求。你能给我们看看这个字符串和格式吗?说它是标准字符串意味着什么。有许多标准格式。有些包含偏移量,有些不包含。如果服务器发送的本地时间没有时区信息,则基本上没有足够的信息。你需要在源代码处解决这个问题。你收到的日期时间是什么格式的?如果他们没有指定他们是否为UTC。。你自己也猜不到。如果只有一台服务器,并且你知道它运行的时区,你可能只需要两次检查就可以了。一次将其视为UTC,一次将其视为本地服务器时间。但那很糟糕。如果您对服务器有任何控制权,请找出它发送UTC/local的原因,并确保它始终发送UTC。@methuselah您所说的标准日期时间格式是什么意思?有许多“标准”格式。它包括补偿吗?@methuselah我想你错过了我的要求。你能给我们看看这个字符串和格式吗?说它是标准字符串意味着什么。有许多标准格式。有些包含偏移量,有些不包含。如果服务器发送的本地时间没有时区信息,则基本上没有足够的信息。你需要从源头上解决这个问题。