DateTime에서 시간대 가져 오기


103

.Net DateTime에 생성 된 시간대에 대한 정보가 포함되어 있습니까?

마지막에 "+ zz"가있는 형식에서 DateTime을 구문 분석하는 라이브러리가 있으며 올바르게 구문 분석하고 현지 시간을 조정하는 동안 DateTime 개체에서 특정 표준 시간대를 가져와야합니다.

이것이 가능합니까? 내가 볼 수있는 것은 DateTime.Kind로, 시간이 로컬인지 UTC인지를 지정합니다.


시간대 및 DateTimeStyles 처리에 대해서는 DateTime.Parse 설명서에 대한 참고 사항을 참조하십시오 . 그러나 당신이 원하는 것은 실제로 불가능합니다.
yoyo

답변:


136

DateTime 자체에는 실제 시간대 정보가 없습니다. 이 는 UTC 또는 로컬인지 알고 있지만 어떤 지역의 진짜 의미합니다.

DateTimeOffset이 다소 더 좋습니다. 기본적으로 UTC 시간과 오프셋입니다. 그러나 많은 다른 시간대가 어느 한 시점에서 동일한 오프셋을 가질 수 있으므로 시간대를 결정하는 데는 여전히 충분하지 않습니다. 날짜 / 시간을 파싱 할 때 작업해야 할 것은 오프셋뿐이기 때문에 이것은 충분할 것 같습니다.

.NET 3.5에서 표준 시간대에 대한 지원은 이전보다 훨씬 낫지 만 표준 "ZonedDateTime"또는 이와 유사한 것 (UTC 시간 및 실제 표준 시간대)을보고 싶습니다. 직접 빌드하는 것은 쉽지만 표준 라이브러리에서 보는 것이 좋을 것입니다.

편집 : 거의 4 년 후, 날짜 / 시간 유형이 다소 풍부한 Noda Time 을 사용하는 것이 좋습니다 . 나는 Noda Time의 주요 저자로서 편견이 있습니다. :)


2
CodePlex의 PublicDomain 프로젝트가이 작업을 수행합니다.
Cheeso

BCL의 TimeZone 열거 형은 세계 시간대가 정적이고 변경되지 않는 경우 유용합니다.
Jeff LaFay

1
@jlafay : 그러나 변경 사항이 있습니다. 예를 들어 작년에 Windows에 더 많은 시간대가 추가되었습니다.
Jon Skeet

이 프로젝트는 작성자가 더 이상 유지 관리하지 않습니다. publicdomain.codeplex.com 사용법에 따라이 기능이 도움이 될 수있을 것 같습니다. 사용하기 전에 설정해야합니다. timezone.codeplex.com
AnneTheAgile 2013 년

3
@AnneTheAgile는 : 개인적으로 나는 :) 물론, 내 자신의 노다 시간 라이브러리를 사용하는 것이 좋습니다 것입니다
존 소총

36

아니.

개발자는 일부 외부 메커니즘을 통해 DateTime 값과 관련된 시간대 정보를 추적 할 책임이 있습니다.

여기에 훌륭한 기사의 인용문 . 모든 .Net 개발자는 반드시 읽어야합니다.

그래서 제 조언은 당신의 필요에 맞는 작은 래퍼 클래스를 작성하는 것입니다.



2

TimeZoneInfo 클래스를 사용할 수 있습니다.

TimeZone 클래스는 현지 시간대를 인식하고 UTC (협정 세계시)와 현지 시간간에 시간을 변환 할 수 있습니다. TimeZoneInfo 개체는 모든 표준 시간대를 나타낼 수 있으며 TimeZoneInfo 클래스의 메서드를 사용하여 한 표준 시간대의 시간을 다른 표준 시간대의 해당 시간으로 변환 할 수 있습니다. TimeZoneInfo 클래스의 멤버는 다음 작업을 지원합니다.

  1. 운영 체제에서 이미 정의한 시간대를 검색합니다.

  2. 시스템에서 사용 가능한 시간대를 열거합니다.

  3. 다른 시간대 간의 시간 변환.

  4. 운영 체제에서 아직 정의하지 않은 새 표준 시간대를 만듭니다.

    나중에 검색하기 위해 시간대 직렬화.


1
...하지만 DateTime이 주어지면 TimeZoneInfo를 사용하여 DateTime의 TimeZone을 결정하는 방법이 아직 없습니다.
Remi Despres-Smyth

@ RemiDespres-Smyth 1 클래스에 DateTime과 함께 TimeZoneInfo를 저장합니다.
Konrad 19


0

일반적으로 데이터를 "시간대"UTC와 함께 DateTime으로 전달한 다음 TimeZoneInfo 개체를 전달하고 데이터를 표시 할 준비가되면 TimeZoneInfo 개체를 사용하여 UTC DateTime을 변환합니다.

다른 옵션은 현재 시간대로 DateTime을 설정 한 다음 DateTime 개체에 대해 "timezone"을 알 수 없는지 확인한 다음 전달 된 DateTime의 TimeZone을 나타내는 TimeZoneInfo와 함께 DateTime이 다시 전달되는지 확인하는 것입니다.

다른 사람들이 여기에서 지적했듯이, 마이크로 소프트가이 모든 것을 처리하기 위해 하나의 멋진 개체를 만들어 내면 좋을 것입니다. 그러나 지금은 두 개의 개체를 처리해야합니다.


0

DateTime은 시간대 오프셋을 알지 못합니다. 오프셋 또는 시간대 이름 (예 : EAT, CEST, EST 등)을 반환하는 기본 제공 방법은 없습니다.

다른 사람들이 제안한 것처럼 날짜를 UTC로 변환 할 수 있습니다.

DateTime localtime = new DateTime.Now;
var utctime = localtime.ToUniversalTime();

그런 다음 차이 만 계산하십시오.

TimeSpan difference = localtime - utctime;

또한 DateTimeOffset을 사용하여 한 번에 다른 시간으로 변환 할 수 있습니다.

DateTimeOffset targetTime = DateTimeOffset.Now.ToOffset(new TimeSpan(5, 30, 0));

그러나 이것은 일종의 손실 압축입니다. 오프셋만으로는 두 국가가 서로 다른 시간대에 있고 1 년 중 일부 (예 : 남아프리카 및 유럽)에 대해서만 동일한 시간을 가질 수 있으므로 어느 시간대인지 알 수 없습니다. 또한 서머 일광 절약 시간이 다른 날짜에 도입 될 수 있습니다 (EST와 CET-3 주 차이).

TimeZoneInfo 클래스를 사용하여 로컬 시스템 시간대의 이름을 가져올 수 있습니다.

TimeZoneInfo localZone = TimeZoneInfo.Local;
localZone.IsDaylightSavingTime(localtime) ? localZone.DaylightName : localZone.StandardName

나는 Gerrie Schenck에 동의합니다. 그가 제안한 기사를 읽으십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.