【发布时间】: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/20154 月或 6 月 - 那么通常您无法在没有其他信息的情况下确定它。如果您只是在寻找一种解析具有两种格式的字符串的方法 - 有更优雅的方法,ParseExact和格式字符串数组作为参数。但绝对不能解决“四月或六月”的问题。 -
没有解决方案。您必须修复源数据以使用一组不会是 amibiguos 的格式,或者包含指示要使用哪种格式的信息。
-
只要与来源确认,看看他们是使用美国风格还是世界其他地区风格:)。如果它在每一行内都不同,那么希望有一种方法可以确定它来自哪个位置,即可能是地址。如果是美国,假设 m/d/y 否则,假设 d/m/y。警告...从迄今为止处理日期的情况来看,加拿大似乎是奇怪的鸭子之一,因为它们两者都做,这很痛苦。如果可能,请源输出 ISO 日期 yyyy-mm-dd,这是最好的。