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

时间:2015-04-17 19:56:50

标签: c# datetime nodatime

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

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

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

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感到头疼。

1 个答案:

答案 0 :(得分:9)

  

我感到困惑的是如何在特定日期/时间为特定时区创建Nodatime变量?

这相对容易:

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让您以各种方式处理这一问题 - user guide详细介绍。

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

相关问题