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 문자열 형식과 정확히 일치하는 것이 중요합니다 . 나는 정확한 것이 정확 하고이 대답은 대부분 분명하지만 어쨌든 분명합니다 …
제 경우에는 아래의 “값”에 따라 약간 다른 입력이 있기 때문에 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(...)
파서에게 각 문자가 무엇을 나타내는 지 알려줄 수 있습니다.
