jjd*_*dem 6 c# datetime nodatime
我希望能够从csv文件中解析日期和/或日期时间值,并获取其DateTime格式(或使用Excel术语NumberFormat)。
例如,我想将“ 2008-06-07 00:00:00.000”传递给函数,并使其返回类似“ yyyy-MM-dd hh:mm:ss.000”的信息。
要注意的是,csv文件中可能有许多可能的日期格式,而且它们都不是提前知道的,所以我不能使用DateTime.TryParseExact(),因为它要求您提前知道DateTime格式字符串才能进行测试查看它是否具有特定值。
通过了解日期格式,我可以将其设置为Excel中的自定义数字格式,然后输入值,它将与csv文件的文本完全一样,同时还可以在Excel公式中使用它。
当然,可能存在歧义,因此理想情况下,获取可能的日期格式列表,然后通过查看可能的日期格式列表的交集,对多个日期进行检查以删除某些选项会比较好。
我刚刚发现了NodaTime API,看起来它可以执行类似的操作,但是我还没有看到示例代码可以实现此目的,因为有关类似查询的大多数问题都被要求提供早期版本,而没有似乎受到支持。
这样做的任何其他方法也将不胜感激。
正如乔恩·斯凯特(Jon Skeet)所说,我认为做到这一点的唯一方法是列出常见模式并进行测试。通过执行以下操作,可以获得所有文化的日期时间模式集。但是,此列表将缺少一些可能在使用中常见的自定义模式。例如(我不知道是否常用)yyyy / dd / MM不在列表中。
private static HashSet<string> _patterns;
public static HashSet<string> AllCulturedDateTimePatterns
{
get
{
if (_patterns != null)
return _patterns;
_patterns = new HashSet<string>();
var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
foreach (var culture in cultures)
{
_patterns.UnionWith(culture.DateTimeFormat.GetAllDateTimePatterns());
}
return _patterns;
}
}
Run Code Online (Sandbox Code Playgroud)
没有“所有可能的日期格式”这样的东西。例如,格式"'Year:' yyyy 'Month:' MM 'Day:' dd"是有效的,但非常不寻常。Noda Time 在这里提供的任何东西都不会特别有用。我怀疑您需要创建您自己见过的所有日期/时间格式的列表 - 然后您可以在 Noda Time 中为每种格式创建一个模式,并尝试解析它以检查结果是否成功,或DateTime.TryParseExact在 BCL 中使用。例如:
BCL版本
var allFormats = new List<string>
{
"yyyy-MM-dd HH:mm:ss",
"dd/MM/yyyy HH:mm:ss",
"MM/dd/yyyy HH:mm:ss",
// etc
};
DateTime ignored;
var matchingFormats = allFormats
.Where(format => DateTime.TryParseExact(text, format, CultureInfo.InvariantCulture,
DateTimeStyles.None, out ignored))
.ToList();
Run Code Online (Sandbox Code Playgroud)
野田时代版
var allFormats = ...; // As before
var allPatterns = allFormats
.Select(format => LocalDateTimePattern.CreateWithInvariantCulture(format))
.ToList();
var matchingPatterns = allPatterns.Where(pattern => pattern.Parse(text).Success)
.ToList();
Run Code Online (Sandbox Code Playgroud)
请注意,IIRC,我们目前没有从 a LocalDateTimePattern(或任何其他模式)公开底层格式字符串。我们可以这样做,但我们现在不...