4

最近、.net のタイム ゾーン対応 Web アプリケーションでタイム ゾーンをいじっています。タイムゾーンを処理するための次のソリューションを思い付きました。

私の解決策は次のとおりです。

  • ユーザー プロファイルに、ユーザーがいるタイム ゾーンを保存します。
  • Web サーバーで、UTC との間のすべての変換を行います。
  • 日付を UTC として DB に保存します。

私の質問は:

  1. これが .net での最善のアプローチだと思いますか?
  2. UTC で datetime2 を使用するだけで十分ですか、それともクライアントの時刻をオフセット付きで DB に保存する必要がありますか (基本的に 10-10-2012 4:00:00 と 10-10-2012 00:00:00 4:00)?
  3. 余談ですが、DST をまたぐジャンプはサーバー コードで処理されますが、DB 上の SP などにオフセットを渡すと、DST が正しく処理されないことに気付く人もいるでしょう。これに関するアイデアはありますか?

時間変換のサンプル コードを次に示します。

    private TimeZoneInfo GetTimeZoneInfo()
    {
        var timeZone = TimeZoneDropdown.SelectedValue;

        switch (timeZone)
        {
            case "Eastern":
                return TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
            case "Central":
                return TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
            case "Mountain":
                return TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
            case "Pacific":
                return TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
            case "Alaskan":
                return TimeZoneInfo.FindSystemTimeZoneById("Alaskan Standard Time");
        }

        return TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
    }

    public DateTime ConvertLocalDateTimeToUtc(DateTime dateTime)
    {
        var timeZone = GetTimeZoneInfo();

        return TimeZoneInfo.ConvertTimeToUtc(DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified), timeZone);
    }

    public DateTime ConvertUtcToLocalDateTime(DateTime dateTime)
    {
        var timeZone = GetTimeZoneInfo();

        return TimeZoneInfo.ConvertTimeFromUtc(DateTime.SpecifyKind(dateTime, DateTimeKind.Utc), timeZone);
    }
4

1 に答える 1

1

現在のアプローチは間違っていませんが、オフセットを追跡することで改善できます。

オフセットについて話すとき、タイムゾーンに関連付けられていると考えているようです。ただし、ほとんどのタイム ゾーンには、標準時用と夏時間用の 2 つの異なるオフセットがあることに注意してください。両方の Microsoft タイム ゾーン ID の文字列にはまだ "Standard" が含まれているため、これが混乱の一部である可能性があります。しかし、TimeZoneInfoあなたが取り組んでいる は、実際には標準オフセットと昼光オフセットの両方を追跡しています。

オフセットを個々の日付と時刻に関連付ける必要があります。そしてDateTimeOffset、.Net のクラスとdatetimeoffsetSQL Server のデータ型を使用してそれを行います。

これらを一貫して使用すると、UTC との間で変換する必要がなくなります。

于 2013-06-09T19:34:15.763 に答える