首页 > 解决方案 > 在 C# 中解析西班牙语日期在桌面和服务器上的工作方式不同

问题描述

尝试使用文化解析日期时,es-ES我在本地得到的行为与在构建服务器上运行相同代码和使用 dotnetfiddle 时不同。

我的突出这个问题的测试程序如下:

public static void Main(string[] args)
{
    var when = new DateTime(2018, 01, 19);

    CultureInfo dateCulture = new CultureInfo("es-ES");
    var headerDate = "19-ene-2018";

    bool success;
    DateTime result;

    Console.WriteLine(when.ToString("dd-MMM-yyyy", dateCulture));

    success = DateTime.TryParseExact(
            headerDate,
            "dd-MMM-yyyy",
            dateCulture,
            DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
            out result);

    Console.WriteLine(success);
    Console.WriteLine(result);
}

在本地这会产生:

19-ene-2018
True
1/19/2018 12:00:00 AM

而在 dotnetfiddle 上它会产生:

19-ene.-2018
False
1/1/0001 12:00:00 AM

第一个令人惊讶的事情是,使用完全相同的日期格式,服务器将月份格式化为ene.与本地一样ene(注意额外的句点)。这就是我认为导致实际日期无法解析的原因。

在放弃并使用正则表达式或其他同样可怕的解决方案之前,是否有人对为什么会发生这种情况有任何想法?这是服务器和桌面框架安装之间的区别吗?

标签: c#datetime

解决方案


虽然我无法解释为什么“es-ES”文化可以有不同的AbbreviatedMonthNames. 这是一个解决方案:

根据是否预期该期间,您可以使用以下内容进行修改AbbreviatedMonthNames

CultureInfo dateCulture = new CultureInfo("es-ES");
dateCulture.DateTimeFormat.AbbreviatedMonthNames = dateCulture.DateTimeFormat.AbbreviatedMonthNames
    // uncomment one of the two lines below
    //.Select(x => x.TrimEnd('.'))
    //.Select(x => !string.IsNullOrEmpty(x) && x.EndsWith(".") ? x : x + ".")
    .ToArray();

推荐阅读