簡體   English   中英

使用Nodatime將DateTime從特定時區轉換為UTC?

[英]Convert DateTime from specific time zone to UTC using Nodatime?

好的,我有一個托管在中央標准時區的Web服務器。 IIS服務器配置為時區,因此每當在服務器上使用DateTime.Now或創建類型為Local的新DateTime時,它都處於中央時間。

問題是該網站是(國際)國內申請,我可以在美國或加拿大的任何地方擁有客戶。 該網站擁有的一個東西是用於安排約會的“調度程序”。 我們決定易於開發,以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感到頭疼。

我感到困惑的是如何在特定日期/時間為特定時區創建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允許您以各種方式處理此問題 - 用戶指南詳細介紹。

請注意,如果您更願意考慮進行轉換的區域,則可以使用zone.AtLeniently(local) - 它們絕對等效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM