IT

ISO 8601 형식에서 .NET DateTime을 만드는 방법

lottoking 2020. 7. 29. 07:36
반응형

ISO 8601 형식에서 .NET DateTime을 만드는 방법


DateTime을 ISO 8601 형식으로 바꾸는 방법을 찾았지만 C #에서 찾을 방법은 없습니다.

나는 그것을 가지고 있고 2010-08-20T15:00:00Z그것을 DateTime객체 로 바꾸고 싶다 .

나는 끈 부분을 스스로 분리 할 수는 이미 많은 국제 표준 인 조치를 위해 많은 일을하는 것처럼 보입니다.


이 솔루션은 DateTimeStyles 열거 형 을 사용 하고 Z 작동합니다.

DateTime d2 = DateTime.Parse("2010-08-20T15:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind);

이 솔루션을 완벽하게 인쇄합니다.


MSDN에 따르면 "s"및 "o"형식은 표준을 반영하지만 하위 집합 만 구문 분석 할 수있는 투표합니다. 포함되어있는 경우에 포함되어 있습니다. (기본 ISO8601 형식이나 용어가 낮은 형식에는 해당되지 않습니다. 그러나 정확히는 말할 것이 없습니다.) ISO8601을 구문 분석 할 때 사용자 지정 형식을 사용하는 이유입니다. 현재 내가 선호하는 스 니펫은 다음과 있습니다.

static readonly string[] formats = { 
    // Basic formats
    "yyyyMMddTHHmmsszzz",
    "yyyyMMddTHHmmsszz",
    "yyyyMMddTHHmmssZ",
    // Extended formats
    "yyyy-MM-ddTHH:mm:sszzz",
    "yyyy-MM-ddTHH:mm:sszz",
    "yyyy-MM-ddTHH:mm:ssZ",
    // All of the above with reduced accuracy
    "yyyyMMddTHHmmzzz",
    "yyyyMMddTHHmmzz",
    "yyyyMMddTHHmmZ",
    "yyyy-MM-ddTHH:mmzzz",
    "yyyy-MM-ddTHH:mmzz",
    "yyyy-MM-ddTHH:mmZ",
    // Accuracy reduced to hours
    "yyyyMMddTHHzzz",
    "yyyyMMddTHHzz",
    "yyyyMMddTHHZ",
    "yyyy-MM-ddTHHzzz",
    "yyyy-MM-ddTHHzz",
    "yyyy-MM-ddTHHZ"
    };

public static DateTime ParseISO8601String ( string str )
{
    return DateTime.ParseExact ( str, formats, 
        CultureInfo.InvariantCulture, DateTimeStyles.None );
}

TZ-less 확장을 구문 분석하지 않아도되는 경우 (내가하는) "s"행을 추가하여 적용되는 형식 변경 수를 크게 확장 할 수 있습니다.


using System.Globalization;

DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00",
    "s",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, out d);

다음은 나를 위해 더 잘 작동하는 것입니다 ( LINQPad 버전).

DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00Z",
    @"yyyy-MM-dd\THH:mm:ss\Z",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, 
    out d);
d.ToString()

생산

true
8/20/2010 8:00:00 AM

TryParseExact작동 하려면 ISO 문자열의 형식을 정확히 일치시키는 것이 중요합니다 . 나는 Exact가 정확하다고 생각 하며이 대답은 대부분의 사람들에게 분명하지만 어쨌든 ...

제 경우에는 Reb.Cabin의 답변이 작동하지 않습니다. 아래의 "값"에 따라 약간 다른 입력이 있기 때문입니다.

값: 2012-08-10T14:00:00.000Z

밀리 초 동안 거기에 약간의 추가 000이 있고 더있을 수 있습니다.

그러나 .fff아래와 같이 형식 에 일부 추가하면 모두 괜찮습니다.

형식 문자열 : @"yyyy-MM-dd\THH:mm:ss.fff\Z"

VS2010 직접 실행 창에서 :

DateTime.TryParseExact(value,@"yyyy-MM-dd\THH:mm:ss.fff\Z", CultureInfo.InvariantCulture,DateTimeStyles.AssumeUniversal, out d);

진실

DateTimeStyles.AssumeLocal시간이 어떤 지역에 따라 사용해야 할 수도 있습니다 .


이것은 LINQPad4에서 잘 작동합니다.

Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00Z"));
Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00"));
Console.WriteLine(DateTime.Parse("2010-08-20 15:00:00"));

DateTime.ParseExact(...) 각 문자가 무엇을 나타내는 지 파서에 알릴 수 있습니다.

참고 URL : https://stackoverflow.com/questions/3556144/how-to-create-a-net-datetime-from-iso-8601-format

반응형