23

私が引き継いだasp.net-mvc Webサイトがあり、人々が情報と時間を入力するページページがあります(ローカルタイムゾーンを含む)。データベースは開始時刻、終了時刻、およびタイムゾーンを保持しています。選択するリストを取得するコードは次のとおりです。

  static private IEnumerable<SelectListItem> GetTimeZones(string selected)
    {
        var timeZoneNames = TimeZoneInfo.GetSystemTimeZones()
            .Where(tz => tz.DisplayName.Contains("London")
                         || tz.DisplayName.Contains("Hong Kong")
                         || tz.DisplayName.Contains("Mumbai")
                         || tz.DisplayName.Contains("Eastern Time"))
            .ConvertAll(tz => tz.DisplayName).ToList();

        var items = new List<SelectListItem>();
        foreach (var item in timeZoneNames)
        {
            var slItem = new SelectListItem();
            slItem.Text = item;
            slItem.Value = item;
            slItem.Selected = item == selected;
            items.Add(slItem);
        }

        return items;
    }

したがって、TimeZoneInfo.GetSystemTimeZones() から返された完全な文字列を格納するだけです。

このアプローチに欠陥はありますか? ここを読んで、これがマシンからローカルに発生することを少し心配しています。異なるマシンが異なる設定を持っている場合と同じです。また、すべてが UTC または GMT などとしてリストされているかどうかを把握しようとしています。. より良い提案はありますか?たとえば、Web サイトで UTC への変換を行い、データベース内のすべての時刻を正規化する必要がありますか?

4

1 に答える 1

36

によって返された ID を保存する必要がありますTimeZoneInfo.Id。それが識別子です -タイムゾーンを識別するための文字列です。表示名を使用することは、文化によって異なる可能性があり、安定している可能性が低いため、非常に悪い考えです。

次に、 を使用TimeZoneInfo.FindSystemTimeZoneByIdして ID からゾーンを取得できます。

確かに、タイムゾーンの処理にはTZDBを好みますが、それは別の問題です:)

于 2012-07-20T13:34:33.460 に答える