【问题标题】:Parsing DateTime with/without time zone information解析带/不带时区信息的 DateTime
【发布时间】:2021-09-13 12:55:07
【问题描述】:

我正在尝试实施 DICOM 规范来解析 DateTime。标准specify表示:

一个连接的日期时间字符串,格式为:

YYYYMMDDHHMMSS.FFFFFF&ZZXX

这个字符串的组成部分,从左到右,YYYY = 年,MM = 月,DD = 日,HH = 小时(范围“00” - “23”),MM = 分钟(范围“00” - "59"), SS = 秒 (范围 "00" - "60")。

FFFFFF = 小数秒包含小至百万分之一秒的小数部分(范围“000000”-“999999”)。

&ZZXX 是从协调世界时 (UTC) 偏移的可选后缀,其中 & = “+”或“-”,ZZ = 小时,XX = 偏移分钟。

目前我能想到的只有

DateTime.ParseExact(str, "yyyyMMddHHmmss.FFFFFF", CultureInfo.InvariantCulture);

我已经成功地测试了它:

var dateTimeValueStr = "20010301125745.490000";

var dateTimeValueStr = "20010301125745";

但是,我无法理解有关如何实现对从协调世界时 (UTC) 偏移的可选后缀进行解析的文档。似乎'zzz' 仅适用于显式冒号“:”。而且我不能使用像"\\+hhmm" 这样的东西,因为在同一个格式字符串中会有多个“h”模式。

问:

有没有办法通过调用 DateTime.ParseExact 来读取这个 DICOM 日期时间?还是我需要单独调用DateTime.ParseExact 来读取日期时间(无时区),然后再调用TimeSpan.ParseExact 来解析时区信息(see here)。

典型示例:

var dateTimeValueStr = "20010301125745.490000-0500";

【问题讨论】:

  • 包含偏移量的类型是DateTimeOffset,而不是DateTime

标签: c# datetime datetime-format dicom


【解决方案1】:

您可以尝试在一个DateTime.ParseExact 中提供多种格式

  static DateTime MyParse(string value) => DateTime.ParseExact(
    value, 
    new string[] { 
      "yyyyMMddHHmmss.FFFFFF", 
      "yyyyMMddHHmmss.FFFFFFzzz",
    },
    CultureInfo.InvariantCulture, 
    DateTimeStyles.AdjustToUniversal);

演示:

  string[] tests = new string[] {
    "20010301125745.490000",
    "20010301125745.490000-0500",
    "20010301125745.490000+0000",
    "20010301125745.490000-0000",
    "20010301125745.490000+0700",
  };

  string report = string.Join(Environment.NewLine, tests
    .Select(test => $"{test,30} => {MyParse(test):yyyy-MM-dd HH:mm:ss}"));

  Console.Write(report);

结果:

     20010301125745.490000 => 2001-03-01 12:57:45
20010301125745.490000-0500 => 2001-03-01 17:57:45
20010301125745.490000+0000 => 2001-03-01 12:57:45
20010301125745.490000-0000 => 2001-03-01 12:57:45
20010301125745.490000+0700 => 2001-03-01 05:57:45

【讨论】:

  • 我可以使用zzz ParseExact time zone info "+0000",但我不能在没有明确的冒号的情况下使用ToString + zzz,这真是太疯狂了......好吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2013-04-03
  • 2014-04-24
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
相关资源
最近更新 更多