我有一种情况,相对时间对用户来说比绝对时间更重要。因此,能够快速说出“事件发生在 5 天零 5 小时前”比“事件发生在 CDT 下午 1 点,现在是 5 天后 CST 下午 5 点”更重要。
我们以 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 完全退出并且之前使用香草 ToString 时使用它。
但是,使用此模式的时间最终会使用时间的日光状态,而不是当前的日光状态。这意味着时间看起来像:16:15:32 10/25/13 CDT
即使我们现在已经过渡到 CST。
它是时间的绝对量度。这迫使用户执行以下逻辑:“那是多久以前?现在是夏令时吗?如果是,则差异为 x。如果不是,我必须增加或减少一个小时?这会产生差异 y。”
15:15:32 10/25/13 CST
同时,在没有 DST 的情况下,将显示时间的相对度量。这迫使用户不进行任何转换,并允许他们更容易地计算该时间在上下文中的含义。
在具有多个日期的显示中,对整个集合执行绝对时间逻辑可能会变得很棘手。做一次很难做到正确。然而,像“posted 5 hours ago”这样友好的相对字符串也迫使他们自己解决日期和时间——这些信息仍然很重要。
折衷方案可能是在前 24 小时前发布空白小时/分钟,或者同时包含友好字符串和绝对时间——这些都是我见过的模式。
但是忽略这些,NodaTime 中是否有一种方法可以使时间具有特定的日光状态,以便在相对上下文中显示时间?