以特定格式解析日期和时间

Parse Date and Time in specific format

我正在获取以下格式的时间戳字符串 -

2015-02-01T12:11:06Z

我需要将它转换成 DateTime 对象。我为此尝试了以下代码 -

timestamp = DateTime.ParseExact(attr.Value,"yyyy-MM-ddThh:mm:ss",null);

但是它抛出异常。

System.FormatException: String was not recognized as a valid DateTime.

at System.DateTimeParse.ParseExact(String s, String format, DateTimeFormatInfo dtfi, DateTimeStyles style)

at System.DateTime.ParseExact(String s, String format, IFormatProvider provider)

我知道我的格式不对。有什么办法让它起作用吗?

更新
J. Steen 的方法对我有用,他是第一个发表评论的人,但 Soner Gönül 提供了更好的解释和更好的方法,所以我接受提到的 Soner Gönül 的回答 here 并且 J. Steen 同意这一点.感谢你们俩。无论如何,我都赞成所有正确答案。 :-)

您可以通过以下方式实现:

Convert.ToDateTime("2015-02-01T12:11:06Z")

你忘了最后的Z部分,将hh改为HH;

string s = "2015-02-01T12:11:06Z";
DateTime dt;
if(DateTime.TryParseExact(s, "yyyy-MM-ddTHH:mm:ssZ", CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out dt))
{
    Console.WriteLine(dt); // 01/02/2015 14:11:06
}

由于没有像 Z 这样的自定义日期和时间格式,解析方法将其视为字符文字。但在这种情况下,您的小时部分将与 OffSet 不同,因为此操作将您的 DateTimeKind 创建为 Local。由于我当前的偏移量现在是 +02:00,它将生成 14:11:06,而不是 12:11:06

string s = "2015-02-01T12:11:06";
DateTime dt;
if(DateTime.TryParseExact(s, "yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out dt))
{
    Console.WriteLine(dt); // 01/02/2015 12:11:06
}

请注意,您提供的格式最终与 Z 时区不匹配。您应该添加一个后缀来匹配它。例如:"yyyy-MM-ddThh:mm:ssZ"。顺便说一下,Z 代表 Zulu 并且与 UTC.[=13 的含义相同=]

但最简单的适合所有人的解决方案是 DateTime.Parse(attr.Value)

您根本不需要格式字符串。只是 DateTime.Parse,因为您的日期时间字符串已经是有效的(高度标准化的)日期时间格式。

timestamp = DateTime.Parse("2015-02-01T12:11:06Z",
                           CultureInfo.InvariantCulture,
                           DateTimeStyles.None);

效果很好。

时间格式中字母Z,代表UTC时间也称为'Zulu'时间。

这意味着解析器会将时间字符串视为 UTC 时间,并且在解析时会将时间转换为您当地的时区。

您可以修改您的代码来实现它,

使用时间戳 = DateTime.ParseExact(attr.Value,"yyyy-MM-ddThh:mm:ssZ",null);