【问题标题】:DateTimeFormat.AbbreviatedMonthNames adding a dot at the end of month's nameDateTimeFormat.AbbreviatedMonthNames 在月份名称的末尾添加一个点
【发布时间】:2016-05-20 20:04:40
【问题描述】:

昨晚我们将 Web 服务层从物理 Windows 2008 r2 迁移到虚拟 Windows 2012。

我们的日志中有大量关于 DateTime 无效格式的事件,奇怪的是我们仔细检查了我们的区域设置。

长话短说:

CultureInfo.GetCultureInfo("es-MX").DateTimeFormat.AbbreviatedMonthNames

输出(使用 LinqPad5):

  1. 烯。
  2. 二月。
  3. 三月。

在我们 2012 年的新环境中,在 2008 年的 outtus 上:

  1. 二月
  2. 马尔

我们的解析是这样的:

DateTime.Parse("18 ene 16",CultureInfo.GetCultureInfo("es-MX"))

虽然它现在创造了奇迹,但它抛出了

FormatException : The string was not recognized as a valid DateTime. There is an unknown word starting at index 3..

虽然

DateTime.Parse("18 ene. 16",CultureInfo.GetCultureInfo("es-MX"))

有效,但不是我们几个客户的预期输入。

在相同的运行时版本 (4.0.30319.42000) 上工作,再次检查(再次)我们在两台服务器上的区域设置我还能寻找什么来解决这个问题(在放弃并用正则表达式替换它之前)?

谢谢。

【问题讨论】:

  • 可能有人在多年前更改了旧服务器中的配置。你必须在新的上再做一次。使用控制面板 > 区域。
  • 您确定运行时版本吗? 2008 R2 交付了 3.5.1 框架,该框架输出缩写。没有点的名称,而 2012 提供了输出缩写的 4.5 框架。带点的名字。您可以尝试将框架版本(如果可能)更改为 3.5?
  • @HansPassant:是的,我们正在再次检查这两个配置,如果我发现了什么,我会告诉你。
  • @Uwe:我使用 linqpad 脚本对其进行了测试,并在两台服务器上给了我输出,两个应用程序池都配置为 .NET Framework v4.0,但将新的降级到 3.5 可以做到诡计!我会尽力让你知道的!谢谢大家!

标签: c# cultureinfo


【解决方案1】:

遗憾的是,我无法在配置中找到任何指向正确方向的内容。

以这样一个讨厌的 hack 结尾:

var cultura = CultureInfo.CreateSpecificCulture("es-MX");
if (cultura.DateTimeFormat.AbbreviatedMonthNames.First().EndsWith("."))
   cultura.DateTimeFormat.AbbreviatedMonthNames = cultura.DateTimeFormat.AbbreviatedMonthNames.Select(c => c.Substring(0, c.Length > 1 ? c.Length - 1 : 0)).ToArray();

并在解析中使用该文化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    相关资源
    最近更新 更多