날짜 시간.구문 분석("2012-09-30")T23:00:00.0000000Z")는 항상 DateTimeKind로 변환됩니다.현지의
UTC 형식으로 DateTime을 나타내는 문자열을 구문 분석하려고 합니다.
내 문자열 표현에는 줄루 시간 사양이 포함되어 있으며, 줄루 시간은 문자열이 UTC 시간을 나타냅니다.
var myDate = DateTime.Parse("2012-09-30T23:00:00.0000000Z");
위에서 나는 나의 데이트를 기대합니다.DateTimeKind가 되어주셔서 감사합니다.UTC, 대신 DatetimeKind입니다.현지의.
내가 무엇을 잘못하고 있으며 UTC 시간을 나타내는 문자열을 구문 분석하는 방법은 무엇입니까?
감사합니다!
저는 제 노다 타임 프로젝트를 개인적으로 사용할 것입니다. (저는 작가로서 편견을 가지고 있지만 더 깨끗할 것입니다...) 하지만 그렇게 할 수 없다면...
둘 중 하나 사용DateTime.ParseExact
사용자가 예상하는 정확한 형식을 지정DateTimeStyles.AssumeUniversal
그리고.DateTimeStyles.AdjustToUniversal
구문 분석 코드:
using System;
using System.Globalization;
class Test
{
static void Main()
{
var date = DateTime.ParseExact("2012-09-30T23:00:00.0000000Z",
"yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal |
DateTimeStyles.AdjustToUniversal);
Console.WriteLine(date);
Console.WriteLine(date.Kind);
}
}
(기본적으로 로컬로 조정되는 이유는 다음과 같습니다.AdjustToUniversal
내가 할 수 있는 일은 아니지만, 신경쓰지 마...)
편집: 매티토모의 제안에 대한 제 반대 의견을 확대하기 위해, 저는 그것이 정보를 잃을 것이라는 것을 증명하는 것을 목표로 했습니다.저는 지금까지 실패했지만 매우 특이한 방식으로 실패했습니다.이것을 보십시오. 2012년 10월 28일 오전 2시(UTC 오전 1시)에 시계가 돌아가는 유럽/런던 시간대에서 실행됩니다.
DateTime local1 = DateTime.Parse("2012-10-28T00:30:00.0000000Z");
DateTime local2 = DateTime.Parse("2012-10-28T01:30:00.0000000Z");
Console.WriteLine(local1 == local2); // True
DateTime utc1 = TimeZoneInfo.ConvertTimeToUtc(local1);
DateTime utc2 = TimeZoneInfo.ConvertTimeToUtc(local2);
Console.WriteLine(utc1 == utc2); // False. Hmm.
어딘가에 "DST 포함 또는 없음" 플래그가 저장되어 있는 것처럼 보이지만, 어디서 해결할 수 있다면 저는 화가 날 것입니다.주 정부 문서
dateTime이 모호한 시간에 해당하는 경우 이 방법은 원본 시간대의 표준 시간으로 가정합니다.
변환할 때는 그렇지 않은 것 같습니다.local2
...
편집: 좋습니다. 사용하는 프레임워크의 버전에 따라 더 이상해집니다.이 프로그램을 고려해 보십시오.
using System;
using System.Globalization;
class Test
{
static void Main()
{
DateTime local1 = DateTime.Parse("2012-10-28T00:30:00.0000000Z");
DateTime local2 = DateTime.Parse("2012-10-28T01:30:00.0000000Z");
DateTime utc1 = TimeZoneInfo.ConvertTimeToUtc(local1);
DateTime utc2 = TimeZoneInfo.ConvertTimeToUtc(local2);
Console.WriteLine(utc1);
Console.WriteLine(utc2);
DateTime utc3 = local1.ToUniversalTime();
DateTime utc4 = local2.ToUniversalTime();
Console.WriteLine(utc3);
Console.WriteLine(utc4);
}
}
따라서 두 개의 다른 UTC 값을 사용하여 다음과 같이 구문 분석합니다.DateTime.Parse
그런 다음 두 가지 방법으로 UTC로 다시 변환합니다.
.NET 3.5에 따른 결과:
28/10/2012 01:30:00 // Look - we've lost information
28/10/2012 01:30:00
28/10/2012 00:30:00 // But ToUniversalTime() seems okay...
28/10/2012 01:30:00
.NET 4.5 베타 버전의 결과:
28/10/2012 00:30:00 // It's okay!
28/10/2012 01:30:00
28/10/2012 00:30:00
28/10/2012 01:30:00
평소처럼 존의 대답은 매우 포괄적입니다.그렇긴 하지만, 아직 아무도 이 사건에 대해 언급하지 않았습니다.DateTimeStyles.RoundtripKind
DateTime을 문자열로 변환하고 동일한 DateTime으로 되돌리려는 경우(저장 시간 포함)DateTime.Kind
설정), 사용DateTimeStyles.RoundtripKind
깃발
Jon이 말했듯이, DateTime 개체를 문자열로 변환할 때 "O" 형식을 사용하는 것이 올바른 방법입니다.이렇게 하면 정밀도 및 표준 시간대 정보가 모두 보존됩니다.다시, Jon이 말했듯이, 사용합니다.DateTime.ParseExact
DateTimeStyles를하면.그러나 DateTimeStyles를 사용하는 경우.RoundtripKind, 당신은 항상 당신이 넣은 것을 돌려받습니다.
var now = DateTime.UtcNow;
var strNow = now.ToString("O");
var newNow = DateTime.ParseExact(strNow, "O", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
코드에서, 위코드서에의,서,newNow
는 와정히같시은다니간입확▁as다▁a▁same니와 정확히 시간입니다.now
UTC라는 사실을 포함하여. 대체합니다.DateTime.Now
위해서DateTime.UtcNow
수 것입니다.now
로 돌아가다.newNow
하지만 이번에는 현지 시간으로.
제 목적을 위해, 저는 전달되고 변환된 것이 정확히 같은 것으로 다시 변환되도록 확실히 하고 싶었기 때문에 이것이 옳은 일이었습니다.
을 합니다.TimeZoneInfo
다음을 사용하여 클래스를 만듭니다.
var myDate = TimeZoneInfo.ConvertTimeToUtc(DateTime.Parse("2012-09-30T23:00:00.0000000Z"));
메소드에는 할 수 있습니다.yyyy-MM-ddTHH:mm:ss.ffffffK
이렇게 하면 마지막에 표준 시간대 정보를 적절하게 처리할 수 있습니다(.NET 2.0부터 시작).
이전에도 유사한 문제가 발생했으며 몇 시간 후에 DateTime을 사용하게 되었습니다.종류 지정:
DateTime.SpecifyKind(inputDate, DateTimeKind.Utc);
저는 위의 댓글에서도 누군가가 이것을 회피했다고 생각합니다.
언급URL : https://stackoverflow.com/questions/10029099/datetime-parse2012-09-30t230000-0000000z-always-converts-to-datetimekind-l
'programing' 카테고리의 다른 글
WebAPI 컨트롤러에서 작업을 찾을 수 없습니다. (0) | 2023.06.11 |
---|---|
Laravel + Vuex: 개체/인수 분해가 작동하지 않습니다. (0) | 2023.06.11 |
R의 적용 가족은 통사적인 설탕 이상입니까? (0) | 2023.06.11 |
Nodejs 암호화 형식 스크립트 파일 (0) | 2023.06.11 |
firebase-tools "-firebase: firebase: 명령을 찾을 수 없습니다." (0) | 2023.06.06 |