我按以下格式获取时间戳字符串 -
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同意这个。感谢你们俩。无论如何,我正在支持所有正确的答案。 : - )
答案 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")