2013-09-27 64 views
1

我想使用Nodatime編程世界時鐘,並且我已經在網上搜索了關於如何使用該庫的示例,並且我已閱讀文檔,說Instant類只是一些「滴答滴答」,因爲一些任意時代的Unix紀元,對應於1970年1月1日午夜的UTC。那麼,我憑經驗猜測,如果我使用GMT作爲即時值,那麼我可以用它計算每個時區的時間值(創建世界時鐘),並且它可以工作。我有的問題是,我不知道從當地時間計算GMT時間(或GMT時間)的簡單方法,我的時區是「America/Mexico_City」,所以我的問題是,有沒有捷徑已經在Nodatime中定義從當地時間獲得GMT時間,或者另一方面,是否有一種簡單的方法來實現「即時GetInstantGMT()」功能(該功能必須計算日光節約時間問題) ?從本地時間轉換爲格林尼治標準時間(使用nodatime的世界時鐘應用程序)

回答

1

如果你只是在尋找的「當前」的瞬間,例如代表現在,然後使用:

Instant now = SystemClock.Instance.Now; 

稱它是「GMT瞬間」是多餘的,因爲Instant類型是代表通用時刻不考慮時區。它(大部分)等同於UTC - 與GMT基本相同。換句話說,您無法創建Instant,即不是 GMT。

另一種方式來思考一個Instant是因爲如果它是一個DateTime.Kind財產被永久固定DateTimeKind.Utc並不能代表任何東西。

而且,這依賴於你的應用程序如何構建,你可能會發現使用IClock接口來代替:

IClock clock = SystemClock.Instance; 
Instant now = clock.Now; 

這將使你的單元測試過程中更換系統時鐘用假時鐘。

關於如何從一個特定的本地時間去一個Instant,你會做這樣的事情:

LocalDateTime ldt = new LocalDateTime(2013, 1, 1, 0, 0, 0); 
DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/Mexico_City"]; 
ZonedDateTime zdt = ldt.InZoneLeniently(tz); 
Instant instant = zdt.ToInstant(); 

注意,我在轉換中使用InZoneLeniently。這使得關於如何從當地時間進行翻譯的某些假設可能無效或模糊,因爲daylight saving time。這可能是可以接受的,或者你可能更喜歡使用InZoneStrictly這會拋出異常,或者InZone,它允許你傳遞一個解析器的功能,所以你可以提供你自己的邏輯。

相關問題