使用 Nodatime 将 DateTime 从特定时区转换为 UTC?

Convert DateTime from specific time zone to UTC using Nodatime?

好的,我有一个托管在中央标准时区的 Web 服务器。 IIS 服务器配置为时区,因此无论何时在服务器上使用 DateTime.Now 或创建类型为本地的新 DateTime,它都是中部时间。

问题是该网站是一个(国际)国家应用程序,我可以在美国或加拿大的任何地方拥有客户。该网站的其中一项功能是 "Scheduler" 用于安排约会的各种功能。为了便于开发,我们决定以 UTC 格式将所有 DateTime 值存储在数据库中,并且所有进出 API 的流量也采用 UTC 格式。问题是当我在服务器端创建 date/time 值时,我经常 运行 遇到问题。

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

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

我在我的程序中还做了很多其他 date/time 操作,我正在考虑转而使用 Nodatime。我知道我可以很容易地从 Nodatime 变量中获取 UTC DateTime。我感到困惑的是如何在特定 date/time 为特定时区创建 Nodatime 变量?我看到的所有示例都与模式和读取字符串或创建本质上是 "Now" 的 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?

这相对容易:

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

"leniently" 部分实际上取决于您希望在上午 8 点被跳过或不明确时发生什么情况 - 在这种情况下不会发生这种情况,但需要牢记这一点。 Noda Time 可让您以多种方式处理此问题 - user guide 有更详细的介绍。

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