我有一个程序,全世界的用户应该能够配置一个任务总是在X:YZ点钟运行。在当地时间,一年到头。
我考虑将时间戳存储在UTC偏移量中,但这带来了这样的问题:配置的时间与基于UTC的计算时间之间有一个小时的差异。(例如,当我将其配置为11月25日在德国的10:00时,它将是协调世界时09:00。但是在五月份,德国突然将是11:00,因为现在UTC的抵消时间是两个小时。
但是,仅仅将时间存储在数据库中会带来这样的问题:在一年中的某些日子里,一些小时根本不存在。当时钟向前移动时,时间从1:59直接跳到3:00。在特定的一天,2:00到2:59之间的任何时间都是无效的。
但我怎么知道某一天某一天在某一时区的某一时间是无效的呢?
编辑我测试了TimeZoneInfo.IsInvalid(),但它似乎不起作用:
在2020年3月29日星期日,没有凌晨02:30。然而,IsInvalid()报道了false
var tzi = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
var isInvalid = tzi.IsInvalidTime(new DateTime(2020, 3, 29, 2, 30, 0, DateTimeKind.Local));编辑2
啊,好的,为了使IsInvalidTime()正常工作,需要将时间戳标记为未指定的时间戳:
var isInvalid = tzi.IsInvalidTime(new DateTime(2020, 3, 29, 2, 30, 0, DateTimeKind.Unspecified));发布于 2020-04-21 09:59:37
如果正确地创建了TimeZoneInfo.IsInvalid()对象,DateTime就会工作。它不能具有DateTimeKind.Local属性,而必须具有DateTimeKind.Unspecified属性。
var tzi = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
var isInvalid = tzi.IsInvalidTime(new DateTime(2020, 3, 29, 2, 30, 0, DateTimeKind.Unspecified));https://stackoverflow.com/questions/61339418
复制相似问题