将时区格式的datetime转换为本地日期时间

时间:2018-08-07 13:39:17

标签: c# datetime timezone datetimeoffset

有人可以指出这个"20130913095509+1000"日期时间表示.NET中的哪种格式。

我可以使用以下代码对此进行解析

string test= "20130913095509+1000";
DateTime parseDt = DateTime.ParseExact(test,
                    "yyyyMMddhhmmsszzzz",
                    CultureInfo.InvariantCulture);    

//For comparison 

string output= parseDt.ToString("yyyyMMddhhmmsszzzz"); 
//output= 20130913095509+10:00  

.NET中"20130913095509+10:00""20130913095509+1000"之间的格式有什么区别。

1 个答案:

答案 0 :(得分:1)

几件事:

  • 最好将其解析为DateTimeOffset而不是DateTime。这样,您正在使用的计算机的本地时区就不会影响解析行为,并且您无需担心DateTimeStylesDateTimeKind的疯狂。由于DateTimeOffset保留了您提供的偏移量,因此它将在从字符串到对象到字符串再到字符串的往返过程中保持不变。

  • 根据{{​​3}},
  • zzzz不是有效的格式说明符。某些实现似乎很荣幸,但是可能发生的情况是zzzz被分别解释,而后者被忽略。

  • 不幸的是,没有格式说明符表示带符号,小时和分钟的不带冒号的偏移量。 zzz是最接近的,在使用ToString进行格式化时会包含冒号,但是在使用ParseExact进行解析时会将其视为可选。因此,您可以在格式字符串中使用zzz,但必须在:调用之后手动删除ToString

将其放在一起:

string test = "20130913095509+0530";
DateTimeOffset dto = DateTimeOffset.ParseExact(test, "yyyyMMddHHmmsszzz", CultureInfo.InvariantCulture);
string output = dto.ToString("yyyyMMddHHmmsszzz").Remove(17,1);
Console.WriteLine(output);  //=>  20130913095509+0530

请注意,您使用的格式接近the documentation“基本”格式,但是日期和时间部分之间应包含T分隔符。如果可能的话,您应该考虑插入T,以使您的数据符合ISO 8601。

string test = "20130913T095509+0530";
DateTimeOffset dto = DateTimeOffset.ParseExact(test, "yyyyMMdd'T'HHmmsszzz", CultureInfo.InvariantCulture);
string output = dto.ToString("yyyyMMdd'T'HHmmsszzz").Remove(18,1);
Console.WriteLine(output);  //=>  20130913T095509+0530