programing

날짜 시간.구문 분석("2012-09-30")T23:00:00.0000000Z")는 항상 DateTimeKind로 변환됩니다.현지의

skycolor 2023. 6. 11. 10:31
반응형

날짜 시간.구문 분석("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.RoundtripKindDateTime을 문자열로 변환하고 동일한 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니와 정확히 시간입니다.nowUTC라는 사실을 포함하여. 대체합니다.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부터 시작).

참조: ISO 8601

이전에도 유사한 문제가 발생했으며 몇 시간 후에 DateTime을 사용하게 되었습니다.종류 지정:

DateTime.SpecifyKind(inputDate, DateTimeKind.Utc);

저는 위의 댓글에서도 누군가가 이것을 회피했다고 생각합니다.

언급URL : https://stackoverflow.com/questions/10029099/datetime-parse2012-09-30t230000-0000000z-always-converts-to-datetimekind-l

반응형