我在日期D:
之前使用20170328092616+01'00'
的PDF文件提供此日期格式,并且我正在尝试解析此格式。
DateTime parsedDate = DateTime.ParseExact(
"D:20170328092616+01'00'",
"0:yyyyMMddhhmmss",
CultureInfo.CurrentCulture,
DateTimeStyles.None);
但是,代码会抛出FormatException
。我该如何解决这个问题?
答案 0 :(得分:1)
这是DateTimeOffset:带有时区信息的日期时间。
var offset = DateTimeOffset.Now.ToString("D:yyyyMMddhhmmsszzzz"); // this produces "D:20170926114506+02:00"
var parsedDate = DateTimeOffset.ParseExact(offset, "D:yyyyMMddhhmmsszzzz", CultureInfo.CurrentCulture);
你必须找到合适的CultureInfo,或者替换' with:在时区部分
答案 1 :(得分:1)
您的主要问题是无法使用DateTime.ParseExact
解析字符串的时区,因为它包含引号。但是,您可以删除引号以使其可分析。同时你也可以摆脱领先的D:
,即使这些额外的字符不能解析时间戳。
"D:20170328092616+01'00'".Substring(2).Replace("'", "")
您还应该使用CultureInfo.InvariantCulture
代替CultureInfo.CurrentCulture
。您不知道后者是什么,并且可能存在文化无法解析时间戳的情况。
请注意,格式控制器hh
的格式为12小时,我非常确定您需要HH
24小时格式。否则,您需要在时间戳中使用AM / PM。
把所有这些放在一起你得到:
DateTime parsedDate = DateTime.ParseExact(
"D:20170328092616+01'00'".Substring(2).Replace("'", ""),
"yyyyMMddHHmmsszzzz",
CultureInfo.InvariantCulture,
DateTimeStyles.None);
你应该知道解析日期的类型是Local
,这意味着parsedDate
被转换为本地时区(时间戳包含一个偏移,因此它被很好地定义) 。根据您打算使用解析日期的方式,通过解析为Utc
种类可能会更好。您可以使用DateTimeStyles.AdjustToUniversal
代替DateTimeStyles.None
来实现此目的。或者您可以切换为使用DateTimeOffset
代替DateTime
,这将保留原始偏移量(+01:00)。
答案 2 :(得分:0)
您的日期字符串格式很奇怪。这有效:
Console.Write(DateTime.ParseExact("20170328092616+01:00", "yyyyMMddhhmmsszzz", System.Globalization.CultureInfo.InvariantCulture));