[c#] DateTime에서 시간대 가져 오기

.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 클래스의 멤버는 다음 작업을 지원합니다.

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

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

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

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

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


답변

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에 동의합니다. 그가 제안한 기사를 읽으십시오.