关于c#:使用Nodatime将DateTime从特定时区转换为UTC?

Convert DateTime from specific time zone to UTC using Nodatime?

好的,我有一个托管在中央标准时区的Web服务器。 IIS服务器配置为时区,因此每当在服务器上使用DateTime.Now或创建类型为Local的新DateTime时,它都处于中央时间。

问题是该网站是(国际)国内申请,我可以在美国或加拿大的任何地方拥有客户。该网站拥有的一个东西是用于安排约会的"调度程序"。我们决定易于开发,以UTC格式将所有DateTime值存储在数据库中,并且所有流入和流出API的流量也都是UTC。问题是当我在服务器端创建日期/时间值时,我经常遇到问题。

比方说,我需要以编程方式为服务器上太平洋标准时区的客户端创建约会,时间为上午8点。在过去,我做过这样的事情:

1
2
3
var appointment = new new DateTime(2015, 04, 17, 08, 00, 00, DateTimeKind.Unspecified)
var utcAppointment = TimeZoneInfo.ConvertTimeToUtc(appointment,
                        TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"))

我在我的程序中做了很多其他的日期/时间操作,我想要去Nodatime而不是。我知道我可以很容易地从Nodatime变量中获取UTC DateTime。我感到困惑的是如何在特定日期/时间为特定时区创建Nodatime变量?我看到的所有例子都与模式和阅读字符串或创建一个本质上是"现在"的Instant有关。我想做一些事情,比如使用现有的BCL DateTime对象,无论"Kind"如何,并将其转换为具有我设置的特定时区的Nodatime对象。

我认为Nodatime是一个很棒的图书馆,但阅读用户指南只会让我对转换进出BCL感到头疼。


What I am confused about is how to create a Nodatime variable for a specific time zone at a specific date/time?

这相对容易:

1
2
3
LocalDateTime local = new LocalDateTime(2015, 4, 17, 8, 0, 0);
DateTimeZone zone = DateTimeZoneProviders.Tzdb["America/Los_Angeles"];
ZonedDateTime zonedTime = local.InZoneLeniently(zone);

"宽大"部分真的取决于你想要发生什么,如果早上8点结果被跳过或模棱两可 - 在这种情况下不会发生,但这是要记住的事情。 Noda Time允许您以各种方式处理此问题 - 用户指南详细介绍。

请注意,如果您更愿意考虑进行转换的区域,则可以使用zone.AtLeniently(local) - 它们绝对等效。