对于我的应用程序,第三方应用程序(在 Java 上运行)提供日期字符串。现在这个应用程序以某种方式使用系统语言来给出日期字符串。
所以 2009 年 4 月 6 日可能看起来像这样:
- 2009 年 4 月 6 日(美国)
- 2009 年 4 月 6 日(zh-CN)
- 6 avr。 2009(法国-法国)
- 2009 年 4 月 6 日(去德国)
等等..
对于我的应用程序,我需要将这些字符串转换为日期时间。我知道 Convert.ToDateTime()
、DateTime.Parse()
和 DateTime.ParseExact()
方法。
这段代码是我区分 en-US 和 de-DE 的方法:
private static DateTime ConvertToDateTime(string source)
{
CultureInfo cuDe = new CultureInfo("de-DE");
CultureInfo cuEn = new CultureInfo("en-US");
var result = new DateTime();
if (source.Contains("."))
{
result = Convert.ToDateTime(source, cuDe);
}
else
{
result = Convert.ToDateTime(source, cuEn);
}
return result;
}
这当然不适用于 fr-FR 中的字符串。我的问题是我不知道将在第 3 方应用程序运行的系统上设置哪种语言。
所以我的问题是:有什么方法可以检查字符串代表哪种区域性日期格式?例如,我输入“6 avr.2009”,它会返回 fr-FR?或者我真的必须检查可能出现的每种可能的语言日期格式并亲自检查,例如通过以特定语言运行 string.Contains()
几个月?
注释:
- 我无法更改第 3 方应用程序或其输出
- 我无法获取有关应用程序运行的系统的其他信息
最佳答案
一般来说,仅仅通过查看字符串是不可能找出使用哪种原始文化来创建该字符串的。
考虑以下示例:
var date = new DateTime(1900, 12, 11);
var enUs = new CultureInfo("en-US");
var enGb = new CultureInfo("en-GB");
var strUs = date.ToString(enUs);
var strGb = date.ToString(enGb);
strUs
的输出将为 12/11/1900
。
strGb
的输出将为 11/12/1900
。请注意,美国格式中的月份和日期是倒置的。
仅通过查看字符串,我们无法分辨哪是月份,哪是日期。这就是 API 应该使用明确格式(如 ISO 8601)的原因。 .
话虽如此,如果我们知道外部服务使用的确切格式并且这些格式是可区分的,则可以尝试使用已知的格式字符串进行解析。
private static DateTime ParseMultiCulture(string dateString) {
DateTime output;
string[] formatsEnUs = {"MMM d, yyyy"};
string[] formatsEnGB = {"dd-MMM-yyyy"};
string[] formatsFrFr = {"d MMM yyyy"};
string[] formatsDeDe = {"dd.MM.yyyy"};
if (DateTime.TryParseExact(dateString, formatsEnUs, new CultureInfo("en-US"),
DateTimeStyles.None, out output)) {
return output;
}
if (DateTime.TryParseExact(dateString, formatsEnGB, new CultureInfo("en-GB"),
DateTimeStyles.None, out output)) {
return output;
}
if (DateTime.TryParseExact(dateString, formatsFrFr, new CultureInfo("fr-FR"),
DateTimeStyles.None, out output)) {
return output;
}
if (DateTime.TryParseExact(dateString, formatsDeDe, new CultureInfo("de-De"),
DateTimeStyles.None, out output)) {
return output;
}
throw new NotSupportedException("Given datestring is in a format that is not supported.");
}
关于c# - 检查日期字符串是什么区域性,然后将其转换为 DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48497482/