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

时间:2015-02-04 09:29:18

标签: c# datetime

我按以下格式获取时间戳字符串 -

2015-02-01T12:11:06Z

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

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

但它正在抛出异常。

  

System.FormatException:String未被识别为有效的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的方法对我有用,他是第一个发表评论的人,但是SonerGönül提供了更好的解释和更好的方法,所以我接受了SonerGönül的回答here和J. Steen同意这个。感谢你们俩。无论如何,我正在支持所有正确的答案。 : - )

5 个答案:

答案 0 :(得分:6)

您忘记了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
}

答案 1 :(得分:2)

请注意,您提供的格式最终与Z时区不匹配。您应该添加一个后缀来匹配它。例如:"yyyy-MM-ddThh:mm:ssZ"。顺便说一句,仅供参考, Z 代表 Zulu ,意味着与 UTC 相同。

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

答案 2 :(得分:2)

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

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

效果非常好。

答案 3 :(得分:0)

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

这意味着解析器会将时间字符串视为UTC时间,解析它时会将时间转换为本地时区。

您可以修改代码以实现它,如下所示,

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

答案 4 :(得分:-1)

您可以通过以下方式实现这一目标:

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