为什么它不能解析此:
DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC")
为什么它不能解析此:
DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC")
Answers:
由于“ 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时间也称为“祖鲁语”时间,因为“祖鲁语”是北约语音字母中的“ Z”。
DateTime
了Kind
的Local
和调整时间戳。要始终获取UTC DateTime
,可以使用 DateTime.Parse("2008-01-01 00:00:00Z", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal)
@crokusek建议的或 DateTimeOffset.Parse("2008-01-01 00:00:00Z").UtcDateTime
@ruffin建议的之一。
http-equiv="last-modified"
,格式为2013-10-23 @ 17:23:00 UTC,可以吗?
假设您的日期时间使用格式“ o”,那么您就拥有“ 2016-07-24T18:47:36Z”,有一种非常简单的方法可以处理此问题。
致电DateTime.Parse("2016-07-24T18:47:36Z").ToUniversalTime()
。
打电话时会发生什么,您DateTime.Parse("2016-07-24T18:47:36Z")
会获得DateTime
当地时区的设置。因此它将其转换为当地时间。
将其ToUniversalTime()
更改为UTCDateTime
并将其转换回UTC时间。
只需使用:
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#编译器测试以下代码:
希望对您有所帮助。
您需要指定格式:
DateTime date = DateTime.ParseExact(
"Tue, 1 Jan 2008 00:00:00 UTC",
"ddd, d MMM yyyy HH:mm:ss UTC",
CultureInfo.InvariantCulture);
或在调用中使用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参数用于指定给定的字符串是协调的通用时间字符串。
Kind
返回DateTime
值的属性是” DateTimeKind.Local
。ParseExact正确地将其解析为UTC,但是在将其返回之前将其转换为本地时间。DateTimeStyles.RoundtripKind
如果希望返回的值原样返回为UTC,则使用此函数。
这不是有效的格式,但是“星期二,2008年1月1日00:00:00 GMT”是有效格式。
文档说像这样:
包含时区信息并符合ISO 8601的字符串。例如,以下两个字符串中的第一个指定协调世界时(UTC);第二个指定的时间是比UTC早七小时的时区:
2008-11-01T19:35:00.0000000Z
包含GMT指示符并符合RFC 1123时间格式的字符串。例如:
星期六,2008年11月1日19:35:00 GMT
一个字符串,其中包括日期和时间以及时区偏移信息。例如:
2009/03/01 05:42:00 -5:00
DateTime
带有Kind
的Local
我。如果您想确保在解析过程中不会脱离UTC旅行车,则解决方法似乎是使用DateTimeOffset.Parse(然后使用x.UtcDateTime
)。
我整理了一个实用程序方法,该方法使用了此处显示的所有技巧以及其他一些技巧:
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的任何内容。我还包括了第二种实用程序方法,该方法演示了如何解析从Web客户端提供给rest-api后端的最常见的日期字符串格式。请享用。
new Date().toUTCString()
在Javascript中使用IE9时,IE9仍会错误地添加“ UTC”