C# 从本地时间转换为GMT(使用节点时间的世界时钟应用程序)

C# 从本地时间转换为GMT(使用节点时间的世界时钟应用程序),c#,.net,datetime,data-conversion,nodatime,C#,.net,Datetime,Data Conversion,Nodatime,我正在尝试使用Nodatime编写一个世界时钟,我在网上搜索了有关如何使用该库的示例,我也阅读了文档,它说Instant类只是一些“滴答”的数字,因为一些任意的纪元是Unix纪元,对应于1970年1月1日UTC的午夜。好吧,我根据经验猜测,如果我用一个GMT值作为一个瞬间,那么我可以用它计算每个时区的时间值(创建世界时钟),它就起作用了。我的问题是,我不知道从当地时间计算GMT时间(或GMT瞬间)的简单方法,我的时区是“America/Mexico_City”,所以我的问题是,在Nodatime

我正在尝试使用Nodatime编写一个世界时钟,我在网上搜索了有关如何使用该库的示例,我也阅读了文档,它说Instant类只是一些“滴答”的数字,因为一些任意的纪元是Unix纪元,对应于1970年1月1日UTC的午夜。好吧,我根据经验猜测,如果我用一个GMT值作为一个瞬间,那么我可以用它计算每个时区的时间值(创建世界时钟),它就起作用了。我的问题是,我不知道从当地时间计算GMT时间(或GMT瞬间)的简单方法,我的时区是“America/Mexico_City”,所以我的问题是,在Nodatime中是否已经定义了从当地时间获取GMT时间的捷径,或者另一方面,是否有一种简单的方法来实现“Instant GetInstantGMT()”函数(该函数必须考虑日光节约时间问题)?

如果您只是在寻找“当前”瞬间,例如现在表示的,请使用:

Instant now = SystemClock.Instance.Now;
将其称为“GMT instant”是多余的,因为
instant
类型表示时间上的通用时刻,而不考虑时区。它(大部分)等同于UTC,本质上与GMT相同。换句话说,您无法创建不是GMT的
instant

另一种思考
即时
的方法是,它是一个
日期时间
,其
.Kind
属性被永久固定为
日期时间种类.Utc
,不能代表任何其他内容

此外,根据应用程序的具体架构,您可能会发现使用
IClock
界面非常有用:

IClock clock = SystemClock.Instance;
Instant now = clock.Now;
这将允许您在单元测试期间用假时钟替换系统时钟

关于如何从特定的本地时间转到
即时时间
,您可以这样做:

LocalDateTime ldt = new LocalDateTime(2013, 1, 1, 0, 0, 0);
DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/Mexico_City"];
ZonedDateTime zdt = ldt.InZoneLeniently(tz);
Instant instant = zdt.ToInstant();

请注意,我在转换过程中使用了
inzonereliely
。这会对如何从本地时间进行转换做出某些假设,这些假设可能由于以下原因而无效或不明确。这可能是可以接受的,或者您可能更喜欢使用
inzonestrilly
,这将引发异常,或者使用
InZone
,这允许您ss一个解析器函数,这样您就可以提供自己的逻辑。

如果您只是在寻找“当前”瞬间,这样表示现在,那么使用:

Instant now = SystemClock.Instance.Now;
将其称为“GMT instant”是多余的,因为
instant
类型表示时间上的通用时刻,而不考虑时区。它(大部分)等同于UTC,本质上与GMT相同。换句话说,您无法创建不是GMT的
instant

另一种思考
即时
的方法是,它是一个
日期时间
,其
.Kind
属性被永久固定为
日期时间种类.Utc
,不能代表任何其他内容

此外,根据应用程序的具体架构,您可能会发现使用
IClock
界面非常有用:

IClock clock = SystemClock.Instance;
Instant now = clock.Now;
这将允许您在单元测试期间用假时钟替换系统时钟

关于如何从特定的本地时间转到
即时时间
,您可以这样做:

LocalDateTime ldt = new LocalDateTime(2013, 1, 1, 0, 0, 0);
DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/Mexico_City"];
ZonedDateTime zdt = ldt.InZoneLeniently(tz);
Instant instant = zdt.ToInstant();
请注意,我在转换过程中使用了
inzonereliely
。这会对如何从本地时间进行转换做出某些假设,这些假设可能由于以下原因而无效或不明确。这可能是可以接受的,或者您可能更喜欢使用
inzonestrilly
,这将引发异常,或者使用
InZone
,这允许您ss一个解析器函数,以便您可以提供自己的逻辑