|
|
1
23
我 reported this bug on Microsoft Connect 一段时间前,但它已经关闭,无法修复。 如果在本地时间指定绝对过期时间,则.NET 2.0中仍有问题。 在夏时制结束的一个小时内,您的本地时间不明确,因此您可能会得到意想不到的结果,即绝对到期时间可能比预期时间长一个小时。 在欧洲,夏令时结束于2009年10月25日02:00。下面的示例说明,如果您在01:59将一个项目放置在缓存中,并且过期2分钟,那么它将在缓存中保留1小时2分钟。
.NET 2.0或更高版本的解决方法是指定ruben指出的绝对过期时间(以UTC为单位)。 Microsoft也许应该建议在示例中使用UTC以实现绝对过期,但我想可能会出现混淆,因为此建议仅对.NET 2.0及更高版本有效。 编辑 从评论中:
只有在夏令时结束时的一个不明确的小时内,在本地时间以绝对expiration时间将项目插入缓存中时,才会发生此问题。 例如,如果您的本地时区是中欧(冬季为格林威治标准时间+1,夏季为格林威治标准时间+2),并且您在2009年10月25日01:59:00执行以下代码:
然后该项将在缓存中保留1小时2分钟,而不是通常预期的2分钟。对于一些时间紧迫的应用程序(如股票行情、航空公司离港公告板),这可能是一个问题。 这里发生的是(假设是欧洲时间,但任何时区的原则都是相同的):
如果使用datetime.utcnow代替datetime.now,则缓存将过期两分钟(.net 2.0或更高版本):
从评论中:
不,你不是。您的分析是现场分析,如果您的应用程序是时间关键型的,并且在DST结束时运行,那么您使用datetime.utcnow是正确的。 鲁本回答中的陈述是:
是不正确的。 |
|
|
2
6
从Reflector(我省略了大部分参数,以便于阅读):
在
|
|
|
3
3
[从Jeff Sternal的回答中高度衍生出见解,我在“未完成付款”中加了1'd:d]
似乎在1.1中(没有看到1.0,但我假设它是相似的),在没有
因此…
我仍然很感兴趣听到更多的细节,包括任何小马的细节。
编辑:我从乔的评论中意识到我没有明确指出
是
使用更正确
编辑:noda时间将有一个整洁的包装使这个万无一失:d |