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");
시간이 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 # 컴파일러를 사용하여이 코드를 테스트 할 수 있습니다.
도움이되기를 바랍니다.
또는 다음에 대한 호출에서 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
'Programing' 카테고리의 다른 글
모든 ASP.NET Web API 컨트롤러가 404를 반환합니다. (0) | 2020.12.10 |
---|---|
C #의 정적 메서드에서 비 정적 메서드를 호출하려면 어떻게해야합니까? (0) | 2020.12.10 |
복합 기본 키가 여전히 존재하는 이유는 무엇입니까? (0) | 2020.12.10 |
$ _GET이 있는지 확인하는 방법은 무엇입니까? (0) | 2020.12.10 |
조각 관리자에서 오래된 조각 제거 (0) | 2020.12.10 |