다음을 통해 공유


DST를 포함하는 날짜 및 시간 처리

이 문서에서는 DST(일광 절약 시간제) 및 DST 2007 변경 내용이 특정 제품 및 기술에 미치는 영향을 포함하는 날짜 및 시간을 처리하는 방법을 설명합니다.

원래 제품 버전: Windows
원래 KB 번호: 932955

요약

날짜 및 시간을 처리하는 애플리케이션을 작성하는 개발자는 날짜 조작 및 시간 조작을 수행하는 하나 이상의 기술을 사용할 수 있습니다. 특히 특정 기본 운영 체제 API, C 런타임(CRT) 및 Microsoft .NET Framework 날짜 및 시간을 변환하거나 조작할 수 있습니다. 이 문서에서는 날짜 및 시간 처리와 관련된 몇 가지 일반적인 개념에 대해 설명합니다.

시간 저장 및 조작

타임스탬프는 날짜와 시간 조합을 지정하는 값입니다. 타임스탬프를 처리해야 하는 애플리케이션은 일반적으로 이러한 타임스탬프를 UTC(유니버설 조정 시간)에 저장합니다. UTC의 장점은 UTC가 범용이라는 것입니다. UTC에는 현지 표준 시간대 또는 DST가 적용되지 않습니다. 그러나 UTC는 사용자에게 친숙하지 않거나 대부분의 사용자와 관련이 없습니다. UTC는 스토리지에 대한 명백한 선택이지만 디스플레이에 적합한 선택은 아닙니다. 따라서 대부분의 애플리케이션은 사용자에게 타임스탬프를 표시하기 전에 UTC 시간을 현지 시간으로 변환합니다. 예를 들어 Windows Explorer 표준 시간대 및 DST 설정을 UTC 타임스탬프에 적용한 후 NTFS(New Technology File System) 디렉터리에 있는 파일의 날짜와 시간을 표시합니다.

UTC 시간에서 현지 시간으로의 변환은 두 오프셋을 적용하는 것으로 간주할 수 있습니다. 첫 번째는 표준 시간대 오프셋이고 두 번째는 DST 오프셋입니다. 따라서 현지 시간은 사실상 UTC 시간 및 표준 시간대 오프셋과 적용 가능한 모든 DST 오프셋입니다. 표준 시간대 오프셋은 매우 간단합니다. 컴퓨터가 특정 표준 시간대에 대해 구성되고 해당 표준 시간대에 UTC의 오프셋이 있습니다. DST 오프셋을 적용해야 하는지 여부를 결정하는 것은 훨씬 더 복잡합니다. 이 작업은 복잡하고 동적인 많은 규칙을 사용합니다.

이러한 복잡한 DST 규칙은 최근 DST 2007에서 변경되었습니다. 2007년부터 미국 새로운 시작 날짜와 DST의 새 종료 날짜를 채택했습니다. 또한 다른 국가/지역 및 정부가 제어하는 표준 시간대에서 DST의 시작 날짜와 종료 날짜를 정기적으로 변경하는 것이 일반적입니다. 다음 섹션에서는 DST 2007 변경이 개발자 관련 제품에 미치는 영향에 대해 설명합니다.

DST 2007에 대한 자세한 내용은 일광 절약 시간제 도움말 및 지원을 참조하세요.

Windows에 대한 DST 2007 효과

Windows 업데이트 및 Microsoft 업데이트에서 Windows에서 DST 2007 및 다음 연도에 대한 변경 내용을 올바르게 적용할 수 있는 업데이트를 사용할 수 있습니다. 이러한 업데이트가 적용된 후 컴퓨터가 DST를 통과할 때 Windows는 UTC 시간에서 현지 시간으로 현재 오프셋을 올바르게 계산합니다. 오프셋에는 기본 API 및 네트워킹 시간 관련 API에 대한 오프셋이 포함됩니다.

자세한 내용은 Windows 운영 체제에 대한 2007년 12월 누적 표준 시간대 업데이트를 참조하세요.

C 런타임에 대한 DST 2007 효과(CRT)

CRT는 날짜 번역 및 시간 번역도 수행합니다. 따라서 DST 2007에 대한 새 규칙을 포함하도록 CRT도 업데이트해야 합니다. CRT는 TZ 환경 변수가 설정되거나 기본 운영 체제 API 시간 호출이 실패하는 경우에만 자체 시간 처리를 수행합니다. 업데이트 Visual Studio의 각 버전에 포함된 CRT 및 Windows에 포함된 CRT에도 사용할 수 있습니다. 이러한 업데이트를 통해 CRT는 미국 표준 시간대에서 DST 변환을 계속 올바르게 처리할 수 있습니다.

DST 2007이 .NET Framework 미치는 영향

.NET Framework 기본 운영 체제 호출에 의존합니다. 따라서 .NET Framework 동작은 기본 운영 체제의 상태를 반영합니다. 별도의 업데이트가 필요하지 않습니다.

Visual Studio .NET IDE에 대한 DST 2007 효과

Visual Studio .NET IDE(통합 개발 환경)에는 Visual C++, Visual C#및 Visual Basic 버전 2002, 2003 및 2005가 포함됩니다. 이러한 제품은 CRT를 포함하기 때문에 영향을 받습니다. IDE 관련 업데이트는 필요하지 않습니다.

Visual Studio 2005 Team Foundation Server에 대한 DST 2007 효과

Visual Studio 2005 Team Foundation Server는 날짜 및 시간 변환을 위해 기본 운영 체제를 사용합니다. 따라서 Visual Studio 2005 Team Foundation Server는 운영 체제와 동일한 동작을 나타냅니다. Visual Studio 2005 Team Foundation Server는 SQL Server, SQL Server Reporting Services 및 Windows SharePoint Services 사용합니다. 컴퓨터는 운영 체제, SQL Server 및 Windows SharePoint Services 관련 업데이트로 업데이트해야 합니다. 모든 관련 업데이트는 영향을 받는 모든 컴퓨터에 동시에 적용되어야 합니다. 별도의 Visual Studio 2005 Team Foundation Server 업데이트가 필요하지 않습니다.

Visual Studio 2005 Team System에 대한 DST 2007 효과

Visual Studio 2005 Team System은 운영 체제, Visual Studio 2005 Team Foundation Server 및 CRT를 통해 영향을 받습니다. 별도의 Visual Studio 2005 Team System 업데이트가 필요하지 않습니다.

Visual Basic 6.0 런타임에 대한 DST 2007 효과

Visual Basic 6.0 런타임은 영향을 받지 않습니다.

Visual C++ 6.0에 대한 DST 2007 효과

Visual C++ 6.0은 더 이상 지원되지 않습니다. 자세한 내용은 Microsoft 수명 주기 정책을 참조하세요.

Windows Vista용 Windows SDK에 대한 DST 2007 효과

이 SDK(소프트웨어 개발 키트)에는 DST 2007 변경의 영향을 받는 CRT 버전이 포함되어 있습니다. 이 SDK 설치의 일부로 해당 버전의 CRT가 아직 설치되지 않은 컴퓨터에 Visual Studio 2005 CRT를 설치할 수 있습니다. 최신 버전의 CRT가 이미 설치된 경우 SDK 설치는 해당 최신 버전을 덮어쓰지 않습니다. SDK를 제거하면 최신 버전의 CRT가 컴퓨터에 남아 있습니다. SDK를 설치하기 전이나 후에 Visual Studio 2005 CRT 업데이트를 설치할 수 있습니다.

Windows Vista용 Windows SDK는 사용자 지정 C++ 애플리케이션의 일부로 CRT를 재배포하기 위해 Visual Studio 2005 CRT에 대한 병합 모듈 집합(.msm 파일)도 설치합니다. 재배포 가능 CRT를 애플리케이션의 설치 폴더에 배포하는 애플리케이션은 Windows Vista용 Windows SDK의 CRT .msm 파일 대신 Visual Studio 2005 CRT 업데이트에서 업데이트된 CRT를 배포해야 합니다. 재배포 가능 Visual Studio 2005 CRT 업데이트를 Windows 설치 폴더에 배포하는 애플리케이션은 해당 컴퓨터에 Visual Studio 2005 CRT 재배포 가능 업데이트를 적용해야 합니다.

Windows Server 2003 R2용 플랫폼 SDK에 대한 DST 2007 효과

이 SDK에는 DST 2007 변경의 영향을 받는 CRT 버전이 포함되어 있습니다. 고객은 이 SDK에 대한 릴리스 정보를 따르고 필요한 경우 Visual Studio 2005 CRT 업데이트를 사용해야 합니다.

.NET Framework 2.0 SDK에 대한 DST 2007 효과

이 SDK에는 DST 2007 변경의 영향을 받는 CRT 버전이 포함되어 있습니다. 이 SDK 설치의 일부로 해당 버전의 CRT가 아직 설치되지 않은 컴퓨터에 Visual Studio 2005 CRT를 설치할 수 있습니다. 최신 버전의 CRT가 이미 설치된 경우 SDK 설치는 해당 최신 버전을 덮어쓰지 않습니다. SDK를 제거하면 최신 버전의 CRT가 컴퓨터에 남아 있습니다. SDK를 설치하기 전이나 후에 Visual Studio 2005 CRT 업데이트를 설치할 수 있습니다.

Windows의 현지 시간 변환

애플리케이션은 일반적으로 시간 정보와 날짜 정보를 사용자에게 표시하기 전에 UTC 시간을 현지 시간으로 변환합니다. Windows는 타임스탬프 조작에 사용할 애플리케이션에 여러 API를 제공합니다.

  • 함수와 함수는 GetSystemTime() 구조체 또는 FILETIME 구조체에서 SYSTEMTIME 현재 UTC 시간을 GetSystemTimeAsFileTime() 가져옵니다.

  • 함수는 GetLocalTime() 구조체에서 현재 현지 시간을 SYSTEMTIME 가져옵니다.

  • 함수는 GetTimeZoneInformation() 컴퓨터의 TIME_ZONE_INFORMATION 현재 표준 시간대 및 DST 설정을 설명하는 구조를 가져옵니다.

  • 함수와 함수는 SystemTimeToFileTime()FileTimeToSystemTime() 구조체와 FILETIME 구조 간에 SYSTEMTIME 마샬링합니다.

  • 함수와 함수는 FileTimeToLocalFileTime() 현재 표준 시간대와 컴퓨터의 LocalFileTimeToFileTime() DST 설정을 사용하여 UTC와 현지 시간 사이의 구조를 변환하고 변환 FILETIME 합니다.

  • 함수와 함수는 TzSpecificTimeToSystemTime()SystemTimeToTzSpecificLocalTime() 구조체의 UTC 타임스탬프를 SYSTEMTIME 로컬 SYSTEMTIME 구조체로 변환합니다. 이러한 함수는 DST의 시작 날짜와 종료 날짜를 지정하는 구조를 사용합니다 TIME_ZONE_INFORMATION . 기본적으로 현재 DST 규칙은 이러한 구조가 제공되지 않을 때 사용됩니다.

  • 함수는 NetRemoteTOD() 서버의 정보 및 설정을 사용하여 원격 서버에서 시간을 가져옵니다.

참고

함수와 LocalFileTimeToFileTime() 함수는 FileTimeToLocalFileTime() 현재 표준 시간대 정보 및 DST 정보만 사용하여 UTC 시간과 현지 시간 간의 변환을 수행합니다. 이 변환은 변환되는 타임스탬프에 관계없이 발생합니다.

Windows Explorer 이 동작의 예를 보려면 DST를 사용하는 표준 시간대에 있는 컴퓨터에서 다음 단계를 수행합니다.

이러한 단계를 수행하려면 시스템 클록을 변경해야 합니다. 따라서 이러한 단계를 따르기 전에 이러한 시간 변경에 대응할 수 있는 일정 애플리케이션과 같은 모든 애플리케이션을 종료해야 합니다.

  1. 컴퓨터의 날짜를 DST 일로 변경합니다. 예를 들어 날짜를 2006년 7월 1일로 설정합니다.
  2. 동일한 컴퓨터의 NTFS 디렉터리에서 Test.txt 이라는 새 텍스트 파일을 만듭니다.
  3. 파일의 타임스탬프는 Windows Explorer 다음과 같이 표시됩니다.
    7/1/2006 3:37pm
  4. 컴퓨터의 날짜를 DST가 아닌 날로 변경합니다. 예를 들어 날짜를 2007년 2월 1일로 설정합니다.
  5. Windows Explorer 창을 새로 고칩니다.
  6. 파일의 타임스탬프는 Windows Explorer 다음과 같이 표시됩니다.
    7/1/2006 2:37pm

이전 예제에서는 파일의 UTC 타임스탬프가 변경되지 않습니다. 그러나 타임스탬프를 로컬 시간으로 변환하는 데 사용되는 규칙은 컴퓨터의 현재 날짜에 따라 변경됩니다. 3단계에서는 7월 1일이 DST 범위 내에 있기 때문에 DST 오프셋이 적용되었습니다. 6단계에서는 2월 1일이 DST 범위에 속하지 않으므로 DST 오프셋이 적용되지 않았습니다. 이 동작은 파일 타임스탬프를 현지 시간과 현지 시간으로 결정적으로 변환할 수 있도록 발생합니다.

메서드와 메서드는 SystemTimeToTzSpecificLocalTime()TzSpecificTimeToSystemTime() 제공된 구조를 사용하여 UTC 시간과 현지 시간 간에 변환합니다 TIME_ZONE_INFORMATION . 표준 시간대 정보가 제공되지 않으면 이러한 함수는 현재 표준 시간대 규칙 및 DST 규칙을 사용하여 DST 오프셋을 타임스탬프에 적용해야 하는지 여부를 결정합니다. 이는 현재 적용 중인 구조를 가져오기 위해 메서드를 TIME_ZONE_INFORMATION 호출 GetTimeZoneInformation() 하는 것과 기능적으로 동일합니다.

구조체에는 TIME_ZONE_INFORMATION DST의 시작 날짜와 중지 날짜가 포함됩니다. 따라서 구조체가 TIME_ZONE_INFORMATION 현재 표준 시간대 정보를 사용하는 경우 구조체는 TIME_ZONE_INFORMATION 역사적 부정확성을 도입할 수 있습니다. 이 동작은 현재 표준 시간대 정보와 DST 정보가 변환되는 타임스탬프를 반영하지 않는 경우에 발생할 수 있습니다. 이 동작은 DST가 시작되고 중지되는 날짜를 제어하는 규칙이 변경되었기 때문에 DST 2007의 영향을 받습니다.

이러한 함수에서 역사적으로 정확한 변환을 얻으려면 애플리케이션이 이러한 함수를 호출할 때 애플리케이션이 역사적으로 정확한 TIME_ZONE_INFORMATION 구조를 제공해야 합니다.

Windows의 동적 표준 시간대

Windows Vista에는 동적 DST 표준 시간대가 도입되었습니다. 동적 DST는 DST 경계가 해마다 변경되는 표준 시간대를 지원합니다. 이러한 규칙은 레지스트리에 저장됩니다. 애플리케이션은 함수를 사용하여 규칙을 쿼리할 GetDynamicTimeZoneInformation() 수 있습니다.

동적 표준 시간대를 사용하면 특히 연간 DST 경계가 미리 알려진 로캘의 경우 컴퓨터를 보다 쉽게 업데이트할 수 있습니다. Vista용 Windows SDK의 DYNAMIC_TIME_ZONE_INFORMATION 구조체에 대한 자세한 내용은 DYNAMIC_TIME_ZONE_INFORMATION 구조를 참조하세요.

C 런타임(CRT)의 현지 시간 변환

CRT에는 기본적으로 타임스탬프를 번역할 수 있는 세 가지 모드가 있습니다.

  • TZ 환경 변수가 설정되지 않은 경우 CRT는 Windows API를 호출하고 이 문서에 설명된 대로 Windows 동작을 표시합니다.

  • TZ 환경 변수가 설정된 경우 CRT는 해당 설정을 기반으로 자체 변환을 수행합니다. CRT는 이 시나리오에서 변환을 수행할 때 새 DST 2007 규칙을 준수할 수 있도록 업데이트되고 있습니다.

  • TZ 환경 변수가 설정되지 않았지만 기본 Windows API가 실패하면 CRT는 TZ 환경 변수에 PST8PDT 값을 사용하여 자체 변환으로 돌아갑니다.

CRT에는 UTC를 현지 시간으로 변환하기 위한 고유한 논리가 포함되어 있습니다. 애플리케이션은 함수와 같은 time() 함수에서 UTC 타임스탬프를 가져올 수 있습니다. 이러한 UTC 타임스탬프는 값에 time_t 저장됩니다. 함수와 같은 함수를 사용하여 현지 시간으로 변환할 localtime_s() 수 있습니다. 함수는 localtime_s() 헤더 파일에 정의된 Time.h 구조를 채웁니다tm. 구조체 tm 는 TZ 환경 변수에 정의된 표준 시간대와 타임스탬프 시 적용되는 DST 규칙을 기반으로 합니다.

참고

이 변환은 미국 관련된 규칙을 따릅니다.

DST 2007 업데이트를 적용하기 전에 CRT는 미국 표준 시간대에서 현재 타임스탬프를 올바르게 처리합니다. DST 2007 업데이트를 적용한 후 CRT는 과거 및 이후 미국 날짜도 모두 처리합니다. CRT에 대한 업데이트 참조 섹션에 나열됩니다.

.NET Framework 현지 시간 변환

.NET Framework 타임스탬프를 저장하고 변환하는 클래스를 포함합니다. 이러한 클래스에는 클래스, TimeZone 클래스, TimeSpan 클래스 및 클래스가 포함 DateTime 됩니다DateTimeKind. 앞에서 설명한 것처럼 이러한 클래스는 주로 기본 플랫폼 구현에 따라 달라집니다. 이러한 클래스는 기본 운영 체제 API와 동일한 동작을 표시합니다.

.NET Framework 날짜 클래스 및 시간 클래스에 의해 표시되는 흥미로운 동작 중 하나는 타임스탬프를 요청된 양으로 오프셋하는 함수와 관련이 있습니다. 예를 들어 클래스의 AddHours() 함수, AddMinutes() 함수 및 함수를 AddSeconds() 고려합니다 DateTime . 이러한 함수와 마찬가지로 명명된 함수는 DST 설정과 관계없이 요청된 양만큼 타임스탬프를 증가합니다. 이 동작은 기본 UTC 타임스탬프에서 간단한 산술 연산으로 간주될 수 있습니다. 그러나 이 동작은 추가로 인해 타임스탬프가 DST로 들어오거나 나가는 경우 예기치 않은 결과를 초래할 수 있습니다. 이 동작은 DST 2007 변경 내용과 관련이 없습니다.

권장 사항

다음 권장 사항은 개발자가 DST 2007의 효과를 최소화하고 일반적인 날짜 및 시간 처리를 개선하는 데 도움이 될 수 있습니다.

  • DST 2007 업데이트의 거의 원자성 설치를 계획해야 합니다. 계획된 모든 DST 2007 업데이트는 가능한 한 서로 가깝게 적용해야 합니다. 업데이트된 컴퓨터가 SQL 쿼리 또는 웹 서비스와 같은 메서드를 사용하여 업데이트되지 않은 컴퓨터와 통신하려고 하면 번역 오류가 발생할 수 있습니다. 마찬가지로 단일 컴퓨터에 Windows 업데이트 및 CRT 업데이트와 같은 두 개 이상의 업데이트가 필요한 경우 업데이트를 동시에 적용해야 합니다.

  • UTC 타임스탬프는 역사적으로 정확합니다. 일반적으로 대부분의 애플리케이션과 관련된 현지 시간으로의 변환입니다. 애플리케이션은 항상 UTC 타임스탬프를 저장해야 합니다. 표시를 위해 현지 시간으로 변환하려면 표준 시간대 정보 및 DST 정보가 필요합니다. 이 정보는 다음과 같은 여러 원본에서 제공됩니다.

    • 애플리케이션은 변환에 현재 표준 시간대 및 DST 설정을 사용할 수 있습니다. 현재 표준 시간대 및 DST 설정이 타임스탬프 당시에 적용되지 않은 경우 변환에 부정확성이 발생할 수 있습니다.

    • 애플리케이션은 UTC 타임스탬프 외에도 이전에 정확한 표준 시간대 정보 및 DST 정보를 저장할 수 있습니다.

    • 동적 표준 시간대를 사용할 수 있는 경우 애플리케이션은 동적 표준 시간대를 사용하여 특정 UTC 타임스탬프에 적용해야 하는 표준 시간대 정보를 결정할 수 있습니다. 이 옵션은 동적 표준 시간대 정보를 특정 타임스탬프 및 특정 표준 시간대에 사용할 수 있는 경우에만 사용할 수 있습니다.

    • 애플리케이션은 로컬 타임스탬프와 UTC 타임스탬프를 저장할 수 있습니다. 이 메서드는 나중에 변환할 필요가 없습니다.

  • 타임스탬프를 처리하는 컴퓨터 간의 모든 통신은 UTC 타임스탬프를 사용해야 합니다. 이렇게 하면 두 컴퓨터 모두 UTC에 대해 동일한 컨텍스트 정보를 암시적으로 제공합니다.

  • 애플리케이션이 날짜를 처리하는 경우 테스트에서 날짜가 처리되는 방식에 주의해야 합니다. 시간 정보 없이 표시되는 날짜는 일반적으로 관련 날짜에 오전 12시 타임스탬프로 저장됩니다. 따라서 타임스탬프의 시간 부분에서 하나씩 오류가 발생하면 시간이 전날 오후 11:00로 변경되면 유효 날짜가 하나씩 해제될 수 있습니다.

참조