【问题标题】:C# CSV Parsing- how to get correct format from string (date) representation?C# CSV Parsing-如何从字符串(日期)表示中获取正确的格式?
【发布时间】:2015-04-06 15:07:03
【问题描述】:

我正在解析一个 CSV 文件。其中一列代表日期。问题是日期可以在 dd/MM/yyyy 和 MM/dd/yyyy 中。

当日期是 06/04/2015(4 月或 6 月?)时,我无法确定哪种格式是正确的

当我可以分辨出差异时,我的代码正在这样做以格式化输出(标准化的 csv)。您知道是否有更好的方法以及如何识别正确的格式?

  public static DateTime? ToValidDateTime(this string date)
    {
        if (string.IsNullOrEmpty(date))
            return null;

        try
        {
            var r = DateTime.Parse(date, CultureInfo.InvariantCulture);

            return new DateTime(r.Year, r.Month, r.Day, r.Hour, r.Minute, r.Second);


        }
        catch (Exception exception)
        {
            var r = DateTime.Parse(date);

            return new DateTime(r.Year, r.Month, r.Day, r.Hour, r.Minute, r.Second);
        }
    }

【问题讨论】:

  • 如果您无法分辨日期的格式,您希望计算机如何做到这一点?如果日期不明确,则需要明确定义的日期格式来解析日期。另请注意,DateTime 是一个结构体,因此绝对没有理由将解析结果复制到新的日期时间,您可以直接返回解析结果。
  • 是否有另一列包含可用于确定文化的位置之类的内容?
  • 不清楚您的实际问题是什么。如果您想知道如何确定是06/04/2015 4 月或 6 月 - 那么通常您无法在没有其他信息的情况下确定它。如果您只是在寻找一种解析具有两种格式的字符串的方法 - 有更优雅的方法,ParseExact 和格式字符串数组作为参数。但绝对不能解决“四月或六月”的问题。
  • 没有解决方案。您必须修复源数据以使用一组不会是 amibiguos 的格式,或者包含指示要使用哪种格式的信息。
  • 只要与来源确认,看看他们是使用美国风格还是世界其他地区风格:)。如果它在每一行内都不同,那么希望有一种方法可以确定它来自哪个位置,即可能是地址。如果是美国,假设 m/d/y 否则,假设 d/m/y。警告...从迄今为止处理日期的情况来看,加拿大似乎是奇怪的鸭子之一,因为它们两者都做,这很痛苦。如果可能,请源输出 ISO 日期 yyyy-mm-dd,这是最好的。

标签: c# parsing csv


【解决方案1】:

这不是一个答案,但它需要太多的格式才能适合作为评论。这段代码是多余的:

var r = DateTime.Parse(date);

return new DateTime(r.Year, r.Month, r.Day, r.Hour, r.Minute, r.Second);

您无缘无故地创建了两个日期时间实例。只要第一个就够了。你可以这样做:

return DateTime.Parse(date);

对于带有InvariantCulture 格式说明符的版本也是如此。

【讨论】:

  • 非常合理 - 但问问自己:“它是否回答了 OP 问题?”。所以这应该是一个评论,我想。
  • ...正如@Joel 在他的评论答案的第一行中所说的那样
  • @DrKoch 好吧,从技术上讲,他是在 我的评论发布之后说的。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 2012-02-15
  • 2013-08-14
  • 2011-12-03
  • 1970-01-01
相关资源
最近更新 更多