Share via


DateTime 구조체

일반적으로 날짜와 시간으로 표시된 시간을 나타냅니다.

네임스페이스: System
어셈블리: mscorlib(mscorlib.dll)

구문

‘선언
<SerializableAttribute> _
Public Structure DateTime
    Implements IComparable, IFormattable, IConvertible, ISerializable, _
    IComparable(Of DateTime), IEquatable(Of DateTime)
‘사용 방법
Dim instance As DateTime
[SerializableAttribute] 
public struct DateTime : IComparable, IFormattable, IConvertible, 
    ISerializable, IComparable<DateTime>, IEquatable<DateTime>
[SerializableAttribute] 
public value class DateTime : IComparable, IFormattable, IConvertible, 
    ISerializable, IComparable<DateTime>, IEquatable<DateTime>
/** @attribute SerializableAttribute() */ 
public final class DateTime extends ValueType implements IComparable, IFormattable, 
    IConvertible, ISerializable, IComparable<DateTime>, IEquatable<DateTime>
JScript에서는 구조체를 사용할 수 있지만 새로 선언할 수는 없습니다.

설명

DateTime 값 형식은 서기 1년 1월 1일 자정부터 9999년 12월 31일 오후 11시 59분 59초까지의 날짜와 시간을 나타냅니다.

시간 값은 천만 분의 1초(틱) 단위로 측정되고, 특정 날짜는 GregorianCalendar 달력에서 서기 1년 1월 1일 자정부터의 틱 수입니다. 예를 들어, 틱 값이 31241376000000000L이면 서기 100년 1월 1일 금요일 자정을 나타냅니다. DateTime 값은 항상 명시적으로 지정된 달력이나 기본 설정된 달력을 기준으로 표시됩니다.

버전 고려 사항

.NET Framework 2.0 이전 버전에서 DateTime 구조체는 날짜와 시간을 나타내는 틱 수가 들어 있는 62비트 부호 없는 필드인 전용 Ticks 필드와 연결된 사용되지 않는 2비트 필드로 구성된 64비트 필드를 포함합니다. Ticks 필드의 값은 Ticks 속성을 사용하여 구할 수 있습니다.

.NET Framework 버전 2.0부터 DateTime 구조체는 Ticks 필드와 연결된 전용 Kind 필드로 구성된 64비트 필드를 포함합니다. Kind 필드는 2비트 필드로, DateTime 구조체가 현지 시간이나 UTC(지역 표준시)를 나타내는지 또는 UTC나 현지 시간이 지정되어 있지 않은지 여부를 나타냅니다. Kind 필드는 현지 시간과 UTC 시간 간의 변환을 처리하는 데 사용되지만 시간 비교나 산술 연산에는 사용되지 않습니다. Kind 필드의 값은 Kind 속성을 사용하여 구할 수 있습니다.

DateTime 값

DateTime 형식의 시간 값에 대한 설명은 주로 GMT(그리니치 표준시)의 국제 승인 이름인 UTC(지역 표준시) 표준을 사용하여 표시됩니다. 지역 표준시는 UTC 시작 지점인 경도 0도에서 측정되는 시간입니다. 일광 절약 시간은 UTC에 적용되지 않습니다.

현지 시간은 특정 시간대에 상대적입니다. 시간대는 UTC 시작 지점부터 시간별로 측정되는 시간대의 이동을 나타내는 시간대 오프셋과 관련되어 있습니다. 또한 현지 시간은 경우에 따라 낮의 길이에서 한 시간을 더하거나 빼는 일광 절약 시간의 영향을 받기도 합니다. 따라서 현지 시간은 UTC에 시간대 오프셋을 추가하고 필요한 경우 일광 절약 시간에 따른 조정을 통해 계산됩니다. UTC 시작 지점의 시간대 오프셋은 0입니다.

UTC 시간은 날짜와 시간을 계산 및 비교하고 파일로 저장하는 데 적합합니다. 현지 시간은 사용자 인터페이스에 표시하는 데 적합합니다.

DateTime 개체의 Kind 속성이 Unspecified인 경우 표시되는 시간이 현지 시간인지 또는 UTC 시간인지 여부가 지정되지 않습니다. 개별 DateTime 멤버는 해당 멤버에 따라 적절하게 지정되지 않은 시간을 처리합니다.

DateTime 작업

Add 또는 Subtract와 같은 DateTime 구조체를 사용한 계산은 해당 구조체의 값을 수정하지 않습니다. 대신 계산 결과를 값으로 갖는 새 DateTime 구조체를 반환합니다.

현지 시간과 UTC 시간 간의 변환 연산에서는 일광 절약 시간을 고려하지만 산술 및 비교 연산에서는 이를 고려하지 않습니다.

DateTime 개체를 계산하고 비교하는 것은 개체가 동일한 시간대의 시간을 나타내는 경우에만 의미가 있습니다. 따라서 개체에 대한 시간대가 지정되지 않은 경우 DateTime 개체를 만든 시간대를 확인하는 데 사용할 수 있는 명시적인 변수나 정책과 같은 외부 메커니즘이 개발자에게 있는 것으로 가정합니다.

DateTime 멤버는 암시적으로 그레고리오력을 사용하여 해당 작업을 수행하지만, 달력을 지정하는 생성자의 경우와 System.Globalization.DateTimeFormatInfo와 같이 IFormatProvider에서 파생된 매개 변수를 사용하여 암시적으로 달력을 지정하는 메서드의 경우에는 해당되지 않습니다.

DateTime 형식의 멤버에서 수행하는 작업에서는 윤년 및 각 달의 날짜 수와 같은 정보를 고려합니다.

DateTime 및 TimeSpan 비교

DateTime 값 형식은 한 순간을 나타내는 반면 TimeSpan 값 형식은 시간 간격을 나타낸다는 점에서 DateTimeTimeSpan 값 형식이 서로 다릅니다. 예를 들어, DateTime 형식의 인스턴스에서 다른 인스턴스를 빼면 두 인스턴스 사이의 시간 간격을 얻을 수 있습니다. 또는 현재 DateTime 형식 값에 양의 TimeSpan 형식 값을 더하여 미래의 날짜를 계산할 수 있습니다.

DateTime 개체에서 시간 간격을 더하거나 뺄 수 있습니다. 시간 간격은 음수 또는 양수가 될 수 있으며 틱이나 초와 같은 단위로 표시하거나 TimeSpan 개체로 표시할 수 있습니다.

COM Interop 고려 사항

COM 응용 프로그램으로 전송된 다음 다시 관리되는 응용 프로그램으로 전송되는 DateTime 값을 라운드트립 값이라고 합니다. 그러나 시간만 지정하는 DateTime 값은 예상대로 라운드트립하지 않습니다.

오후 3시와 같이 시간만 라운드트립하는 경우 마지막 날짜와 시간은 서기 1년 1월 1일 오후 3시 대신 서기 1899년 12월 30일 오후 3시가 됩니다. 이것은 시간만 지정할 경우 .NET Framework와 COM에서 기본 날짜를 사용하기 때문입니다. 그러나 COM 시스템은 서기 1899년 12월 30일을 기준 날짜로 간주하는 반면 .NET Framework에서는 서기 1년 1월 1일을 기준 날짜로 간주합니다.

.NET Framework에서 COM으로 시간만 전달될 때는 해당 시간을 COM에서 사용하는 형식으로 변환하는 특수 처리가 수행되고, COM에서 .NET Framework로 시간만 전달될 때는 1899년 12월 30일 이전의 올바른 날짜와 시간이 손상될 수 있으므로 특수 처리가 수행되지 않습니다. 즉, COM에서 날짜의 라운드트립이 시작될 경우 .NET Framework와 COM에서 해당 날짜를 유지함을 의미하기도 합니다.

.NET Framework와 COM의 이러한 동작은 응용 프로그램에서 시간만 지정하는 DateTime을 라운드트립하는 경우 해당 응용 프로그램에서 마지막 DateTime 개체의 잘못된 날짜를 수정하거나 무시해야 함을 나타냅니다.

구현된 인터페이스

이 형식은 IComparable, IComparable, IFormattableIConvertible 인터페이스를 구현합니다. 변환을 위해 이 형식의 IConvertible 명시적 인터페이스 멤버 구현 대신 Convert 클래스를 사용합니다.

예제

다음 코드 예제에서는 거의 동일한 DateTime 값을 "equal"로 선언하여 작은 간격 차이를 허용하도록 해당 값을 비교하는 방법을 보여 줍니다.

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 
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));


    }
}
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( "d1 ~= d1 [true]: {0}", RoughlyEquals( d1, d1, window, freq ) );
   Console::WriteLine( "d1 ~= d2 [false]: {0}", RoughlyEquals( d1, d2, window, freq ) );
   Console::WriteLine( "d1 ~= d3 [false]: {0}", RoughlyEquals( d1, d3, window, freq ) );
   Console::WriteLine( "d1 ~= d4 [true]: {0}", RoughlyEquals( d1, d4, window, freq ) );
   Console::WriteLine( "d1 ~= d5 [true]: {0}", RoughlyEquals( d1, d5, window, freq ) );
   Console::WriteLine( "d1 ~= d6 [false]: {0}", RoughlyEquals( d1, d6, window, freq ) );
   Console::WriteLine( "d1 ~= d7 [false]: {0}", RoughlyEquals( d1, d7, window, freq ) );
   Console::WriteLine( "d1 ~= d8 [true]: {0}", RoughlyEquals( d1, d8, window, freq ) );
   Console::WriteLine( "d1 ~= d9 [true]: {0}", RoughlyEquals( d1, d9, window, freq ) );
}
class DateTimeTester
{
    public static boolean RoughlyEquals(DateTime time, 
        DateTime timeWithWindow, int windowInSeconds, int frequencyInSeconds)
    {
        long delta = (long)((TimeSpan)timeWithWindow.Subtract(time)).
            get_TotalSeconds() % frequencyInSeconds;
        delta = delta > windowInSeconds ? frequencyInSeconds - delta : delta;
        return (System.Convert.ToBoolean(System.Math.Abs(delta) 
            < windowInSeconds));
    } //RoughlyEquals

    public static void main(String[] args)
    {
        int window = 10;
        int freq = 60 * 60 * 2; // 2 hours;
        DateTime d1 = DateTime.get_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));
    } //main 
} //DateTimeTester 

스레드로부터의 안전성

이 형식의 모든 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.

플랫폼

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

버전 정보

.NET Framework

2.0, 1.1, 1.0에서 지원

.NET Compact Framework

2.0, 1.0에서 지원

참고 항목

참조

DateTime 멤버
System 네임스페이스
TimeSpan
Calendar
GetUtcOffset