gpt4 book ai didi

c# - 野田时间倒计时

转载 作者:行者123 更新时间:2023-11-30 22:01:41 25 4
gpt4 key购买 nike

我已经写了一个应用程序来显示距离下一次大型行业贸易展的剩余时间。
(在撰写本文时大约是两年后)

我开始使用标准 DateTime类,但很快遇到了处理每个月不同天数的问题,2016 年是闰年,包含 Leap Day 、夏令时等

幸运的是我发现了 NodaTime . (感谢@JonSkeet)

幸运的是,我习惯使用 DateTime 的方式并不适用,我真的很难弄清楚如何获得剩余时间。 (周围没有很多例子)

例如,以下代码不起作用,因为您不能减去 instant。来自LocalDateTime :

void example()
{
DateTime DT = Convert.ToDateTime("09/12/2016 10:00AM");

LocalDateTime NodaLocalDateTime = new LocalDateTime(
DT.Year, DT.Month, DT.Day, DT.Hour, DT.Minute, 0);

Period P = NodaLocalDateTime - SystemClock.Instance.Now;
}

那么问题就变成了:

如何获得从现在到某个日期的剩余时间?

最佳答案

要确定两个事件之间的“日历”时间量,您需要 Period,正如您已经发现的那样。但是,处理本地日期和时间。

要确定两个事件之间的“日历中性”时间量,您可以使用 InstantDuration - 但是您无法显示月数离开了。

这两种方法都有缺点,但基本上它们是时间运作方式的基础。如果您使用本地时间方法,那么您会发现当您经过 DST 转换时,时间量会向后或向前跳一个小时。如果您使用即时方法,则限制为天/月/小时/分钟等 - 而不是几个月。

两者之间的一个选择是使用 LocalDateTimePeriod,但将事件和当前时间都锚定在 UTC 中。这样就永远不会出现中断,因为 UTC 实际上是一个不变的基线。这也意味着无论您在世界的哪个地方查看计数器(或托管代码,具体取决于您打算做什么),您都将始终显示相同数量的“剩余时间”。

如果您想了解有关为什么您无法在两个 ZonedDateTime 值之间获得 Period 的更多详细信息,我可以想到以下示例从根本上是有问题的。最重要的是,日历算术和时区并不能很好地结合在一起......

只是给出一些实际的代码,我会是这样的:

public sealed class EventCountdown
{
private readonly LocalDateTime eventTimeUtc;
private readonly IClock clock;

// It's probably most convenient to express the event time with the time zone
// in which it occurs. You could easily change this though.
public EventCountdown(ZonedDateTime zonedEventTime, IClock clock)
{
this.eventTimeUtc = zonedEventTime.WithZone(DateTimeZone.Utc).LocalDateTime;
this.clock = clock;
}

public Period GetPeriodRemaining()
{
return Period.Between(clock.Now.InUtc().LocalDateTime, eventTimeUtc);
}
}

请注意,在 Noda Time 2.0 中,IClock.Now 属性正在更改为 GetCurrentInstant 方法...但在那种情况下,您可能会使用 ZonedClock 在 UTC 上调用 GetCurrentLocalDateTime

关于c# - 野田时间倒计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27516771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com