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

Convert Time Zone formatted datetime to local date time

有人可以指出这个 "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  

"20130913095509+10:00""20130913095509+1000" 在 .NET 格式方面有什么区别。

几件事:

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

  • 根据 the documentation
  • 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

请注意,您使用的格式接近于 ISO 8601 "basic" 格式,但是这会在日期和时间部分之间包含 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