簡體   English   中英

使用可移植類庫將東部標准時間字符串轉換為UTC日期時間

[英]Convert Eastern Standard Time String to UTC DateTime using Portable Class Library

我有一個字符串,我知道這是東部標准時間:

"8/14/2013 5:51am"

我想在我的可移植類庫中將此轉換為UTC DateTime,同時考慮到夏令時。 我發現可移植類庫沒有以下方法:

TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")

在可移植類庫中可以這樣做嗎? 如果沒有,鑒於字符串中沒有時區信息,如何在普通的類庫中執行此操作?

TimeZoneInfo不能完全移植。 它存在,但是沒有數據可以備份,因此只能提供對UTC和本地時區的訪問。 它無法通過其ID解析區域。

幸運的是, Noda Time具有便攜式版本,但是您將需要使用IANA區域名稱,而不是Windows區域名稱。 有關更多詳細信息,請參見時區標簽Wiki 另外,請確保您已閱讀NodaTime作為PCL的限制

using NodaTime;
using NodaTime.Text;

LocalDateTimePattern pattern = LocalDateTimePattern
                                 .CreateWithInvariantCulture("M/dd/yyyy h:mmtt");
LocalDateTime ldt = pattern.Parse("8/14/2013 5:51am").Value;

DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/New_York"];
ZonedDateTime zdt = tz.AtLeniently(ldt);
Instant instant = zdt.ToInstant();

Debug.WriteLine(instant.ToString());  // 2013-08-14T09:51:00Z   (UTC)

// if you need it as a DateTime
DateTime utc = instant.ToDateTimeUtc();

PCL公開了TimeZoneInfo結構,但未包含所需的功能,這意味着您可能必須自己編寫時區轉換代碼。 如果您總是將一個時區轉換為另一個時區,這應該還不錯,但是如果您的源時區分布在世界各地,那將是一個挑戰。

起初,我將推薦Jon Skeet's等。 等, Noda Time ,但它們列出了一個重要的限制 ,並且與您發現的限制相同:

為可移植類庫提供的.NET API比完整的桌面版本有更多限制。 當前,這為Noda Time帶來了相對較少的挑戰,但有一個重大例外:TimeZoneInfo。 雖然我們可以通過TimeZoneInfo.StandardName而不是其ID檢測本地時區的TZDB等效項(就像我們通常所做的那樣),但是我們無法通過ID來獲取任意時區,也不能要求特定的調整規則時區。

如果Noda Time無法做到,那么我認為您可以手動進行計算了。

暫無
暫無

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

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