我的情况是相对时间对于用户而言比绝对时间更重要。因此,能够快速说出“5天5小时前发生的事件”比“事件发生在CDT下午1点,现在是5天后的5天CST”更为重要。
我们以UTC格式存储日期并转换为用户显示:
pDateTime = DateTime.SpecifyKind(pDateTime, DateTimeKind.Utc);
DateTimeZone dateTimeZone = DateTimeZoneProviders.Tzdb[pCurrentUser.PreferredTimezone];
return Instant.FromDateTimeUtc(pDateTime).InZone(dateTimeZone).ToString("HH':'mm':'ss' 'MM'/'dd'/'yy' 'x", CultureInfo.InvariantCulture);
我们将在NodaTime 1.2完全使用时使用它,之前只使用了vanilla ToString。
但是,使用此模式的时间最终会使用时间的日光状态而不是当前的日光状态。这意味着时间看起来像:16:15:32 10/25/13 CDT
,即使我们现在已经转换为CST。
这是时间的绝对量度。这迫使用户做出这样的逻辑:“多久以前呢?现在是夏令时吗?如果是,那么差异就是x。如果没有,我必须加减一小时?这就差别了。”
同时,在没有DST的情况下,时间的相对度量将显示15:15:32 10/25/13 CST
。这会强制用户不进行任何转换,并允许他们更轻松地计算上下文中的内容。
在具有大量日期的显示器中,在整个集合上执行绝对时间逻辑会变得棘手。做一次是正确的。但是,像“5小时前发布”这样的友好相对字符串也迫使他们自己解决日期和时间 - 这些信息仍然很重要。
妥协可能是在前24小时内发布空白时间/分钟前,或者包括友好字符串和绝对时间 - 这些都是我见过的模式。
但忽略这些,NodaTime是否有办法让时间具有特定的日光状态,以便在相对背景下显示时间?
答案 0 :(得分:4)
但是,使用此模式的时间最终会使用时间的日光状态而不是当前的日光状态。这意味着时间看起来像:13:15:32 10/25/13 CDT即使我们现在已经过渡到CST。
是的,它应该。尽管在CDT中出现日期/时间,但使用CST显示日期/时间将非常奇怪,IMO。
因此,能够快速说出“5天5小时前发生的事件”比“事件发生在CDT下午1点,现在是5天后的5天CST”更为重要。
在这种情况下,我不应该在我的视图中显示日期/时间。将ZonedDateTime
值转换为Instant
,在它们之间取Duration
,然后就可以看到它是5天5小时前。 (我不记得我们提供了多少帮助 - 您可能需要手动获取刻度数并除以NodaConstants.TicksPerStandardDay
等。查看DurationPattern
以查看它是否有帮助。)< / p>
或者,如果您真的想要显示日期和时间,但仍然可以轻松地在精神上提取它们之间的差异,那么有两个选项可以表明:
OffsetDateTime
;那里你可以强制偏移是相同的,虽然我仍然认为显示偏移量实际上并不是你观察时间的区域中的当前偏移量是奇怪的。或者你可以只显示当时的相关偏移量,因此对于CST为-5,对于CDT为-4。请注意,不能在两个ZonedDateTime
值之间获得数月,因为我们处理的是经过时间(持续时间)而不是日历逻辑算术(一段时间) )。