웹 서비스 클라이언트를위한 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 +12 시간
일광 절약 시간 : +1 시간
현재 시간대 오프셋 : UTC / GMT +13 시간
여분의 시간을 어떻게 조정합니까? 프로그래밍 방식으로 수행 할 수 있습니까? 아니면 PC에서 어떤 설정입니까?
답변
같은 문자열의 경우 2012-09-19 01:27:30.000
, DateTime.Parse
날짜와 시간에서 어떤 시간대 말할 수 없다.
DateTime
이 종류의 세 가지 시간대 옵션 중 하나를 가질 수 속성을 :
- 불특정
- 현지
- Utc
참고 UTC 또는 현지 시간대 이외의 날짜 / 시간을 나타내려면을 사용해야합니다 DateTimeOffset
.
따라서 질문의 코드는 다음과 같습니다.
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();
필요한 결과를 얻을 수 있습니다.
답변
.NET 3.5 인 경우 System.TimeZoneInfo 클래스를 사용하는 방법을 살펴 보겠습니다. 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
객체는이 Kind
의를 Unspecified
의 목적을 위해 기본적 ToLocalTime
으로 간주됩니다 UTC
.
Unspecified
DateTime
객체 의 현지 시간을 얻으려면 다음 을 수행하면됩니다.
convertedDate.ToLocalTime();
변화의 단계 Kind
의이 DateTime
에서 Unspecified
로는 UTC
불필요하다. Unspecified
로 가정 UTC
의 목적을 위해 ToLocalTime
: http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspx
답변
나는 이것이 더 오래된 질문이라는 것을 알고 있지만 비슷한 상황에 빠졌으며 나 자신을 포함하여 미래의 검색 자에게 찾은 것을 공유하고 싶었습니다. 🙂
DateTime.Parse()
까다로울 수 있습니다- 예를 들어 여기 를 참조 하십시오 .
DateTime
웹 서비스 또는 알려진 형식의 다른 소스에서 오는 경우 다음과 같은 것을 고려할 수 있습니다.
DateTime.ParseExact(dateString,
"MM/dd/yyyy HH:mm:ss",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal)
또는 더 나은
DateTime.TryParseExact(...)
AssumeUniversal
플래그는 날짜 / 시간이 이미 UTC 것을 파서를 알려줍니다; 의 조합 AssumeUniversal
과 AdjustToUniversal
는 기본적으로 수행하려고 할 것 “로컬”시간에 결과를 변환하지를 알려줍니다. (어쨌든 비즈니스 / 응용 프로그램 / 서비스 계층에서 UTC를 독점적으로 처리하려고 시도하지만 현지 시간으로의 전환을 우회하면 테스트에서 50 % 이상 속도가 빨라집니다 (아래 참조).
우리가 전에 한 일은 다음과 같습니다.
DateTime.Parse(dateString, new CultureInfo("en-US"))
앱을 프로파일 링 한 결과 DateTime.Parse가 CPU 사용률의 상당 부분을 차지한다는 것을 알았습니다. (우연히도 CultureInfo
생성자는 CPU 사용량에 크게 기여 하지 않았습니다 .)
그래서 다양한 방법으로 날짜 / 시간 문자열을 10000 번 구문 분석하도록 콘솔 앱을 설정했습니다. 결론 :
Parse()
10 초
ParseExact()
(로컬로 변환) 20-45 ms
ParseExact()
(로컬로 변환하지 않음) 10-15 ms
… 및 예, 결과 Parse()
는 초 단위 이지만 다른 결과는 밀리 초 입니다.
답변
일반적인주의 사항을 추가하고 싶습니다.
컴퓨터 내부 시계에서 현재 시간을 가져 와서 디스플레이 또는 보고서에 날짜 / 시간을 입력하면 모든 것이 정상입니다. 그러나 나중에 참조하기 위해 날짜 / 시간 정보를 저장 하거나 날짜 / 시간을 계산하는 경우주의하십시오!
2007 년 12 월 20 일 15:00 UTC에 호놀룰루에 유람선이 도착했다고 가정 해 봅시다. 그리고 당신은 그것이 어떤 현지 시간인지 알고 싶어합니다.
1. 아마도 적어도 세 곳의 ‘로컬’이 관련되어있을 것입니다. 로컬은 호놀룰루를 의미하거나 컴퓨터가있는 위치를 의미하거나 고객이있는 위치를 의미 할 수 있습니다.
2. 내장 함수를 사용하여 변환을 수행하면 잘못되었을 수 있습니다. 일광 절약 시간 제가 현재 컴퓨터에는 유효하지만 12 월에는 유효하지 않기 때문입니다. 그러나 Windows는 이것을 알지 못합니다 … 일광 절약 시간 제가 현재 유효한지 여부를 결정하는 플래그는 하나뿐입니다. 현재 시행 중이라면 12 월의 날짜에도 한 시간을 더할 수 있습니다.
삼.일광 절약 시간제는 다양한 정치적 세분에서 다르게 구현되거나 전혀 구현되지 않습니다. 국가가 특정 날짜에 변경되어 다른 국가도 변경 될 것이라고 생각하지 마십시오.
답변
@TimeZoneInfo.ConvertTimeFromUtc(timeUtc, TimeZoneInfo.Local)