DateTime 構造体
通常、日付や時刻として表現される瞬間を表します。
この型のすべてのメンバの一覧については、DateTime メンバ を参照してください。
System.Object
System.ValueType
System.DateTime
<Serializable>
Public Structure DateTime Implements IComparable, IFormattable, IConvertible
[C#]
[Serializable]
public struct DateTime : IComparable, IFormattable, IConvertible
[C++]
[Serializable]
public __value struct DateTime : public IComparable, IFormattable, IConvertible
[JScript] JScript では、.NET Framework の構造体を利用することができます。ただし、独自に定義することはできません。
スレッドセーフ
この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。
解説
DateTime 値型は、A.D. (西暦紀元) 0001 年 1 月 1 日の午前 00:00:00 から A.D. (西暦紀元) 9999 年 12 月 31 日の午後 11:59:59 までの間の値で日付と時刻を表します。
時刻値は 100 ナノ秒単位 (タイマ刻み) で表し、日付は GregorianCalendar 暦の A.D. (西暦紀元) 1 年 1 月 1 日の午前 00:00 からのタイマ刻み数で表します。たとえば、タイマ刻み値 31241376000000000L は、0100 年 1 月 1 日 (金曜日) の深夜 12:00:00 を表します。 DateTime 値は、常に、明示的な暦または既定の暦のコンテキストで表されます。
DateTime 値型と TimeSpan 値型の違う点は、 DateTime が瞬間を表し、 TimeSpan が時間間隔を表すことです。つまり、たとえば DateTime の 1 つのインスタンスを別のインスタンスから減算すると、それら 2 つのインスタンス間の時間間隔を取得できます。または、現在の DateTime に正の TimeSpan を加算すると将来の日付が算出されます。
DateTime のインスタンスに時刻値を加算したり減算できます。時刻値は正または負のどちらでもよく、タイマ刻み、秒、 TimeSpan のインスタンスなどの単位で表すことができます。この値型のメソッドとプロパティには、閏年、1 か月の日数などの詳細を入れることができます。
この型の時刻値は、多くの場合、以前はグリニッジ標準時 (GMT: Greenwich Mean Time) と呼ばれていた世界協定時刻 (UTC: Coordinated Universal Time) を使用して表されます。
DateTime インスタンスの計算および比較は、インスタンスが同じタイム ゾーンで作成されている場合だけ有効です。このため、明示的な変数またはポリシーなどの外部機構によって、 DateTime がどのタイム ゾーンで作成されたかが判明していることを前提にしています。この構造体のメソッドとプロパティでは、計算または比較を行うときは常にローカル タイム ゾーンが使用されます。
Add 、 Subtract など、 DateTime のインスタンスを使用して計算しても、そのインスタンスの値は変更されません。代わりに、この計算の結果を示す値を持つ DateTime の新しいインスタンスが返されます。
DateTime の各メンバは、暗黙的にグレゴリオ暦を使用して演算を実行します。ただし、暦を指定するコンストラクタや、 System.Globalization.DateTimeFormatInfo などの、 IFormatProvider から派生したパラメータで暗黙的に暦を指定するメソッドは例外です。別の暦で日付と時刻の演算を実行するには、 System.Globalization.Calendar クラスを使用します。
この型は IComparable 、 IFormattable 、および IConvertible から継承します。この型の明示的な IConvertible インターフェイス メンバの実装の代わりに、 Convert クラスを使用します。
使用例
[Visual Basic, C#, C++] ほぼ等しい DateTime の値を比較して、一定の小さな範囲の許容誤差において "等しい" と判定する方法を次の例に示します。
Class DateTimeTester
Shared Function RoughlyEquals(time As DateTime, timeWithWindow As DateTime, windowInSeconds As Integer, frequencyInSeconds As Integer) As Boolean
Dim delta As Long = (timeWithWindow.Subtract(time)).TotalSeconds Mod frequencyInSeconds
If delta > windowInSeconds Then
delta = frequencyInSeconds - delta
End If
Return Math.Abs(delta) < windowInSeconds
End Function 'RoughlyEquals
Public Shared Sub Main()
Dim window As Integer = 10
Dim freq As Integer = 60 * 60 * 2 ' 2 hours;
Dim d1 As DateTime = DateTime.Now
Dim d2 As DateTime = d1.AddSeconds((2 * window))
Dim d3 As DateTime = d1.AddSeconds((- 2 * window))
Dim d4 As DateTime = d1.AddSeconds((window / 2))
Dim d5 As DateTime = d1.AddSeconds((- window / 2))
Dim d6 As DateTime = d1.AddHours(2).AddSeconds((2 * window))
Dim d7 As DateTime = d1.AddHours(2).AddSeconds((- 2 * window))
Dim d8 As DateTime = d1.AddHours(2).AddSeconds((window / 2))
Dim d9 As DateTime = d1.AddHours(2).AddSeconds((- window / 2))
Console.WriteLine("d1 ~= d1 [true]: " + CStr(RoughlyEquals(d1, d1, window, freq)))
Console.WriteLine("d1 ~= d2 [false]: " + CStr(RoughlyEquals(d1, d2, window, freq)))
Console.WriteLine("d1 ~= d3 [false]: " + CStr(RoughlyEquals(d1, d3, window, freq)))
Console.WriteLine("d1 ~= d4 [true]: " + CStr(RoughlyEquals(d1, d4, window, freq)))
Console.WriteLine("d1 ~= d5 [true]: " + CStr(RoughlyEquals(d1, d5, window, freq)))
Console.WriteLine("d1 ~= d6 [false]: " + CStr(RoughlyEquals(d1, d6, window, freq)))
Console.WriteLine("d1 ~= d7 [false]: " + CStr(RoughlyEquals(d1, d7, window, freq)))
Console.WriteLine("d1 ~= d8 [true]: " + CStr(RoughlyEquals(d1, d8, window, freq)))
Console.WriteLine("d1 ~= d9 [true]: " + CStr(RoughlyEquals(d1, d9, window, freq)))
End Sub 'Main
End Class 'DateTimeTester
[C#]
class DateTimeTester {
static bool RoughlyEquals(DateTime time, DateTime timeWithWindow, int windowInSeconds, int frequencyInSeconds)
{
long delta = (long)((TimeSpan)(timeWithWindow - time)).TotalSeconds % frequencyInSeconds;
delta = delta > windowInSeconds ? frequencyInSeconds - delta : delta;
return Math.Abs(delta) < windowInSeconds;
}
public static void Main()
{
int window = 10;
int freq = 60 * 60 * 2; // 2 hours;
DateTime d1 = DateTime.Now;
DateTime d2 = d1.AddSeconds(2 * window);
DateTime d3 = d1.AddSeconds(-2 * window);
DateTime d4 = d1.AddSeconds(window / 2);
DateTime d5 = d1.AddSeconds(-window / 2);
DateTime d6 = (d1.AddHours(2)).AddSeconds(2 * window);
DateTime d7 = (d1.AddHours(2)).AddSeconds(-2 * window);
DateTime d8 = (d1.AddHours(2)).AddSeconds(window / 2);
DateTime d9 = (d1.AddHours(2)).AddSeconds(-window / 2);
Console.WriteLine("d1 ~= d1 [true]: " + RoughlyEquals(d1, d1, window, freq));
Console.WriteLine("d1 ~= d2 [false]: " + RoughlyEquals(d1, d2, window, freq));
Console.WriteLine("d1 ~= d3 [false]: " + RoughlyEquals(d1, d3, window, freq));
Console.WriteLine("d1 ~= d4 [true]: " + RoughlyEquals(d1, d4, window, freq));
Console.WriteLine("d1 ~= d5 [true]: " + RoughlyEquals(d1, d5, window, freq));
Console.WriteLine("d1 ~= d6 [false]: " + RoughlyEquals(d1, d6, window, freq));
Console.WriteLine("d1 ~= d7 [false]: " + RoughlyEquals(d1, d7, window, freq));
Console.WriteLine("d1 ~= d8 [true]: " + RoughlyEquals(d1, d8, window, freq));
Console.WriteLine("d1 ~= d9 [true]: " + RoughlyEquals(d1, d9, window, freq));
}
}
[C++]
bool RoughlyEquals(DateTime time, DateTime timeWithWindow, int windowInSeconds, int frequencyInSeconds) {
long delta = (long)((TimeSpan)(timeWithWindow - time)).TotalSeconds % frequencyInSeconds;
delta = delta > windowInSeconds ? frequencyInSeconds - delta : delta;
return Math::Abs(delta) < windowInSeconds;
}
int main() {
int window = 10;
int freq = 60 * 60 * 2; // 2 hours;
DateTime d1 = DateTime::Now;
DateTime d2 = d1.AddSeconds(2 * window);
DateTime d3 = d1.AddSeconds(-2 * window);
DateTime d4 = d1.AddSeconds(window / 2);
DateTime d5 = d1.AddSeconds(-window / 2);
DateTime d6 = (d1.AddHours(2)).AddSeconds(2 * window);
DateTime d7 = (d1.AddHours(2)).AddSeconds(-2 * window);
DateTime d8 = (d1.AddHours(2)).AddSeconds(window / 2);
DateTime d9 = (d1.AddHours(2)).AddSeconds(-window / 2);
Console::WriteLine(S"d1 ~= d1 [true]: {0}", __box(RoughlyEquals(d1, d1, window, freq)));
Console::WriteLine(S"d1 ~= d2 [false]: {0}", __box(RoughlyEquals(d1, d2, window, freq)));
Console::WriteLine(S"d1 ~= d3 [false]: {0}", __box(RoughlyEquals(d1, d3, window, freq)));
Console::WriteLine(S"d1 ~= d4 [true]: {0}", __box(RoughlyEquals(d1, d4, window, freq)));
Console::WriteLine(S"d1 ~= d5 [true]: {0}", __box(RoughlyEquals(d1, d5, window, freq)));
Console::WriteLine(S"d1 ~= d6 [false]: {0}", __box(RoughlyEquals(d1, d6, window, freq)));
Console::WriteLine(S"d1 ~= d7 [false]: {0}", __box(RoughlyEquals(d1, d7, window, freq)));
Console::WriteLine(S"d1 ~= d8 [true]: {0}", __box(RoughlyEquals(d1, d8, window, freq)));
Console::WriteLine(S"d1 ~= d9 [true]: {0}", __box(RoughlyEquals(d1, d9, window, freq)));
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
名前空間: System
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET
アセンブリ: Mscorlib (Mscorlib.dll 内)
参照
DateTime メンバ | System 名前空間 | TimeSpan | Calendar | GetUtcOffset