日期记录如下:
08груд。 2017 00:00:06,694
我一直在使用Linqpad尝试使用乌克兰文化提出有效的日期时间掩码,这就是我尝试过的:
var dateString = "08 груд. 2017 00:00:06,694";
DateTime date;
DateTime.TryParseExact(
dateString,
"dd MMMM. yyyy HH:mm:ss,fff",
new CultureInfo("uk-UA"),
DateTimeStyles.None,
out date);
Console.WriteLine(date);
这不起作用,此脚本的输出为:
1/1/0001 12:00:00 AM
对于其他几种语言,这种方法也很适合我,所以我很困惑这里发生了什么。尽我所知,月份没有被正确解析。我试着用“hrud”代替。对于月份值(来自:https://www.loc.gov/aba/pcc/conser/conserhold/Mosabbr.html),但这也不起作用。
答案 0 :(得分:4)
MMMM
格式说明符表示“完整月份名称”。您可以通过以下方式查看给定文化的完整月份名称:
var culture = new CultureInfo("uk-UA");
var monthNames = culture.DateTimeFormat.MonthNames;
对于这种文化,12月全名是“грудень”,而不是“груд”。您可能会考虑使用“短月份名称”格式说明符MMM
。对于给定的文化,您可以查看月份的“短名称”,如下所示:
var culture = new CultureInfo("uk-UA");
var monthNames = culture.DateTimeFormat.AbbreviatedMonthNames;
但是你会看到12月的短名称是“гру”而仍然不是“груд”。因此,要使用您的文化的默认月份名称解析字符串,您需要执行以下操作:
var dateString = "08 грудень 2017 00:00:06,694";
DateTime date;
DateTime.TryParseExact(dateString, @"dd MMMM yyyy HH:mm:ss,fff", new CultureInfo("uk-UA"), DateTimeStyles.None, out date);
或者
var dateString = "08 гру. 2017 00:00:06,694";
DateTime date;
DateTime.TryParseExact(dateString, @"dd MMM. yyyy HH:mm:ss,fff", new CultureInfo("uk-UA"), DateTimeStyles.None, out date);
另一种选择是为您的案例调整文化月份名称,如下所示(请注意,它不会修改全局文化设置,仅修改此特定CultureInfo
实例的月份名称,因此这样做没有危险):
var dateString = "08 груд. 2017 00:00:06,694";
DateTime date;
var culture = new CultureInfo("uk-UA");
var defaultShortNames = culture.DateTimeFormat.AbbreviatedMonthNames;
var defaultShortGenitiveNames = culture.DateTimeFormat.AbbreviatedMonthGenitiveNames;
// obviously modify all month names as necessary
defaultShortNames[11] = "Груд";
defaultShortGenitiveNames[11] = "груд";
culture.DateTimeFormat.AbbreviatedMonthNames = defaultShortNames;
culture.DateTimeFormat.AbbreviatedMonthGenitiveNames = defaultShortGenitiveNames;
// store this modified culture and reuse when necessary
// that MMM format consists of 3 letters is irrelevant - it will still
// work fine with abbreviated month names of 4 characters or more
DateTime.TryParseExact(dateString, @"dd MMM. yyyy HH:mm:ss,fff", culture, DateTimeStyles.None, out date);
答案 1 :(得分:2)
正如其他人所提到的,MMMM
是完整的月份名称,而MMM
是三个字符的缩写月份名称,因此两者都不会开箱即用。而不是硬编码月份名称或修改CultureInfo
,我宁愿预先处理字符串以使用MMM
自定义格式字符串将月份截断为可解析的3个字符,或者使用正则表达式(重量级)或直接:
var sb = new StringBuilder (date.Length) ;
var nc = 0 ;
foreach (var ch in date)
{
if (char.IsLetter (ch) && nc++ >= 3) continue ;
sb.Append (ch) ;
}
return DateTime.ParseExact ("dd MMM. yyyy HH:mm:ss,fff", ...) ;