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 がどのタイム ゾーンで作成されたかが判明していることを前提にしています。この構造体のメソッドとプロパティでは、計算または比較を行うときは常にローカル タイム ゾーンが使用されます。

AddSubtract など、 DateTime のインスタンスを使用して計算しても、そのインスタンスの値は変更されません。代わりに、この計算の結果を示す値を持つ DateTime の新しいインスタンスが返されます。

DateTime の各メンバは、暗黙的にグレゴリオ暦を使用して演算を実行します。ただし、暦を指定するコンストラクタや、 System.Globalization.DateTimeFormatInfo などの、 IFormatProvider から派生したパラメータで暗黙的に暦を指定するメソッドは例外です。別の暦で日付と時刻の演算を実行するには、 System.Globalization.Calendar クラスを使用します。

この型は IComparableIFormattable 、および 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