【问题标题】:Format DateTime issue for Millisecond level with FileHelpers C#使用 FileHelpers C# 格式化毫秒级别的 DateTime 问题
【发布时间】:2016-10-20 12:48:24
【问题描述】:

在 FileHelpers Library 使用 C# 应用程序解析 csv 文件中的日期时间数据时,我需要非常小的帮助。

我在 csv 文件中使用的日期时间数据为 = 20160803T0509+0100

我收到如下错误

ex = {"Error Converting '20160803T0509+0100' to type: 'DateTime'.  There are more chars in the Input String than in the Format string: 'yyyyMMdd HH:mm:ss'"}

我正在使用如下代码

    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
                [FieldTrim(TrimMode.Both)]
                [FieldConverter(ConverterKind.Date, "yyyyMMdd HH:mm:ss")]

 private DateTime _ShipmentDateTime;
                public DateTime ShipmentDateTime
                {
                    get { return _ShipmentDateTime; }
                    set { _ShipmentDateTime = value; }
                }

【问题讨论】:

  • 你试过用"yyyyMMdd#HHmm#####"作为格式字符串吗?
  • @susheeltyagi 这个问题你解决了吗?

标签: c# csv datetime filehelpers


【解决方案1】:

您将不得不进行一些字符串操作,因为 DateTime.Parse()DateTimeOffset.Parse() 不会理解:“20160803T0509+0100”

您需要查找“T”并将其删除,计数 2 个字符并输入“:”,您还需要找到“+”并计数 2 个字符并输入“:”。

这会让你得到这样的东西:"20160803 05:09 +01:00"。 如果知道csv文件中的格式为YYYYMMDD,在相关位置加“/”即可得到:"2016/08/03 05:09 +01:00"

现在,DateTimeOffset.Parse() 将理解这个字符串。

public DateTime ShipmentDateTime
 {
   get { return _ShipmentDateTime; }
   set { 
         var dateTimeOffset = DateTimeOffset.Parse(value); //value = "2016/08/03 05:09 +01:00"
         _ShipmentDateTime = dateTimeOffset.UtcDateTime; 
       }
 }

旁注:

您使用 Datetime 而不是 DateTimeOffset 是否有任何特殊原因,因为运输是多时区的,并且 DateTimeOffset 通常使用起来更安全。您总是可以在稍后阶段转换为 DateTime 以进行显示,但至少您仍然拥有最重要的有效数字。

【讨论】:

    【解决方案2】:

    您可以使用yyyyMMddTHHmmzzz 格式。 zzz 处理时区信息。您需要使用的完整属性是:

    [FieldConverter(ConverterKind.Date, "yyyyMMddTHHmmzzz")]
    

    documentation 声明“您可以在 DateTime.ParseExact 的 MSDN 文档中找到所有受支持的格式字符串”,因此您可以通过一个简单的应用程序 (DotNetFiddle) 证明上述内容:

    DateTime d = DateTime.ParseExact("20160803T0509+0100", "yyyyMMddTHHmmzzz", CultureInfo.CurrentCulture);
    Console.WriteLine(d);
    Console.WriteLine(d.ToString("yyyyMMddTHHmmzzz"));
    

    哪个产生(在我的英国系统上)

    2016 年 3 月 8 日 05:09:00
    20160803T0509+01:00

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-15
      • 2021-05-26
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      相关资源
      最近更新 更多