Programing

DateTime.Parse가 UTC 날짜를 구문 분석 할 수없는 이유

crosscheck 2020. 12. 10. 18:51
반응형

DateTime.Parse가 UTC 날짜를 구문 분석 할 수없는 이유


이것을 파싱 할 수 없습니까?

DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC")

"UTC"는 유효한 시간대 지정자가 아니므로 해당 문자열을 구문 분석 할 수 없습니다.

UTC 시간은 시간 문자열 끝에 'Z'를 추가하여 표시되므로 구문 분석 코드는 다음과 같아야합니다.

DateTime.Parse("Tue, 1 Jan 2008 00:00:00Z");

ISO 8601에 대한 Wikipedia 기사에서

시간이 UTC 인 경우 공백없이 시간 바로 뒤에 'Z'를 추가합니다. 'Z'는 제로 UTC 오프셋에 대한 영역 지정자입니다. 따라서 "09:30 UTC"는 "09 : 30Z"또는 "0930Z"로 표시됩니다. "14:45:15 UTC"는 "14 : 45 : 15Z"또는 "144515Z"입니다.

UTC 시간은 'Zulu'시간이라고도합니다. 'Zulu'는 'Z'의 NATO 음성 알파벳 단어이기 때문입니다.


날짜 시간에 "o"형식을 사용하여 "2016-07-24T18 : 47 : 36Z"를 사용한다고 가정하면이를 처리하는 매우 간단한 방법이 있습니다.

에게 전화하십시오 DateTime.Parse("2016-07-24T18:47:36Z").ToUniversalTime().

전화를 걸면 현지 시간대 DateTime.Parse("2016-07-24T18:47:36Z")DateTime설정됩니다. 따라서 현지 시간으로 변환합니다.

는이 ToUniversalTime()를 UTC로 변경하고 DateTime다시 UTC 시간으로 변환합니다.


형식을 지정해야합니다.

DateTime date = DateTime.ParseExact(
    "Tue, 1 Jan 2008 00:00:00 UTC", 
    "ddd, d MMM yyyy HH:mm:ss UTC", 
    CultureInfo.InvariantCulture);

다음을 사용하십시오.

var myDateUtc = DateTime.SpecifyKind(DateTime.Parse("Tue, 1 Jan 2008 00:00:00"), DateTimeKind.Utc);

if (myDateUtc.Kind == DateTimeKind.Utc)
{
     Console.WriteLine("Yes. I am UTC!");
}

온라인 C # 컴파일러를 사용하여이 코드를 테스트 할 수 있습니다.

http://rextester.com/

도움이되기를 바랍니다.


또는 다음에 대한 호출에서 AdjustToUniversal DateTimeStyle을 사용하십시오.

DateTime.ParseExact(String, String[], IFormatProvider, DateTimeStyles)

질문에 주어진 문자열을 변경하지 않고 올바르게 구문 분석하려면 다음을 사용하십시오.

using System.Globalization;

string dateString = "Tue, 1 Jan 2008 00:00:00 UTC";
DateTime parsedDate = DateTime.ParseExact(dateString, "ddd, d MMM yyyy hh:mm:ss UTC", CultureInfo.CurrentCulture, DateTimeStyles.AssumeUniversal);

이 구현에서는 문자열을 사용하여 구문 분석중인 날짜 문자열의 정확한 형식을 지정합니다. DateTimeStyles 매개 변수는 지정된 문자열이 조정 된 표준시 문자열임을 지정하는 데 사용됩니다.


유효한 형식은 아니지만 "Tue, 1 Jan 2008 00:00:00 GMT"는 유효합니다.

문서는 다음과 같이 말합니다.

표준 시간대 정보를 포함하고 ISO 8601을 준수하는 문자열입니다. 예를 들어 다음 두 문자열 중 첫 번째 문자열은 협정 세계시 (UTC)를 지정합니다. 두 번째는 UTC보다 7 시간 빠른 시간대의 시간을 나타냅니다.

2008-11-01T19 : 35 : 00.0000000Z

GMT 지정자를 포함하고 RFC 1123 시간 형식을 따르는 문자열입니다. 예를 들면 :

2008 년 11 월 1 일 토요일 19:35:00 GMT

시간대 오프셋 정보와 함께 날짜 및 시간을 포함하는 문자열입니다. 예를 들면 :

2009 년 3 월 1 일 05:42:00 -5 : 00


"UTC"를 "GMT"로 바꾸기 만하면됩니다. 간단하고 올바른 형식의 날짜가 깨지지 않습니다.

DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC".Replace("UTC", "GMT"))

여기에 표시된 모든 팁과 몇 가지 추가 정보를 사용하는 유틸리티 방법을 모았습니다.

    static private readonly string[] MostCommonDateStringFormatsFromWeb = {
        "yyyy'-'MM'-'dd'T'hh:mm:ssZ",  //     momentjs aka universal sortable with 'T'     2008-04-10T06:30:00Z          this is default format employed by moment().utc().format()
        "yyyy'-'MM'-'dd'T'hh:mm:ss.fffZ", //  syncfusion                                   2008-04-10T06:30:00.000Z      retarded string format for dates that syncfusion libs churn out when invoked by ejgrid for odata filtering and so on
        "O", //                               iso8601                                      2008-04-10T06:30:00.0000000
        "s", //                               sortable                                     2008-04-10T06:30:00
        "u"  //                               universal sortable                           2008-04-10 06:30:00Z
    };

    static public bool TryParseWebDateStringExactToUTC(
        out DateTime date,
        string input,
        string[] formats = null,
        DateTimeStyles? styles = null,
        IFormatProvider formatProvider = null
    )
    {
        formats = formats ?? MostCommonDateStringFormatsFromWeb;
        return TryParseDateStringExactToUTC(out date, input, formats, styles, formatProvider);
    }

    static public bool TryParseDateStringExactToUTC(
        out DateTime date,
        string input,
        string[] formats = null,
        DateTimeStyles? styles = null,
        IFormatProvider formatProvider = null
    )
    {
        styles = styles ?? DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal; //0 utc
        formatProvider = formatProvider ?? CultureInfo.InvariantCulture;

        var verdict = DateTime.TryParseExact(input, result: out date, style: styles.Value, formats: formats, provider: formatProvider);
        if (verdict && date.Kind == DateTimeKind.Local) //1
        {
            date = date.ToUniversalTime();
        }

        return verdict;

        //0 employing adjusttouniversal is vital in order for the resulting date to be in utc when the 'Z' flag is employed at the end of the input string
        //  like for instance in   2008-04-10T06:30.000Z
        //1 local should never happen with the default settings but it can happen when settings get overriden   we want to forcibly return utc though
    }

'-'및 'T'(작은 따옴표)의 사용에 유의하십시오. 이는 지역 설정이 '-'와 같은 문자의 해석을 방해하여 '/'또는 '.'로 해석되기 때문에 모범 사례로 수행됩니다. 또는 지역 설정이 date-components-separator로 표시하는 모든 것. 또한 웹 클라이언트의 rest-api 백엔드에 제공되는 가장 일반적으로 보이는 날짜 문자열 형식을 구문 분석하는 방법을 보여주는 두 번째 유틸리티 메서드도 포함했습니다. 즐겨.


이유는 모르지만 DateTime.ToUniversalTime을 try / catch로 래핑하고 더 많은 코드에서 동일한 결과를 얻을 수 있습니다.

행운을 빕니다.

참고URL : https://stackoverflow.com/questions/1756639/why-cant-datetime-parse-parse-utc-date

반응형