2012-01-21 27 views
4

Olson和Windows時間標識之間的轉換在SO上出現了多次;許多人建議Jon Skeet的Noda Time完成這項任務。使用野田時間的Olson時區標識轉換爲Windows標準格式

雖然谷歌代碼頁面聲明有一個函數可以在兩者之間進行轉換,但我無法在如何執行此操作的任何地方找到細節。

任何人都可以指向正確的方向嗎?從Windows到奧爾森

+0

在代碼中沒有看到一個。您可以從Olson ids或Windows TimeZoneInfo對象創建'DateTimeZone'對象,但無法轉換AFAIK。 –

+1

現在可以使用Noda Time 1.1.0來完成。 [我在這裏發佈了轉換函數。](http://stackoverflow.com/q/17348807/634824) –

回答

0

TzdbTimeZoneProvider支持轉換,但BclTimeZoneProvider(提供用於Windows時區)沒有正確執行MapTimeZoneId方法和界面似乎是錯誤的...

這裏是TzdbTimeZoneProvider實現:

public string MapTimeZoneId(TimeZoneInfo zone) 
{ 
    string str; 
    this.windowsIdMap.TryGetValue(zone.Id, out str); 
    return str; 
} 

注:windowsIdMap是一本字典

這是在執行BclTimeZoneProvider

public string MapTimeZoneId(TimeZoneInfo timeZone) 
{ 
    return timeZone.Id; 
} 

注意:它只是返回窗口時區的id。

看來這種方法更正確的接口將是:

string MapTimeZoneId(string providerZoneId); 

那麼這兩種實現可以正確完成。我想你可以把這個問題放在Noda Time谷歌組織。

現在,您可以查看TzdbTimeZoneProvider以查找如何從Olson映射到Windows tz(通過windowsIdMap值進行簡單迭代)。

+0

實現很好 - MapTimeZoneId的目的是將*從* Windows *映射到*提供者特定的ID。這就是爲什麼它需要一個'TimeZoneInfo'而不是一個字符串。 –

+0

@JonSkeet:謝謝你的澄清,我現在看到。 –

1

不,不幸的是,我們現在還沒有映射方式(Windows到Olson)。

所有的「提供者」界面的略在空中現在:

  • 即使在當前的代碼,有API的變化,我們要進行,部分使用它的可測試性
  • 使代碼
  • Unicode CLDR映射已在1.x和2.x之間更改,因此現在每種方式都有多個映射(IIRC)。

換句話說:對不起,我們目前暫不支持,但是在試圖完成1.0 API時我們會牢記它。

相關問題