2つのプロパティがどのように機能するのかという原則は何なのでしょうか。2つ目は普遍的であり、基本的にタイムゾーンを処理しないことを知っていますが、誰かがそれらがどのように機能し、どのシナリオでどのシナリオを使用する必要があるかを詳細に説明できますか?
2つのプロパティがどのように機能するのかという原則は何なのでしょうか。2つ目は普遍的であり、基本的にタイムゾーンを処理しないことを知っていますが、誰かがそれらがどのように機能し、どのシナリオでどのシナリオを使用する必要があるかを詳細に説明できますか?
回答:
DateTime.UtcNowは、グリニッジ標準時タイムゾーンとも呼ばれる協定世界時での日付と時刻を示します。基本的には、イギリスのロンドンにいるときのように、夏の間はそうではありません。DateTime.Nowは、現在のロケールで表示される日付と時刻を示します。
DateTime.Now
人間に日付を表示しているときはいつでも使用することをお勧めします。つまり、彼らが見る値に快適であるようにすることです。それは、時計や時計に表示されるものと簡単に比較できるものです。DateTime.UtcNow
日付を保存する場合、またはその方法で(クライアント/サーバーモデルで)後で計算に使用する場合に使用します。計算は、サーバーまたは異なるタイムゾーンのクライアントによって混乱することはありません。
とてもシンプルなので、聴衆が何で、どこに住んでいるかにもよると思います。
Utcを使用しない場合は、日付と時刻を表示する相手のタイムゾーンを知っている必要があります。そうでない場合は、システム時間またはサーバー時間の午後3時に発生した何かが実際に午後5時に発生したことを伝えます。彼らはたまたま生きている。
私たちが使用しDateTime.UtcNow
ているのは、世界中にウェブユーザーがいることと、すべてのユーザーが自分の住んでいるタイムゾーンを示すフォームに記入するのを嫌がらないようにするためです。
また、投稿が古くなり、地球上のどこにいても時刻が「同じ」になるまでの相対時間(2時間前、1日前など)も表示されます。
パフォーマンスの違いにも注意してください。内部は多くのタイムゾーン調整を行っているため、DateTime.UtcNow
約30倍高速です(これはReflectorで簡単に確認できます)。DateTime.Now
DateTime.Now
したがってDateTime.Now
、相対時間測定には使用しないでください。
.NETで理解するための一つのメインコンセプトは、ということである今がある今、すべての地球上であなたが何であるかを時間帯に関係なく、だからと変数ロードした場合。DateTime.Now
またはDateTime.UtcNow
-割り当ては同じです*あなた。DateTime
オブジェクトは、あなたがしているタイムゾーンを知っています割り当てに関係なくそれを考慮に入れます。
の有用性DateTime.UtcNow
は、夏時間の境界を越えて日付を計算するときに役立ちます。つまり、夏時間に参加している場所では、正午から翌日の正午までに25時間ある場合と、正午から翌日の正午まで23時間ある場合があります。時間Aと時間Bからの時間数を正しく決定する場合は、最初にそれぞれをUTC相当に変換してからを計算する必要がありますTimeSpan
。
これは、私が書いたブログ投稿でさらに説明さTimeSpan
れており、このトピックに関するさらに広範なMSの記事へのリンクが含まれています。
*説明:どちらの割り当てでも現在の時刻が保存されます。あなたは二つの変数1つを介してロードした場合DateTime.Now()
を経由して他の二つの違い時間は、あなたが時間の距離GMTからのタイムゾーンであると仮定していない、ミリ秒単位になります。以下に示すように、それらの値を出力すると、異なる文字列が表示されます。DateTime.UtcNow()
TimeSpan
String
これは良い質問です。.NetがさまざまなKind
値でどのように動作するかについてもう少し詳しく説明するために、これを復活させます。@Jan Zichが指摘するように、これは実際には非常に重要なプロパティであり、Now
またはを使用するかどうかによって異なる設定になりますUtcNow
。
内部的には日付が格納されTicks
ます(@Carl Cameraの回答とは逆に)は、Now
またはを使用するかどうかによって異なりますUtcNow
。
DateTime.UtcNow
他の言語と同じように動作します。Ticks
GMTベースの値に設定します。また、に設定さKind
れUtc
ます。
DateTime.Now
GMTタイムゾーンでの時刻である場合のTicks
値に変更します。また、に設定されます。Kind
Local
(GMT-6)より6時間遅れている場合、6時間前のGMT時間を取得します。.Netは実際には無視してKind
、6時間前のように扱います。あなたが作成した場合、これはさらに壊れますDateTime
インスタンスてからタイムゾーンを変更してそれを使用しようとするとます。
「種類」の値が異なる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 <今、」真されている必要があります(私も確かに時間を追加)していたが、さらに虚偽だったはず。
また、どこでも世界標準時に変換する「回避策」も確認できます。 Kind
、同じはないます。
質問に対する私の直接の回答は、それぞれをいつ使用するかについての承認された回答の推奨事項に同意します。I / O(表示および解析)中を除いて、常にを持つオブジェクトを操作するようにしてください。つまり、オブジェクトを作成して表示するだけですぐに破棄する場合を除き、ほとんどの場合はを使用する必要があります。DateTime
Kind=Utc
DateTime.UtcNow
DateTimeは、どのタイムゾーンであるかがわかりません。それは常にあなたがあなたの現地時間にいると仮定します。UtcNow単に「時間からタイムゾーンを引く」ことを意味します。
タイムゾーン対応の日付を使用する場合は、タイムゾーンを使用して日付/時刻を表すDateTimeOffsetを使用します。私はそれを難しい方法で学ばなければなりませんでした。
質問に対する「単純な」答えは次のとおりです。
DateTime.Nowは、現在のシステム時刻を表すDateTime値を返します(システムが実行されているタイムゾーンで)。DateTime.Kindプロパティは次のようになりますDateTimeKind.Local
DateTime.UtcNowは、現在の協定世界時(別名UTC)を表すDateTime値を返します。これは、システムのタイムゾーンに関係なく同じになります。DateTime.Kindプロパティは次のようになりますDateTimeKind.Utc
上記のポイントに少し追加しただけです。DateTime構造体には、Kindと呼ばれるほとんど知られていないフィールドも含まれています(少なくとも、長い間私はそれについて知りませんでした)。これは基本的に、時間が現地時間かUTCかを示す単なるフラグです。現地時間のUTCからの実際のオフセットは指定しません。構造体がどのような意図で構築されたかを示すという事実に加えて、メソッドToUniversalTime()およびToLocalTime()の動作方法にも影響します。
パーティーには少し遅れましたが、次の2つのリンク(4guysfromrolla)は非常に役立つことがわかりました。
DateTime.UtcNowは連続的な単一値の時間スケールですが、DateTime.Nowは連続的または単一値ではありません。主な理由は夏時間であり、UTCには適用されません。したがって、UTCは1時間前後にジャンプすることはありませんが、現地時間(DateTime.Now)はジャンプします。そして、後方にジャンプすると、同じ時間値が2回発生します。
アプリケーションを実行するマシンの現地時間(ヨーロッパのCESTなど)が必要な場合は、Nowを使用してください。ユニバーサルタイムが必要な場合-UtcNow。それは単にあなたの好みの問題です-おそらくあなたが持っている時間を使用したいローカルウェブサイト/スタンドアロンアプリケーションを作る-それで彼/彼女のタイムゾーン設定-DateTime.Nowの影響を受けます。
覚えておいてください、ウェブサイトの場合、それはサーバーのタイムゾーン設定です。したがって、ユーザーの時間を表示している場合は、ユーザーの希望するタイムゾーンを取得して時間をシフトする(Utc時間をデータベースに保存してから変更する)か、またはUTCを指定します。あなたがそうするのを忘れた場合、ユーザーは次のようなものを見ることができます:3マイナス前に投稿されてから、その近くの将来の時間:)