質問

2 つのプロパティがどのように機能するかの原理は一体何なのか、ずっと疑問に思っていました。2 つ目は普遍的であり、基本的にタイムゾーンを扱わないことはわかっていますが、誰かがそれらがどのように機能するのか、どのシナリオでどれを使用する必要があるのか​​詳しく説明できますか?

役に立ちましたか?

解決

DateTime.UtcNow 協定世界時 (グリニッジ標準時タイム ゾーンとも呼ばれます) での日付と時刻が表示されます。基本的にイギリスのロンドンにいる場合と同様ですが、夏の間は異なります。 日付時刻.今 現在のロケールにいる人に表示される日付と時刻を示します。

使用することをお勧めします DateTime.Now 人間に日付を表​​示するときはいつでも、そうすることで、人間は表示される値に慣れ、自分の時計や時計で見ているものと簡単に比較できるようになります。使用 DateTime.UtcNow (クライアントサーバー モデルで) 日付を保存したり、後で計算に使用したりする場合、サーバーとは異なるタイム ゾーンにあるクライアントによって、またはサーバー間のクライアントによって計算が混乱することはありません。

他のヒント

とてもシンプルなので、聴衆が何なのか、どこに住んでいるのかによって変わると思います。

UTC を使用しない場合は、 しなければならない 日付と時刻を表示する相手のタイムゾーンを知っておいてください。そうしないと、実際にはその人が住んでいる午後 5 時に何かが起こったのに、システムまたはサーバー時間の午後 3 時に何かが起こったと伝えることになります。

を使用しております DateTime.UtcNow なぜなら、当社には世界中の Web 視聴者がいるし、すべてのユーザーに自分が住んでいるタイムゾーンを示すフォームに記入するようしつこく要求したくないからです。

また、地球上のどこに住んでいても時刻が「同じ」になるまで投稿が十分に経過するまで、相対時刻 (2 時間前、1 日前など) も表示されます。

パフォーマンスの違いにも注目してください。DateTime.UtcNow は DateTime.Now よりも約 30 倍高速です。これは、DateTime.Now が内部的に多くのタイム ゾーン調整を行っているためです (これは Reflector を使用して簡単に確認できます)。

したがって、相対時間の測定には DateTime.Now を使用しないでください。

.NET で理解すべき主な概念の 1 つは次のとおりです。 どのタイムゾーンにいても地球上で。したがって、次のように変数をロードすると、 DateTime.Now または DateTime.UtcNow -- 割り当ては同一です。* DateTime オブジェクトは、ユーザーがどのタイムゾーンにいるかを認識しており、割り当てに関係なくそれを考慮します。

の有用性 DateTime.UtcNow 夏時間の境界を越えて日付を計算する場合に便利です。つまり、夏時間に参加している場所では、正午から翌日の正午までが 25 時間になる場合もあれば、正午から翌日の正午までが 23 時間になる場合もあります。時刻 A と時刻 B からの時間数を正確に判断したい場合は、まずそれぞれを UTC 相当の時間に変換してから、時刻を計算する必要があります。 TimeSpan.

これは、 私が書いたブログ投稿 さらに説明すると TimeSpan, 、このトピックに関するさらに広範な MS 記事へのリンクが含まれています。

*説明:どちらの割り当てでも現在時刻が保存されます。2 つの変数を 1 つを介してロードする場合 DateTime.Now() そしてもう一つは経由 DateTime.UtcNow()TimeSpan GMT から数時間離れたタイムゾーンにいると仮定すると、2 つの差は数時間ではなくミリ秒になります。以下に示すように、それらを印刷すると、 String 値には異なる文字列が表示されます。

これは良い質問です。.Net がさまざまな環境でどのように動作するかについてもう少し詳しく説明するために、この記事を復活させます。 Kind 価値観。@Jan Zichが指摘しているように、これは実際には非常に重要なプロパティであり、使用するかどうかに応じて設定が異なります。 Now または UtcNow.

内部的には日付は次のように保存されます。 Ticks これは(@Carl Cameraの答えに反して)使用するかどうかによって異なります Now または UtcNow.

DateTime.UtcNow 他の言語と同じように動作します。設定します Ticks GMT ベースの値に変換します。また、 KindUtc.

DateTime.Now を変更します Ticks に値を付ける GMT タイムゾーンのあなたの時刻だったらどうなるでしょうか. 。また、 KindLocal.

6 時間遅れている場合 (GMT-6)、6 時間前の GMT 時刻が表示されます。.Netは実際には無視します Kind そして、「今」であるはずなのに、この時間をあたかも 6 時間前のことのように扱います。これは、 DateTime 次に、タイムゾーンを変更して、それを使用してみてください。

異なる 'Kind' 値を持つ DateTime インスタンスには互換性がありません。

いくつかのコードを見てみましょう...

    DateTime utc = DateTime.UtcNow;
    DateTime now = DateTime.Now;
    Debug.Log (utc + " " + utc.Kind);  // 05/20/2015 17:19:27 Utc
    Debug.Log (now + " " + now.Kind);  // 05/20/2015 10:19:27 Local

    Debug.Log (utc.Ticks);  // 635677391678617830
    Debug.Log (now.Ticks);  // 635677139678617840

    now = now.AddHours(1);
    TimeSpan diff = utc - now;
    Debug.Log (diff);  // 05:59:59.9999990

    Debug.Log (utc <  now);  // false
    Debug.Log (utc == now);  // false
    Debug.Log (utc >  now);  // true

    Debug.Log (utc.ToUniversalTime() <  now.ToUniversalTime());  // true
    Debug.Log (utc.ToUniversalTime() == now.ToUniversalTime());  // false
    Debug.Log (utc.ToUniversalTime() >  now.ToUniversalTime());  // false
    Debug.Log (utc.ToUniversalTime() -  now.ToUniversalTime());  // -01:00:00.0000010

ここでわかるように、比較関数と数学関数は、互換性のある時間に自動的に変換されません。の Timespan 本来は1時間近くかかるはずだったのに、6時間近くかかってしまった。「utc < now」は true であるはずですが (念のために 1 時間を追加しました)、それでも false でした。

また、単に世界時に変換するという「回避策」も見られます。 Kind 同じではない。

質問に対する私の直接の答えは、それぞれをいつ使用するかについての受け入れられた回答の推奨事項に同意します。常にそうすべきです 試す 一緒に働く DateTime を持つオブジェクト Kind=Utc, ただし、i/o (表示および解析) 中は除きます。これは、ほぼ常に使用する必要があることを意味します DateTime.UtcNow, ただし、表示するためだけにオブジェクトを作成し、すぐに破棄する場合は除きます。

DateTime にはタイムゾーンがわかりません。常に現地時間にいると想定されます。 UtcNow 「時間から自分のタイムゾーンを引く」という意味だけです。

タイムゾーンを認識する日付を使用したい場合は、次を使用します。 日付時刻オフセット, 、タイムゾーン付きの日付/時刻を表します。私はそれを苦労して学ばなければなりませんでした。

上記のポイントに少しだけ追加します。DateTime 構造体には、あまり知られていないフィールドも含まれています。 親切 (少なくとも、私は長い間そのことを知りませんでした)。これは基本的に、時間が現地時間であるか UTC であるかを示す単なるフラグです。現地時間の UTC からの実際のオフセットは指定しません。それは構造体がどのような意図で構築されたかを示すという事実に加えて、構造体の構築方法にも影響を与えます。 ToUniversalTime() そして ToLocalTime() 仕事。

質問に対する「単純な」答えは次のとおりです。

日付時刻.今 を返します 日付時刻 現在のシステム時刻を表す値 (システムが実行されているタイムゾーンに関係なく)。の 日付時刻.種類 財産は DateTimeKind.Local

DateTime.UtcNow を返します 日付時刻 現在の協定世界時 (別名 UTC) を表す値。システムのタイム ゾーンに関係なく同じになります。の 日付時刻.種類 財産は DateTimeKind.UTC

パーティーには少し遅れましたが、次の 2 つのリンク (4guysfromrolla) が非常に役立つことがわかりました。

協定世界時 (UTC) を使用した日付/時刻値の保存

異なるタイムゾーンにまたがる日付と時刻を保存および表示するためのアドバイス

DateTime.UtcNow は連続的な単一値のタイム スケールですが、DateTime.Now は連続的または単一値ではありません。主な理由は、UTC に適用されない夏時間です。したがって、UTC は 1 時間前後にジャンプすることはありませんが、現地時間 (DateTime.Now) はジャンプします。そして、逆方向にジャンプすると、同じ時間値が 2 回発生します。

DateTime.UtcNow は、夏時間を省略した世界時スケールです。したがって、DST によって UTC が変更されることはありません。

ただし、DateTime.Now は DST に応じて変化するため、連続的または単一値ではありません。つまり、DateTime.Now では、同じ時刻の値が 2 回発生する可能性があり、顧客が混乱する可能性があります。

アプリケーションを実行するマシンの現地時間が必要な場合 (ヨーロッパの CEST など)、Now を使用します。世界時が必要な場合は - UtcNow。それはあなたの好みの問題です - おそらく、ローカル Web サイトやスタンドアロン アプリケーションを作成する場合、ユーザーのタイムゾーン設定 (DateTime.Now) の影響を受ける、ユーザーの時間を使用したいと思うでしょう。

ウェブサイトの場合、サーバーのタイムゾーン設定であることを覚えておいてください。したがって、ユーザーの時刻を表示する場合は、ユーザーの希望のタイムゾーンを取得して時刻を変更するか (UTC 時刻をデータベースに保存して変更するだけです)、または UTC を指定します。これを忘れた場合、ユーザーには次のような内容が表示されます。 3 マイナス前に投稿 そして、それに近い未来の時間:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top