4

我有一种情况,相对时间对用户来说比绝对时间更重要。因此,能够快速说出“事件发生在 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 中是否有一种方法可以使时间具有特定的日光状态,以便在相对上下文中显示时间?

4

1 回答 1

4

但是,使用此模式的时间最终会使用时间的日光状态,而不是当前的日光状态。这意味着时间看起来像:16:15:32 10/25/13 CDT,即使我们现在已经过渡到 CST。

是的,它应该。尽管日期/时间出现在 CDT 中,但使用 CST 显示日期/时间会很奇怪,IMO。

因此,能够快速说出“事件发生在 5 天零 5 小时前”比“事件发生在 CDT 下午 1 点,现在是 5 天后 CST 下午 5 点”更重要。

在这种情况下,在我看来,您根本不应该显示日期/时间。将两个ZonedDateTime值都转换为Instant,取Duration它们之间的值,然后你可以看到它是 5 天 5 小时前。(我不记得我们提供了多少帮助 - 您可能需要手动获取滴答数并除以NodaConstants.TicksPerStandardDay等。看看DurationPattern它是否有帮助。)

或者,如果您真的想显示日期和时间,但仍然能够轻松地从心理上提取它们之间的差异,则可以使用以下两个选项:

  • 改为使用OffsetDateTime;在那里你可以强制偏移量相同,尽管我仍然认为显示一个偏移量实际上不是你观察时间所在区域的当前偏移量会很奇怪。或者你可以只显示相关的偏移量时间,所以 CST 为 -5,CDT 为 -4。
  • 只需以 UTC 显示所有内容,这样夏令时转换就无关紧要了。

请注意,您不能在两个值之间获得月份ZonedDateTime,因为我们正在处理经过的时间(持续时间)而不是日历逻辑算术(期间)。

于 2013-11-06T15:53:31.903 回答