2012-01-21 1 views
4

OlsonとWindows時刻の間の変換IDは、SOに何度も現れています。多くの人々がこのタスクのためにJon SkeetのNoda Timeを提案しています。Noda Timeを使用したOlsonタイムゾーンIDからWindows標準形式へ

Googleコードページには2つの間で変換する機能があると書かれていますが、これを行う方法の詳細はわかりません。

誰でも正しい方向に向けることができますか?オルソンへのWindowsから

+0

コード内に1つもありません。 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; 
} 

注:WindowsのタイムゾーンのIDを返します。それはそう

この方法のためのより適切なインターフェイスは次のようになります。

string MapTimeZoneId(string providerZoneId); 

その後、両方の実装を正しく行うことができます。私はあなたがノーダタイムGoogleグループにこの質問を置くことができると思います。

ここでは、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を完成させようとしている際にはご留意ください。

関連する問題