为什么它无法解析这个:
DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC")
它无法解析该字符串,因为"UTC"不是一个有效的时区标识符。
UTC时间是通过在时间字符串末尾添加'Z'来表示的,因此您的解析代码应如下所示:
DateTime.Parse("Tue, 1 Jan 2008 00:00:00Z");
从ISO 8601维基百科文章中获得以下信息:Kind
为Local
且已调整时间戳的DateTime
。若要始终获取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 建议的那样。 - Sergii Volchkovhttp-equiv="last-modified"
的元标记中,格式是 2013-10-23@17:23:00 UTC,这是可能的吗? - PreguntonCojoneroCabrónDateTime.Parse("Tue, 1 Jan 2008 00:00:00Z").Kind
返回的是 Local
,而不是 Utc
。 - marsze假设你使用格式为“o”的datetime,因此你有“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时间。
.ToUniversalTime()
转换:
DateTime.Parse("2016-07-24T18:47:36Z", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
- Marcel Wolterbeek只需使用那个:
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.Parse("Some:Time:here", "Utc")
。 - tisaconundrum或者在调用中使用AdjustToUniversal DateTimeStyle。
DateTime.ParseExact(String, String[], IFormatProvider, DateTimeStyles)
DateTime.TryParseExact("2012-01-30T00:28:00Z",
"yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture,
DateTimeStyles.AdjustToUniversal, out timeValue));
- RoboblobDateTimeStyles.AssumeUniversal
,但这不是你想要的,像第一个评论中建议的那样使用 AdjustToUniversal! - Carlos Sanchez您需要指定格式:
DateTime date = DateTime.ParseExact(
"Tue, 1 Jan 2008 00:00:00 UTC",
"ddd, d MMM yyyy HH:mm:ss UTC",
CultureInfo.InvariantCulture);
为了正确解析问题中给定的字符串而不改变它,请使用以下内容:
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参数用于指定给定字符串是协调世界时字符串。
DateTime
值的Kind
属性为DateTimeKind.Local
。”ParseExact正确解析为UTC,但在返回之前将其转换为本地时间。如果要使返回值作为UTC不变返回,请使用DateTimeStyles.RoundtripKind
。 - Daniel Schilling这不是有效的格式,但是"Tue, 1 Jan 2008 00:00:00 GMT"是有效的。
文档描述如下:
一个包含时区信息并符合ISO 8601标准的字符串。例如,以下两个字符串中的第一个指定协调世界时(UTC);第二个指定比UTC早七小时的时区时间:
2008-11-01T19:35:00.0000000Z
一个包含GMT标识符并符合RFC 1123时间格式的字符串。例如:
Sat, 01 Nov 2008 19:35:00 GMT
一个包含日期和时间以及时区偏移信息的字符串。例如:
03/01/2009 05:42:00 -5:00
Kind
为 Local
的 DateTime
对象。看起来解决方法是使用 DateTimeOffset.Parse (然后使用 x.UtcDateTime
) 来确保在解析过程中不会偏离 UTC 时间。 - ruffin 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'(单引号括起来)。这是最佳实践,因为区域设置会干扰字符的解释,例如'-'被解释为'/'或'.'或任何您的区域设置表示日期组件分隔符的字符。我还包括了第二个实用程序方法,展示了如何解析从Web客户端提供给REST API后端的大多数常见日期字符串格式。享受吧。
只需要用“GMT”替换“UTC”——简单易行,不会破坏正确格式的日期:
DateTime.Parse("Tue, 1 Jan 2008 00:00:00 UTC".Replace("UTC", "GMT"))
new Date().toUTCString()
时,IE9仍会错误地添加"UTC"。 - Chris S