5

asp.net/c#データベースにサービスを提供するために、かなり大きな webapp を作成しMSSQL 2008 r2ています。プログラムは、date/time文字列 (ISO 日付形式) をDateTime使用する場所に変換し、後で として保存するsmalldatetime必要がありsqlます。

文字列が に変換されると、不思議なことdatetimesに anhourが結果に追加されます。英国にいるため、夏時間(現在アクティブ)の対象であることは理解していますが、確かにdatetime.convert メソッドはこれを理解していますか? 文字列に戻すと、結果は期待どおりになります。

私は問題を説明するために小さなプログラムを書きました (正気を保つために ISO 以外の日付も含めます):

class Program
{


    static void Main(string[] args)
    {
        //BB();
        //Dist();
        DateTime d1 = new DateTime();
        DateTime d2 = new DateTime();
        string d1s = "2010-09-13T09:30:01Z";
        string d2s = "2010-09-13 09:30:01";

        d1 = Convert.ToDateTime(d1s);
        d2 = Convert.ToDateTime(d2s);

        Console.WriteLine("d1s:{0} d1:{1} ", d1s, d1);
        Console.WriteLine("d2s:{0} d2:{1} ", d2s, d2);

        d1s = d1.ToString("u"); d2s = d2.ToString("u");

        Console.WriteLine("\nd1: {0}", d1s);
        Console.WriteLine("d2: {0}", d2s);

        d1 = Convert.ToDateTime(d1s);
        d2 = Convert.ToDateTime(d2s);

        Console.WriteLine("\nd1s:{0} d1:{1} ", d1s, d1);
        Console.WriteLine("d2s:{0} d2:{1} ", d2s, d2);

        Console.Read();
    }
}

プログラムを実行したときに得られる結果は次のとおりです。

d1s:2010-09-13T09:30:01Z d1:13/09/2010 10:30:01
d2s:2010-09-13 09:30:01 d2:13/09/2010 09:30:01

d1: 2010-09-13 10:30:01Z
d2: 2010-09-13 09:30:01Z

d1s:2010-09-13 10:30:01Z d1:13/09/2010 11:30:01
d2s:2010-09-13 09:30:01Z d2:13/09/2010 10:30:01
Done

これは正しい動作ですか?私はばかですか?日時を文字列に変換すると、正確な文字列を日時に戻すと元の入力が返されると予想していました。これが正しい動作である場合、一貫した結果を得る方法についてのアイデアはありますが、まだ使用していConvert.ToDateTime()ますか?

どうもありがとう。

4

1 に答える 1

11

datetime の末尾の「Z」は「Zulu」(UTC/GMT に相当)を意味します。デフォルトでは、文字列を最後に変換すると、ローカル時間に変換されます(この場合は + 1 時間)。

「Z」がないと、.NET は日付が既に正しい形式であると想定し、時間を追加しません。

日時を文字列にフォーマットし直す場合、「U」のフォーマット文字列を使用しています。これは、UTC 時間であり、そのようにフォーマットする必要があることを .NET に伝えています。したがって、末尾に「Z」が追加されます。日付時刻に戻すと、ローカルにするためにさらに時間が追加されます。

明確にするために:

d1: UTC 文字列として開始 -> 現地時間 (+1 時間) -> UTC 文字列 -> 現地時間 (+1 時間)

d2: ローカル文字列として開始 -> ローカル時間 (変更なし) -> UTC 文字列 -> ローカル時間 (+ 1 時間)

于 2010-09-13T11:49:16.567 に答える