Home > C# > C# 学び直し

翻訳した、msdnのDateTime構造体の説明

新規作成日 2017-10-30
最終更新日

確認した時点では、msdnのDateTime構造体の説明は、翻訳が読みにくいので、自分で翻訳し直しました。

全ての部分を翻訳し直したわけではないので、元のページと比較しながらご利用下さい。

msdnのDateTime構造体の説明

備考

メモ

この型の.NET Frameworkソースコードを表示するには、Reference Sourceを参照してください。 あなたは、ソースコードをオンラインで閲覧する、オフラインで表示するために、リファレンスをダウンロードすることができます。 そして、デバッグ中に(パッチと更新が含まる)ソースをステップ実行します。;説明文を参照してください。

1月1日、00:00:00(真夜中)から、西暦(C.E.)9999年12月31日午後11時59分59秒まで、グレゴリオ暦で、日付と時刻を値の範囲で表現します。

時間値は、ticksと呼ばれる100ナノ秒の単位で測定されます。 そして、個々の日付は、グレゴリオ暦カレンダーで、A.D. (C.E.)0001年、1月1日、12:00の真夜中からのticksの数(うるう秒で追加されるticksを除いて)です。 例えば、31241376000000000lのticksの値は、0100 年 1 月 1 日金曜日深夜 00:00 の日付を表します。DateTime値は、常に、明示的なコンテキストや既定の暦で表されます。

あなたが、分や秒のような、他の時間間隔に変換したいticks値で動作している場合、 あなたは、変換を実行するために、TimeSpan.TicksPerDay、TimeSpan.TicksPerHour、TimeSpan.TicksPerMinute、TimeSpan.TicksPerSecondやTimeSpan.TicksPerMillisecond定数を使用する必要があります。 例えば、表現された秒数を追加するために、SecondコンポーネントのDateTime値へのticksの指定された数によって、あなたは、式、dateValue.Second + nTicks/Timespan.TicksPerSecondを使用することができます。

DateTimeオブジェクトをインスタンス化する

Instantiating a DateTime object

あなたは、次の方法のいずれかで、新しいDateTime値を作成することができます。:

DateTimeコンストラクタのオーバーロードのどれかを呼び出すことによって、あなたは、日付と時間の値を具体的な要素を指定できます(例えば、月と日、年、あるいは、ticksの数)。 以下のステートメントは、具体的な年、月、日、時間、分と秒を持つ日付を作成するために、DateTimeコンストラクタの1つの呼び出しを説明します。

日付と時間の値を宣言するためのコンパイラ固有の構文を使用する事で、例えば、次のVisual Basicステートメントは、新しいDateTime値を初期化します。

DateTimeオブジェクトを割り当てることで、日付と時間の値は、プロパティやメソッドで返されます。次の例では、現在の日付と時刻を割り当てます。 現在の協定世界時(UTC)の日付と時刻、そして、3つの新しいDateTime変数への現在の日付。

日付と時間の値の文字列表現を解析することによって、Parse、ParseExact、TryParseとTryParseExactメソッドは、文字列をその同等の日付と時間の値にすべて変換します。 次の例は、文字列を解析するParseメソッドを使用します。そして、それを、DateTime値に変換します。

TryParseとTryParseExactメソッドが、変換を実行することに加えて、個々の文字列が、DateTime値の有効な表現を含んでいるかどうかを示していることに注目して下さい。

DateTime構造の暗黙の既定のコンストラクタを呼び出すことによって、(値型の暗黙の既定のコンストラクタの詳細については、値型(C#リファレンス)を参照してください)それをサポートするのためのコンパイラの、およその同等のもの、日付と時間を、明示的に割り当てることなく、DateTime値を宣言しています。次の例は、

次のメソッドは、「1/1/0001 12:00:00 AM」をディスプレイに呼び出します。

次のメソッドは、Trueの表示を呼び出します。

DateTime値とそれらの文字列表現

DateTime values and their string representations

内部的に、すべてのDateTime値は、0001年、1月1日の12:00:00の真夜中、から、どれだけ経過したか、ticks(100ナノ秒の間隔の数値)の数として表現されます。 実際のDateTime値は、ユーザー・インターフェイス要素で表示されるとき、あるいは、ファイルに記述されるとき、その値が表示される方法から独立しています。 DateTime値の外観は、書式設定操作の結果です。フォーマッティングは、その文字列表現に値を変換する工程です。

日付と時間の値の外観が、文化、国際標準、アプリケーションの要件、個人的な好みのような要因に依存しているため、 DateTime構造は、そのToStringメソッドのオーバーロードを通して、日付と時間の値の書式設定に、大きな柔軟性を提供します。 既定のDateTime.ToString()メソッドは、現在のカルチャの短い日付と長い時間のパターンを使用して、日付と時間の値の文字列表示を返します。 次の例は、en-USカルチャ、その例を実行するコンピュータの現在のカルチャの短い日付と長い時間のパターンを使用して、日付と時刻を表示する既定のDateTime.ToString()メソッドを使用します。

en-USカルチャのために、2008年3月1日、午前7時00分00秒を表示します。

DateTime.ToString(IFormatProvider)メソッドは、具体的なカルチャの短い日付と長い時間パターンを使用して、日付と時間の値の文字列表現を返します。 次の例は、fr-FRカルチャの短い日付と長い時間のパターンを使用して、日付と時刻を表示するために、DateTime.ToString(IFormatProvider)メソッドを使用します。

01/03/2008 07:00:00を表示します。

DateTime.ToString(String)メソッドは、標準またはユーザー定義した書式指示子によって、そして、現在のカルチャのフォーマット規約を使用して、定義される書式内の日付と時刻の文字列表示を返します。 次の例は、その例が、実行するコンピュータの現在のカルチャen-USカルチャのための完全な日付と時刻のパターンを表示するために、DateTime.ToString(String)メソッドを使用します。

Saturday, March 01, 2008 7:00:00 AMを表示します。

DateTime.ToString(String, IFormatProvider)メソッドは、具体的な書式指定子、そして、具体的なカルチャの書式設定規則を使用することによって、定義される書式内の日付と時刻の文字列表示を返します。 次の例は、fr-FRカルチャのための完全な日付と時間パターンを表示するDateTime.ToString(String, IFormatProvider)メソッドを使用します。

samedi 1 mars 2008 07:00:00を表示します。

DateTime値の書式設定の詳細については、標準の日付と時刻の書式文字列とユーザー定義した日付と時刻の表示形式文字列を参照してください。

DateTime値から文字列への変換

Converting strings to DateTime values

構文解析は、日付と時刻の文字列表示をDateTime値に変換することを含んでいます。通常、日付と時刻の文字列は、アプリケーションにおいて、2つの異なる使いかたを持っています:

それらは、様々な形になることができる日付と時刻を表現します。そして、現在の文化や特定の文化を反映しています。 例えば、アプリケーションは、現在の文化がen-USであるユーザーに提供するかもしれません。「12/15/2013」または「December 15, 2013」として日付値を入力します。 そして、現在のカルチャが、en-GBであるユーザーは、「15/12/2013」や「15 December 2013」として、日付値を入力できます。

それらは、あらかじめ設定された書式で日付と時刻を表現します。例えば、アプリケーションは、アプリケーションが実行されているカルチャーとは無関係に、「20130103」として、日付をシリアル化するかもしれません。 あるいは、それは、現在のカルチャの短い日付形式で、入力された日付を必要とするかもしれません。

あなたは、使用されている一般的な日付と時刻の書式の1つを反映するかもしれない、文字列を変換するParseやTryParseメソッドを使用することができます。 DateTime値へのカルチャによって、次の例は、あなたが、異なる別のカルチャ固有の書式の数値の日付文字列を、DateTime値に変換するために、TryParseを、どのように、使用できるかを示しています。 それは、現在のカルチャを英語(イギリス)に変更します。そして、日付と時刻の文字列の配列を作成するために、GetDateTimeFormats()メソッドを呼び出します。 それは、続いて、配列で、各々の要素をTryParseメソッドに渡します。この例の出力は、示します。構文解析メソッドが、それぞれカルチャ固有の日付と時刻を文字列に、うまく変換できます。

解析できなかった文字列を表示します。

この例では、次の出力が表示されます。:

あなたは、日付と時間文字列を変換するために、TryParseとTryParseExactメソッドを使用することができます。 それは、個々の書式や書式を、DateTime値に一致する必要があります。あなたは、methodbyを解析するためのパラメータとして、必要とされる書式や書式を指定します。 一つ以上の日付と時刻の書式文字列を使用して、次の例は、文字列を変換するために、TryParseExact(String, String[], IFormatProvider, DateTimeStyles, DateTime)メソッドを使用します。 それは、DateTime値に「yyyyMMdd」書式や「HHmmss」書式のどちらかである必要があります。

ParseとParseExactメソッドは、例外を投げます。 DateTime値に変換される文字列を解析できない場合、TryParseとTryParseExactメソッドは、変換が成功したか失敗したかを示す、Boolean値を返します。 日付と時刻の文字列のための構文解析操作のため、特に、文字列が、ユーザーで、入力している場合、より高い失敗率を持つ傾向があります。 そして、例外処理は高くつくため、性能が重要な場合やコンバージョンが高い割合で失敗する場合、あなたは、脚本で、TryParseやTryParseExactメソッドを使用する必要があります。

日付と時間の値の解析についての詳細については、.NET Frameworkの日付と時刻の文字列を解析するを参照してください。

バージョンに関する考慮事項

Version considerations

.NET Frameworkバージョン2.0の前には、DateTime構造には、日付と時刻を表すticksの数値が含まれている62-bitの符号なしフィールドのprivate Ticksフィールドで連結される未使用の2-bitのフィールドで連結される64-bitのフィールドが含まれています。Ticksフィールドの値は、Ticksプロパティで取得することができます。

.NET Framework 2.0以降では、DateTime構造には、Ticksフィールドで連結される公開されていないKindフィールドで構成される64-bitのフィールドが含まれています。 Kindフィールドは、DateTime構造が現地時間を表現するかどうか、協定世界時(UTC)、あるいは、タイムゾーンが明らかでない時間を示す2-bitのフィールドです。 タイムゾーン間で、時間の変換を行うとき、Kindフィールドが、使われますが、時間の比較や算術演算には使用できません。Kindフィールドの値は、Kindプロパティで取得することができます。

メモ

個々のタイムゾーンで、日付と時間の値と一緒に動作するためのDateTime構造に代わるものは、DateTimeOffset構造です。 DateTimeOffset構造は、private Int16フィールドのUTCから、その日付と時刻が、異なることで、分の数値で、private DateTimeフィールドに日付と時刻の情報を格納します。 これは、個々のタイムゾーンで、DateTimeOffset値から、時間を反映することを可能にします。 ところが、DateTime値は、UTCと現地時間のゾーンタイムだけを明確に反映することができます。 日付と時間の値で作業するとき、いつDateTime構造かDateTimeOffset構造を使用するかという議論については、DateTime、DateTimeOffset、TimeSpanとTimeZoneInfoの間で選択をすることを参照してください。

DateTime値

DateTime values

DateTime型の時間値の説明は、多くの場合、グリニッジ標準時(GMT)の国際的に認められた名前の協定世界時(UTC)標準を使って、表現されます。 協定世界時は、経度0°(UTC原点)で測定される時間です。夏時間は、UTCには適用されません。

現地時間は、個々のタイムゾーンに相対的です。タイムゾーンは、タイムゾーン・オフセットに関連付けられています。 これは、UTC原点から、数時間単位で測定された時間帯の変位です。加えて、現地時間は、必要に応じて、1日の時間から1時間を加算または減算する夏時間の影響を受けます。 従って、現地時間は、UTCにタイムゾーンオフセットを加算して計算されます。そして、必要に応じて夏時間に合わせて調整します。UTC原点のタイムゾーン・オフセットは、ゼロです。

UTC時間は、ファイルの計算、比較と格納している日付と時刻のために適切です。現地時間は、デスクトップ・アプリケーションのユーザー・インターフェイスでの表示に適切です。 また、(多くのWebアプリケーションのような)タイムゾーンを認識しているアプリケーションは、多くの他のタイムゾーンで動作する必要があります。

DateTimeオブジェクトのKindプロパティが、DateTimeKind.Unspecifiedである場合、それが、表現される時間が、現地時間、UTC時間やいくつかの他のタイムゾーンの時間であるかは、明らかでありません。

DateTime操作

DateTime operations

AddやSubtractのような、DateTime構造を使用する計算は、構造体の値を修正しません。その代わりに、計算は、値が、計算の結果である新しいDateTime構造体を返します。

(UTCと現地時間の間、あるいは、1つのタイムゾーンともう一つの間でのような)タイムゾーンの間の変換操作は、アカウントに夏時間を取りますが、算術演算と比較演算操作は行いません。

DateTime構造そのものは、1つのタイムゾーンから他の一つに変換するための、制限されたサポートを提供します。 あなたは、UTCを現地時間に変換するために、ToLocalTimeメソッドを使用することができます。 あるいは、あなたは、現地時間をUTCに変換するために、ToUniversalTimeメソッドを使用することができます。 しかしながら、タイムゾーン変換メソッドの完全な設定は、TimeZoneInfoクラスで使用できます。これらのメソッドを使用して、 あなたは、世界のタイムゾーンのどれでも、他のどんなタイムゾーンにでも時間を変換することができます。

オブジェクトが、同じタイムゾーンで時間を表現する場合だけ、DateTimeオブジェクトの計算と比較には、意味があります。 あなたは、DateTime値のタイムゾーンを表現する、TimeZoneInfoオブジェクトを使用することができますが、2つは疎く結合しています。 (すなわち、DateTimeオブジェクトは、Kindプロパティ以外のその日付と時間の値のタイムゾーンを表現するオブジェクトを返す、プロパティを持っていません。)この理由のため、 タイムゾーン対応のアプリケーションでは、あなたは、DateTimeオブジェクトが作成されたタイムゾーンを決定するために、いくつかの外部の仕組みに頼る必要があります。 例えば、あなたは、DateTime値とDateTime値のタイムゾーンを表現するTimeZoneInfoオブジェクトの両方を包む構造を使用できます。 計算およびDateTime値との比較にUTCを使用する方法の詳細については、「日付と時刻による算術演算の実行」を参照してください。

各々のDateTimeメンバーは、暗黙的にカレンダーを指定するSystem.Globalization.DateTimeFormatInfoのような、カレンダーを指定するコンストラクタ、 そして、IFormatProviderから派生したパラメータを持つメソッドを除いて、暗黙的に、その操作、を実行するために、グレゴリオ暦を使用します。

DateTime型のメンバーによる操作は、うるう年や1か月の日数など、詳細を考慮します。

DateTimeの分解能

DateTime resolution

メモ

経過時間を測定するために、DateTime値で、日付と時刻の演算を実行する代わりに、あなたは、Stopwatchクラスを使用することができます。

Ticksプロパティは、1000万分の1の秒単位で、日付と時間の値を表現します。そして、Millisecondプロパティは、日付と時刻の値の1000分の1秒を返します。 しかしながら、あなたが、経過時間を測るために、DateTime.Nowプロパティを繰り返し呼び出しを使用している場合、 そして、あなたは、100ミリ秒未満の小さな時間間隔に関心を持つでしょう。あなたは、DateTime.Nowプロパティで、システム時計に依存する値が返されることに注意する必要があります。 それは、Windows 7とWindows 8 systemで、およそ15ミリ秒の分解能を持っています。

次の例は、現在の日付と時間の値が、システムクロックの分解能に依存することを説明します。例の中では、外側のループは、20回繰り返されます。 そして、内側ループは、外側ループを遅延させる働きをする。外側のループ・カウンタの値が、10である場合、Thread.Sleepメソッドを呼び出すと、5ミリ秒の遅延が発生します。 この例の出力が示すように、Thread.Sleepを呼び出した後、一つだけ変更されるDateTime.Now.Millisecondsプロパティで、ミリ秒の数値が返されます。

遅延ループを導入します。

DateTimeとTimeSpanとの比較

DateTime vs. TimeSpan

DateTimeとTimeSpan値の型は、DateTimeが、時間内の瞬間を表現する一方、TimeSpanは、時間間隔を表現するという点で、異なります。 これは、、例えば、あなたが、それらの間の時間間隔を示すTimeSpanオブジェクトから、取得するために、もう一方から、DateTimeの1つのインスタンスを取り去ることができることを示しています。 あるいは、あなたは、将来の日付を表すDateTime値を取得するために、正のTimeSpanを、現在のDateTimeに追加することができました。

あなたは、DateTimeオブジェクトから、時間間隔を加算または減算することができます。時間間隔は、正または負の値となります。 ticksや秒のような、単位で表現すことができます。あるいは、TimeSpanオブジェクトとして表現することができます。

DateTime値とカレンダー

DateTime values and calendars

.NET Framework Class Libraryには、Calendarクラスの数値が含まれています。これらは、すべてCalendarクラスから派生しています。

それぞれのカルチャは、その読取専用CultureInfo.Calendarプロパティで定義されたデフォルトのカレンダーを使用しています。 そして、その読取専用CultureInfo.OptionalCalendarsプロパティによって定義される1つ以上のカレンダーをサポートします。 現在カレンダーは、そのDateTimeFormatInfo.Calendarプロパティによって、具体的なCultureInfoオブジェクトを定義することで、使われます。; それは、CultureInfo.OptionalCalendars配列で見つかるカレンダーのものである必要があります。

カルチャの現在のカレンダーが、そのカルチャのすべての書式設定操作で使われます。例えば、省略時設定のペルシャ語(Iran)カルチャのカレンダーは、 UmAlQuraCalendarクラスによって表現されるウム・アル・クラ・カレンダーです。ペルシャ語(Iran)カルチャを表現するCultureInfoオブジェクトが、日付と時刻書式設定操作で使われるとき、 次の例に示すように、カルチャのDateTimeFormatInfo.Calendarプロパティ・プロパティが、変更される場合、 既定で、ウム・アル・クラ・カレンダーが、使用され、そして、グレゴリオ暦だけが、使われます。

同様に、カルチャの現在のカレンダーは、次の例に示すように、そのカルチャの操作を解析するすべてで使用されます。

また、あなたは、カレンダー・パラメータが含まれているDateTimeコンストラクタを呼び出すことによって、 具体的なカレンダーの(年、月、日の数のような)日付と時刻の要素を用いて、DateTime値をインスタンス化することができます。 そして、それに、そのカレンダーを表すCalendarオブジェクトを渡します。次の例では、UmAlQuraCalendarカレンダーから、日付と時刻の要素を使用して、これを行います。

DateTimeコンストラクタには、グレゴリオ暦の単位として、日付と時刻の要素が表現される想定するカレンダー・パラメータが含まれていません。

他の全てのDateTimeプロパティとメソッドは、グレゴリオ暦を使います。例えば、DateTime.Yearプロパティは、グレゴリオ暦で年を返します。そして、 DateTime.IsLeapYear(Int32)メソッドは、想定します。yearパラメータは、グレゴリオ暦の年です。 グレゴリオ暦を使用するそれぞれのDateTimeメンバーは、Calendarクラスの対応するメンバーを持っています。 それは、具体的なカレンダーを使用します。例えば、Calendar.GetYearメソッドは、具体的なカレンダーで年を返します。 そして、Calendar.IsLeapYearメソッドは、具体的なカレンダーの年の数値として、yearパラメータを解釈します。 次の例は、DateTimeとUmAlQuraCalendarクラスの対応するメンバーを使います。

けれども、DateTime構造には、DayOfWeekプロパティが含まれています。それは、メンバーが含まれていない、グレゴリオ暦の曜日を返します。 それは、あなたが、その年の週の数値を取得できます。 年の週を取得するには、それぞれのカレンダーのCalendar.GetWeekOfYearメソッドを呼び出します。次の例は、図を提供します。

日付とカレンダーの詳細については、Calendarでの作業を参照してください。

DateTime値を永続化する

Persisting DateTime values

あなたは、DateTime値は、次の4つの方法で永続化できます。:

あなたは、それらを、文字列と永続化した文字列に変換することができます。

あなたは、それらを64-bitの整数値に変換することができます。(Ticksプロパティの値)そして、整数を永続化します。

あなたは、DateTime値をシリアル化することができます。

あなたは、タイムゾーン情報を持つDateTime値をシリアル化することができます。

あなたが、どの技術を選択をするかに関係なく、あなたは、確実にルーチンにする必要があります。 それは、データを失わないDateTime値を復元します。あるいは、exception.DateTime値を投げるラウンド・トリップする必要があります。 すなわち、最初の値と回復する値は、同じものでなければなりません。 そして、最初のDateTime値が、一つの時間のインスタンスを表示する場合、それは、回復する時、同じモーメントを確認する必要があります。

文字列として値を永続化する

Persisting values as strings

文字列として永続化するDateTime値を正常に復元するには、次の規則に従ってください。:

あなたが、それを永続させたときのように、あなたが、文字列を元に戻すとき、カルチャ固有の書式に、同じ仮定を作成します。 現在のカルチャが、それが、保存されたシステムのカルチャと異なる文字列が、システム上で回復することができるを保証するために、文字列を保存するために、 変化しないカルチャの規則を使用して、ToStringoverloadを呼び出します。そして、文字列を元に戻すために、 変化しないカルチャの規則を使用して、Parse(String, IFormatProvider, DateTimeStyles)やTryParse(String, IFormatProvider, DateTimeStyles, DateTime)オーバーロードを呼び出します。 決して、ToString()、Parse(String)やTryParse(String, DateTime)オーバーロードを使用してはいけません。それが、現在のスレッド・カルチャの規則を使用します。

データが、一つの瞬間を表す場合、それが回復するとき、確実に、時間内の同じ瞬間を示します。 たとえ、それが、異なるタイムゾーンを使用するシステム上で回復するとしても、これを実行するには、 あなたは、それを保存する前に、DateTime値を協定世界時(UTC)に変換します。 また、あなたは、タイムゾーン情報と一緒に値をシリアル化することができます。; この方法の詳細については、DateTimeとタイムゾーンのデータのシリアライズを参照してください。

DateTime値を永続化するとき、文字列は、既定や現在のカルチャの書式設定規則に依存するため、最も一般的なエラーが、作成されます。 現在のカルチャが、異なる場合、文字列を保存して、元に戻すとき、問題が発生します。次の例は、これらの問題を説明します。 それは、この場合、英語(アメリカ合衆国)の現在のカルチャの書式設定規則を使用して、5つの日付を保存します。 それは、この場合、英語(イギリス)の現在のカルチャの書式設定規則を使用して、日付を元に戻します。 2つのカルチャの書式設定規則が異なるため、2つの日付は、回復することができません。 そして、残りの3つの日付は、誤って解釈されます。また、最初の日付と時間の値が、時間内の一つの瞬間を表す場合、タイムゾーン情報が、失われるため、復元した時間は、誤っています。

en-USシステム上で保存されるとき、この例では、次の出力が表示されます。:

en-GBシステム上で復元するとき、この例では、次の出力が表示されます。:

うまくDateTime値をラウンド・トリップするために、これらの手順に従います。:

値が、時間の一つの瞬間を表す場合、ToUniversalTimeメソッドを呼び出すことによって、それらを、現地時間から、UTCに変換します。

日付を、ToString(String, IFormatProvider)やString.Format(IFormatProvider, String, Object[])オーバーロードを呼び出すことによって、それらの文字列表現に変換します。 プロバイダ引数として、CultureInfo.InvariantCultureを指定することによって、変化しないカルチャの書式設定規則を使用します。「O」や「R」を使用して、値をラウンド・トリップするように指定します。

あなたが、Parse(String, IFormatProvider, DateTimeStyles)やTryParse(String, IFormatProvider, DateTimeStylesメソッドを呼び出すとき、

データ損失なしで、永続化されたDateTime値を復元するために、以下のことを行います。:

ParseExactやTryParseExactオーバーロードを呼び出すことで、データを解析します。プロバイダ引数として、CultureInfo.InvariantCultureを指定します。 そして、変換の間にformat引数のために、あなたが使用した同じ標準形式文字列を使用します。styles引数のDateTimeStyles.RoundtripKind値が含まれます。

DateTime値が、時間内の一つの瞬間を示す場合、UTCから、現地時間に解析された日付を変換するために、ToLocalTimeメソッドを呼び出します。

次の例は、そのDateTime値を保証するために、変化しないカルチャと「O」標準形式文字列を使用します。 それは、システム、カルチャやソースのタイムゾーンそしてターゲット・システムを気にせずに、時間の同じ瞬間、保存し、そして、復元します。

整数として値を永続化する

Persisting values as integers

文字列としてDateTime値を永続化する代わりに、あなたは、ticksの数を表現するInt64値として、それを永続化することができます。 この場合、あなたは、DateTime値が永続化され、復元される、システムのカルチャを考える必要はありません。

整数としてDateTime値を永続化します:

DateTime値が、時間内の一つの瞬間を表す場合、ToUniversalTimeメソッドを呼び出すことによって、それらをUTCに変換します。

そのTicksプロパティのDateTime値で指定することで、表現されたticksの数値を取得します。

DateTime値を復元するために、それは、整数として永続化されました。:

Int64値をDateTime(Int64)コンストラクタに渡すことによって、新しいDateTimeオブジェクトをインスタンス化します。

DateTime値が、時間内の一つの瞬間を示す場合、ToLocalTimeメソッドを呼び出すことによって、それをUTCから、現地時間に変換します。

次の例は、米国太平洋標準時間ゾーンのシステムの整数として、配列のDateTime値を永続化します。 それは、UTCゾーンのシステム上で、それを復元します。整数が含まれるファイルには、それに、すぐに追従するInt64値の合計数を示すInt32値が含まれています。

DateTime値をシリアル化する

Serializing DateTime values

あなたが、DateTime値へ変換し直す必要がある文字列や整数としてDateTime値を保存する代わりに、あなたは、ストリームやファイルをシリアル化することによって、DateTime値を永続化することができます。 そして、その次に、逆シリアル化によって、それらを復元します。この場合、DateTimedataは、いくつかの指定されたオブジェクト形式でシリアル化されます。 そして、それらが、逆シリアル化されると、オブジェクトが、復元されます。XmlSerializerやBinaryFormatterのような、フォーマッタやシリアライザーは、シリアル化と逆シリアル化の工程を処理します。 シリアル化と.NET Frameworkで、サポートされたシリアル化の種類の詳細については、.NET Frameworkのシリアル化を参照してください。

次の例は、DateTime値をシリアル化、そして、逆シリアル化するために、XmlSerializerクラスを使用します。 それは、21世紀中の全ての閏年を表しています。出力は、この例が、現在のカルチャが英語(イギリス)であるシステム上で実行される場合の結果を表示します。 なぜなら、私たちは、DateTimeオブジェクトそのものを逆シリアル化しました。 このコードは、日付と時刻の書式のカルチャの違いを処理する必要はありません。

先程の例では、時間情報が含まれていません。 しかしながら、DateTime値が時間内の瞬間を表し、現地時間として表現される場合、あなたは、ToUniversalTimeメソッドを呼び出すことによって、それをシリアル化する前に、現地時間からUTCに変換する必要があります。 後で、あなたは、それを逆シリアル化します。あなたは、ToLocalTimeメソッドを呼び出すことによって、それを、UTCから現地時間に変換する必要があります。 次の例は、米国太平洋標準時ゾーンのシステム上で、serializeDateTimeデータにBinaryFormatterクラスを使用します。 そして、UTCゾーンのシステム上でそれを逆シリアル化します。

DateTimeとタイムゾーンのデータをシリアル化する

Serializing DateTime and time zone data

先程の例では、DateTime値が、すべて、現地時間と表現されていることを想定されています。 そして、UTCと現地時間の間で、値を変換します。それで、それらは、ソース上で時間の同じ瞬間を反映します。 そして、また、対象とするsystems.DateTime値は、現地とUTC以外の時間ゾーンで、時間の瞬間を反映するかもしれません。 この場合、DateTime構造は、タイムゾーンに対応していないため、あなたは、そのタイムゾーンを表現するDateTimevalueとTimeZoneInfoオブジェクトをシリアル化する必要があります。これを実行するには、フィールドが、DateTime値とそのタイムゾーンの両方が含まれている型を作成します。 次に示す例は、これがどのように行われるかを説明する、DateWithTimeZone構造を定義します。

重要

DateWithTimeZone構造は、次の2つの例で使われています。それは、配列のDateWithTimeZoneオブジェクトをシリアル化して、逆シリアル化します。

例を実行するために、まず、DateWithTimeZone構造が含まれている、クラス・ライブラリを作成します。そして、その次に、あなたが、各々の例をコンパイルするとき、それに参照を追加します。

DateWithTimeZone構造を使用して、あなたは、続いて、タイムゾーン情報と一緒に日付と時刻を永続化することができます。次の例は、配列のDateWithTimeZoneobjectsをシリアル化するために、BinaryFormatterクラスを使用します。

次の例は、続いて、それを逆シリアル化するBinaryFormatter.Deserializeメソッドを呼び出します。

COMの相互運用の注意事項

COM interop considerations

DateTime値は、COMアプリケーションに移動し、そして、管理されたアプリケーションへ戻ります。これをラウンドトリップと言います。しかしながら、時間だけを指定するDateTime値は、あなたが、期待するように、ラウンド・トリップしません。

午後3時、最終日、そして、日付が、January, 1, 0001 C.E. at 3:00 P.M.の代わりに、December 30, 1899 C.E. at 3:00 P.M.のように、あなたが、時間だけをラウンド・トリップする場合、時間だけが指定されるとき、これは、.NET FrameworkとCOMが既定の日付を想定しているために発生します。 しかしながら、.NET Frameworkが、基準となる日付をJanuary, 1, 0001 C.E.と想定している間、COMシステムは、December 30, 1899 C.E.の基準となる日付を紀元後と想定します。

時間だけが.NET FrameworkからCOMに渡されるとき、COMが使用する形式に時刻を変換する特別な処理が実行されます。 時刻だけがCOMから.NET Frameworkに渡されるとき、特別な処理は実行されません。 なぜなら、それは、1899年12月30日までの正当な日付と時刻を破棄することになります。 また、これは、日付が、COMからそのラウンド・トリップを開始する場合、.NET Frameworkとcomが、日付を維持することを示しています。

.NET FrameworkとCOMの動作は、あなたのアプリケーションが、DateTimeをラウンド・トリップする場合、それは、時間だけを指定することを示しています。 あなたのアプリケーションは、最終的なDateTimeオブジェクトから、誤った日付を修正するか、無視することを覚えておく必要があります。

使用例

次の例は、それらを等しいと宣言するとき、小さな差異を受け入れて、どのように、およそ等しいDateTime値を比較するかを説明します。

スレッド セーフ

この型のすべてのメンバーは、スレッド・セーフです。インスタンスの状態を変更するように見えるメンバーは、実際には新しい値で初期化された新しいインスタンスを返します。他のどんな型でも同様に、この型のインスタンスが含まれている共有された変数の読み込みと書き込みは、スレッドの安全を保証するために、ロックで保護されていなければなりません。

注意

この型のインスタンスを割り当てることは、すべてのハードウェアプラットホーム上でスレッド・セーフでありません。 そのインスタンスのバイナリ表現が大きすぎて単一のアトミック操作で割り当てることができないためです。

このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」