【问题标题】:Convert Time Zone formatted datetime to local date time将时区格式的日期时间转换为本地日期时间
【发布时间】:2019-01-14 15:05:35
【问题描述】:

有人可以指出这个"20130913095509+1000" datetime 代表.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 中的格式有什么区别。

【问题讨论】:

    标签: c# datetime timezone datetimeoffset


    【解决方案1】:

    一些事情:

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

    • zzzz 不是根据 the documentation 的有效格式说明符。某些实现似乎尊重它,但可能发生的情况是 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“基本”格式,但是这将包括日期和时间组件之间的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
    

    【讨论】:

      猜你喜欢
      • 2021-05-02
      • 2013-03-24
      • 2023-03-18
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多