it-source

UTC/GMT 시간을 현지 시간으로 변환

criticalcode 2023. 5. 11. 21:32
반응형

UTC/GMT 시간을 현지 시간으로 변환

우리는 웹 서비스 고객을 위한 C# 애플리케이션을 개발하고 있습니다.Windows XP PC에서 실행됩니다.

웹 서비스에서 반환되는 필드 중 하나는 DateTime 필드입니다.서버는 GMT 형식의 필드, 즉 끝에 "Z"를 반환합니다.

하지만, 우리는 그것을 발견했습니다.NET은 일종의 암묵적인 변환을 하는 것처럼 보였고 시간은 항상 12시간 밖에 있었습니다.

다음 코드 샘플은 12시간 차이가 사라졌지만 NZ 일광 절약 시간을 허용하지 않는다는 점에서 어느 정도 해결됩니다.

CultureInfo ci = new CultureInfo("en-NZ");
string date = "Web service date".ToString("R", ci);
DateTime convertedDate = DateTime.Parse(date);            

다음 날짜 사이트 기준:

UTC/GMT 오프셋

UTC/GMT : UTC/GMT +12 시간대
시간: + 사용 가능: +1시간
현재 시간대 오프셋: UTC/GMT +13시간

우리는 추가 시간에 어떻게 적응합니까?이 작업을 프로그래밍 방식으로 수행할 수 있습니까? 아니면 PC의 설정입니까?

다음과 같은 문자열의 경우2012-09-19 01:27:30.000,DateTime.Parse날짜 및 시간이 어느 시간대에서 왔는지 알 수 없습니다.

DateTime에는 다음 세 가지 표준 시간대 옵션 중 하나인 Kind 속성이 있습니다.

  • 지정되지 않음
  • 현지의
  • Utc

메모 UTC 또는 현지 시간대 이외의 날짜/시간을 표시하려면 를 사용해야 합니다.


그래서 당신의 질문에 있는 코드는:

DateTime convertedDate = DateTime.Parse(dateStr);

var kind = convertedDate.Kind; // will equal DateTimeKind.Unspecified

어떤 종류인지 안다고 하니, 말해보세요.

DateTime convertedDate = DateTime.SpecifyKind(
    DateTime.Parse(dateStr),
    DateTimeKind.Utc);

var kind = convertedDate.Kind; // will equal DateTimeKind.Utc

되면 이제시이스 UTC 시되걸전수있다습니를로 를 걸 수 .ToLocalTime:

DateTime dt = convertedDate.ToLocalTime();

이렇게 하면 원하는 결과를 얻을 수 있습니다.

시스템을 사용하는 방법을 알아보겠습니다.에 있는 경우 TimeZoneInfo 클래스입니다.NET 3.5.http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx 을 참조하십시오.이는 일광 절약 시간제가 올바르게 변경되는 것을 고려해야 합니다.

// Coordinated Universal Time string from 
// DateTime.Now.ToUniversalTime().ToString("u");
string date = "2009-02-25 16:13:00Z"; 
// Local .NET timeZone.
DateTime localDateTime = DateTime.Parse(date); 
DateTime utcDateTime = localDateTime.ToUniversalTime();

// ID from: 
// "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zone"
// See http://msdn.microsoft.com/en-us/library/system.timezoneinfo.id.aspx
string nzTimeZoneKey = "New Zealand Standard Time";
TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(nzTimeZoneKey);
DateTime nzDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, nzTimeZone);
TimeZone.CurrentTimeZone.ToLocalTime(date);

DateTime객체는 다음을 가집니다.KindUnspecified기본적으로, 어떤 목적으로.ToLocalTime는 것으로 추정됩니다.UTC.

Unspecified DateTime따라서 개체는 다음과 같이 수행하면 됩니다.

convertedDate.ToLocalTime();

변경 단계는 다음과 같습니다.Kind의 시대의DateTimeUnspecifiedUTC불필요합니다. Unspecified는 것으로 추정됩니다.UTCToLocalTime: http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx

이것이 오래된 질문이라는 것을 알지만, 저는 비슷한 상황에 부딪혔고, 저를 포함한 미래의 검색자들을 위해 제가 발견한 것을 공유하고 싶었습니다. :)

DateTime.Parse()까다로울 수 있습니다. 예를 들어 여기를 참조하십시오.

에 약에만.DateTime는 웹 또는 으로, 예를 " 또알서는형다식소제다스공서에됩니른웹의려진비스제다▁something니공▁like▁want▁is▁with됩▁you,서스소▁coming▁might▁a"와 같은 것을 고려해 것이 좋을 것입니다. 다음과 같은 것을 고려해 보십시오.

DateTime.ParseExact(dateString, 
                   "MM/dd/yyyy HH:mm:ss", 
                   CultureInfo.InvariantCulture, 
                   DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal)

아니면, 더 좋은 것은,

DateTime.TryParseExact(...)

AssumeUniversalUTC임을 . flag는 UTC의 입니다.AssumeUniversal그리고.AdjustToUniversal는 결과를 기본적으로 수행하려는 "로컬" 시간으로 변환하지 않도록 지시합니다. (저는 개인적으로 어쨌든 비즈니스/애플리케이션/서비스 계층에서 UTC와 독점적으로 거래하려고 합니다.)하지만 현지 시간으로 변환하는 것을 우회하는 것도 속도를 높여줍니다. 제 테스트에서는 아래를 참조하십시오.)

우리가 전에 했던 일은 다음과 같습니다.

DateTime.Parse(dateString, new CultureInfo("en-US"))

우리는 앱을 프로파일링했고 날짜 시간을 발견했습니다.구문 분석은 CPU 사용량의 상당한 비율을 나타냅니다.(우연하게도,CultureInfo생성자는 CPU 사용에 중요한 기여를 하지 않았습니다.)

그래서 저는 콘솔 앱을 설정하여 날짜/시간 문자열을 10000번 다양한 방법으로 구문 분석합니다.결론:
Parse() 10인치
ParseExact()로컬로 ) ms (로컬로 변환) 20-45 ms
ParseExact()되지 않음) ms (로컬로 변환되지 않음) 10-15 ms
네, 네, 결는다같다의 입니다.Parse()다른 은 밀리초 단위인 반면, 시간은 밀리초 단위는 밀리초 단위입니다.

일반적인 주의 사항을 추가하고 싶습니다.

컴퓨터의 내부 시계에서 현재 시간을 가져와 디스플레이나 보고서에 날짜/시간을 표시하는 것만 수행하는 경우 모든 것이 정상입니다.그러나 나중에 참조할 수 있도록 날짜/시간 정보를 저장하거나 날짜/시간을 계산하는 경우 주의하십시오!

UTC에 그리고 당신은 그것이 현지 시간이 몇 시였는지 알고 싶어합니다.
아마도 적어도 세 명의 '현지인'이 관련되어 있을 것입니다.로컬은 호놀룰루를 의미하거나 컴퓨터가 있는 위치를 의미하거나 고객이 있는 위치를 의미할 수 있습니다.
기본 제공 기능을 사용하여 변환을 수행하면 잘못된 것일 수 있습니다.이는 일광 절약 시간제가 현재 컴퓨터에 적용되고 있지만 12월에는 적용되지 않았기 때문입니다.그러나 Windows는 이를 알지 못합니다.일광 절약 시간제가 현재 적용되고 있는지 여부를 확인하는 플래그가 하나뿐입니다.그리고 만약 그것이 현재 시행되고 있다면, 그것은 12월의 데이트에 기꺼이 한 시간을 추가할 것입니다.
일광 절약 시간제는 다양한 정치적 부분에서 다르게 구현됩니다(또는 전혀 구현되지 않습니다).특정 날짜에 당신의 나라가 바뀐다고 해서, 다른 나라들도 그렇게 될 거라고 생각하지 마세요.

@TimeZoneInfo.ConvertTimeFromUtc(timeUtc, TimeZoneInfo.Local)

DateTime 개체가 이미 있고 UTC인지 로컬인지 확실하지 않은 경우에는 개체에 대한 메서드를 직접 사용할 수 있습니다.

DateTime convertedDate = DateTime.Parse(date);
DateTime localDate = convertedDate.ToLocalTime();

우리는 추가 시간에 어떻게 적응합니까?

지정되지 않은 경우 .net은 로컬 PC 설정을 사용합니다.다음을 읽겠습니다: http://msdn.microsoft.com/en-us/library/system.globalization.daylighttime.aspx .

보기에 코드는 다음과 같이 보일 수 있습니다.

DaylightTime daylight = TimeZone.CurrentTimeZone.GetDaylightChanges( year );

그리고 위에서 언급한 것처럼 서버가 어느 시간대에 설정되어 있는지 두 번 확인합니다.인터넷에는 IIS의 변경사항에 안전하게 영향을 미치는 방법에 대한 기사가 있습니다.

다나의 제안에 대한 답변:

이제 코드 샘플은 다음과 같습니다.

string date = "Web service date"..ToString("R", ci);
DateTime convertedDate = DateTime.Parse(date);            
DateTime dt = TimeZone.CurrentTimeZone.ToLocalTime(convertedDate);

원래 날짜는 2008년 8월 20일이었고, 종류는 UTC였습니다.

"변환된 날짜"와 "dt"는 모두 동일합니다.

21/08/08 10:00:26; 그 종류는 지역적이었습니다.

데이터 컬럼의 DateType 필드가 local로 설정되어 있기 때문에 자동으로 변경되는 데이터 세트(웹 서비스에서 클라이언트로)에 있는 것에 문제가 있었습니다.데이터 세트를 푸시하는 경우 DateType이 무엇인지 확인해야 합니다.

변경하지 않으려면 지정 안 함으로 설정

Twitter API(상태에 대한 created_at 필드)를 통해 UTC 날짜에 문제가 있을 때 이 질문을 발견했습니다.DateTime으로 변환해야 합니다.이 페이지의 답변/코드 샘플 중 "String was not recognized as a valid DateTime" 오류가 발생하는 것을 막기에 충분한 답변/코드 샘플이 없습니다(SO에서 정답을 찾는 데 가장 근접했습니다).

이것이 다른 사람에게 도움이 될 경우를 대비하여 여기에 이 링크를 게시하는 것 - 제가 필요로 하는 답은 블로그 게시물인 http://www.wduffy.co.uk/blog/parsing-dates-when-aspnets-datetimeparse-doesnt-work/ 에서 발견되었습니다 - 기본적으로 DateTime을 사용합니다.DateTime 대신 형식 문자열을 사용하여 ParseExact.구문 분석

이 코드 블록은 범용 시간을 사용하여 현재 DateTime 개체를 변환한 다음 다시 로컬 DateTime으로 변환합니다.저에게 딱 맞습니다. 도움이 되기를 바랍니다!

CreatedDate.ToUniversalTime().ToLocalTime();

언급URL : https://stackoverflow.com/questions/179940/convert-utc-gmt-time-to-local-time

반응형