2009-08-30 13 views
2

私はasp.net mvcを使用していますが、私はこのサイトにあるメソッドを使用しています。TimeZoneDisplayNameでTimeZoneByIdを見つけることができますか?

How do I enumerate all time zones in .NET?

だから、これは私がやっものです。私は結果をユーザーに表示します。ユーザーがタイムゾーンを選択すると、データベースに表示名が保存されました。

しかし、私は今実際にタイムゾーン変換をしようとしています。

私はこのようにしようとしています(これが正しい方法であるかどうかはわかりません)。

TimeZoneInfo zoneInfo = TimeZoneInfo.FindSystemTimeZoneById(id); 
    var time = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now, zoneInfo); 

だから私は、これは、それがシステムの時刻とユーザーのタイムゾーンを取得し、ローカルのUTC時刻に変換し、この情報を使用して正しいことだと思います。

これが正しいとすれば、私がやったことは正しいとは言えませんが、私が直面している問題はどうやってIDを取得するのですか?

私はIDを見つける方法がありません。私はデータベース内のDisplayNameの代わりにIDを保存したいと思っていますが、DisplayNameからIDを特定する方法はわかりません。

おかげ

答えて

4

はおそらく辞書に起動時にそれらをキャッシュ:

static readonly Dictionary<string, TimeZoneInfo> zones 
    = TimeZoneInfo.GetSystemTimeZones().ToDictionary(z => z.DisplayName); 

を(あなたが安全なようにしたい場合やzones.TryGetValue(displayName, out zone)経由)するとzones[displayName]としてフェッチ。

+0

うん、それは線形方法でそれらをフェッチするよりもはるかに良いアイデアだが。 –

+0

@ジョン - 私はあなたのポイントは、 "表示名の代わりにIDを保存することは良いアイデアだろう"と思うが有効です。個人的に私はあなたの答えを保持していただろう...それは有効なポイントを作る。 –

+0

ああ、あなたはその鍵になるだろうか?この場合、DisplayNameはキーであり、TimeZoneInfoはそれ以外のすべてです。このようにすれば、foreachループを高速化することができますか?より少ないコードは言うまでもありません。 – chobo2

1

あなたはLINQを使用している場合は、これを行うことができます:

var tz = "(UTC-06:00) Central Time (US & Canada)"; 
var tzi = TimeZoneInfo.GetSystemTimeZones().Single (t => t.DisplayName == tz); 
Console.WriteLine("Id: {0} | DisplayName: {1} | SupportsDaylightSavingTime: {2}" 
    , tzi.Id, tzi.DisplayName, tzi.SupportsDaylightSavingTime); 
関連する問題