.Net DateTime에 생성 된 시간대에 대한 정보가 포함되어 있습니까?
마지막에 "+ zz"가있는 형식에서 DateTime을 구문 분석하는 라이브러리가 있으며 올바르게 구문 분석하고 현지 시간을 조정하는 동안 DateTime 개체에서 특정 표준 시간대를 가져와야합니다.
이것이 가능합니까? 내가 볼 수있는 것은 DateTime.Kind로, 시간이 로컬인지 UTC인지를 지정합니다.
.Net DateTime에 생성 된 시간대에 대한 정보가 포함되어 있습니까?
마지막에 "+ zz"가있는 형식에서 DateTime을 구문 분석하는 라이브러리가 있으며 올바르게 구문 분석하고 현지 시간을 조정하는 동안 DateTime 개체에서 특정 표준 시간대를 가져와야합니다.
이것이 가능합니까? 내가 볼 수있는 것은 DateTime.Kind로, 시간이 로컬인지 UTC인지를 지정합니다.
답변:
DateTime 자체에는 실제 시간대 정보가 없습니다. 이 수 는 UTC 또는 로컬인지 알고 있지만 어떤 지역의 진짜 의미합니다.
DateTimeOffset이 다소 더 좋습니다. 기본적으로 UTC 시간과 오프셋입니다. 그러나 많은 다른 시간대가 어느 한 시점에서 동일한 오프셋을 가질 수 있으므로 시간대를 결정하는 데는 여전히 충분하지 않습니다. 날짜 / 시간을 파싱 할 때 작업해야 할 것은 오프셋뿐이기 때문에 이것은 충분할 것 같습니다.
.NET 3.5에서 표준 시간대에 대한 지원은 이전보다 훨씬 낫지 만 표준 "ZonedDateTime"또는 이와 유사한 것 (UTC 시간 및 실제 표준 시간대)을보고 싶습니다. 직접 빌드하는 것은 쉽지만 표준 라이브러리에서 보는 것이 좋을 것입니다.
편집 : 거의 4 년 후, 날짜 / 시간 유형이 다소 풍부한 Noda Time 을 사용하는 것이 좋습니다 . 나는 Noda Time의 주요 저자로서 편견이 있습니다. :)
아니.
개발자는 일부 외부 메커니즘을 통해 DateTime 값과 관련된 시간대 정보를 추적 할 책임이 있습니다.
여기에 훌륭한 기사의 인용문 . 모든 .Net 개발자는 반드시 읽어야합니다.
그래서 제 조언은 당신의 필요에 맞는 작은 래퍼 클래스를 작성하는 것입니다.
이 .NET에 대한 공개 시간대 라이브러리 . 정말 유용합니다. 그것은 당신의 필요에 응답 할 것입니다.
일반적인 경우의 시간대 문제를 해결하는 것은 생각보다 어렵습니다.
TimeZoneInfo 클래스를 사용할 수 있습니다.
TimeZone 클래스는 현지 시간대를 인식하고 UTC (협정 세계시)와 현지 시간간에 시간을 변환 할 수 있습니다. TimeZoneInfo 개체는 모든 표준 시간대를 나타낼 수 있으며 TimeZoneInfo 클래스의 메서드를 사용하여 한 표준 시간대의 시간을 다른 표준 시간대의 해당 시간으로 변환 할 수 있습니다. TimeZoneInfo 클래스의 멤버는 다음 작업을 지원합니다.
운영 체제에서 이미 정의한 시간대를 검색합니다.
시스템에서 사용 가능한 시간대를 열거합니다.
다른 시간대 간의 시간 변환.
운영 체제에서 아직 정의하지 않은 새 표준 시간대를 만듭니다.
나중에 검색하기 위해 시간대 직렬화.
API ( http://msdn.microsoft.com/en-us/library/system.datetime_members(VS.71).aspx )에서 사용 된 시간대의 이름을 표시 할 수없는 것 같습니다.
일반적으로 데이터를 "시간대"UTC와 함께 DateTime으로 전달한 다음 TimeZoneInfo 개체를 전달하고 데이터를 표시 할 준비가되면 TimeZoneInfo 개체를 사용하여 UTC DateTime을 변환합니다.
다른 옵션은 현재 시간대로 DateTime을 설정 한 다음 DateTime 개체에 대해 "timezone"을 알 수 없는지 확인한 다음 전달 된 DateTime의 TimeZone을 나타내는 TimeZoneInfo와 함께 DateTime이 다시 전달되는지 확인하는 것입니다.
다른 사람들이 여기에서 지적했듯이, 마이크로 소프트가이 모든 것을 처리하기 위해 하나의 멋진 개체를 만들어 내면 좋을 것입니다. 그러나 지금은 두 개의 개체를 처리해야합니다.
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에 동의합니다. 그가 제안한 기사를 읽으십시오.