如何将 ToLongDateString() 的日期和月份首字母大写导致 es-mx 文化?

Posted

技术标签:

【中文标题】如何将 ToLongDateString() 的日期和月份首字母大写导致 es-mx 文化?【英文标题】:how to uppercase date and month first letter of ToLongDateString() result in es-mx Culture? 【发布时间】:2008-10-23 04:35:38 【问题描述】:

目前我在 es-MX Culture 中从以下 C# 代码行获得以下结果

   Thread.CurrentThread.CurrentCulture =
     Thread.CurrentThread.CurrentUICulture = new
                CultureInfo("es-mx");

  <span><%=DateTime.Now.ToLongDateString()%></span>

miércoles,2008 年 10 月 22 日

我想获得以下内容

Miércoles,2008 年 10 月 22 日

我需要建立自己的文化吗?

【问题讨论】:

【参考方案1】:

您不需要建立自己的文化。您只需要更改当前文化中的属性 DateTimeFormat.DayNames 和 DateTimeFormat.MonthNames。

        string[] newNames =  "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo" ;
        Thread.CurrentThread.CurrentCulture.DateTimeFormat.DayNames = newNames;

但是,奇怪的是 en-US 以第一个大写字母显示月份和日期,而 mx-ES 则没有。

希望对你有帮助!

【讨论】:

“奇怪的是,en-US 以第一个大写字母显示月份和日期,而 mx-ES 则没有” - 并非如此,每个都遵循其语言的语法规则。在西班牙语中,日期和月份名称使用小写。 嘿,这是真的。我是墨西哥人,我不知道正确的方法是使用小写字母。在墨西哥,许多人使用标题大小写写月份和日期,可能是因为美国的影响 如果你可以使用微软的翻译,你可以使用Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES"); 使用 es-ES 的问题是墨西哥和西班牙的数字格式不同。你会得到逗号而不是小数点,以及你期望逗号的小数点。【参考方案2】:

西班牙语(墨西哥)的 LongDate 模式是

dddd, dd' de 'MMMM' de 'yyyy

根据Thread.CurrentThread.CurrentCulture.DateTimeFormat.LongDatePattern。我想您只需手动将日期和月份的首字母转换为大写,或者您可以使用Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase,然后将“De”替换为“de”。

【讨论】:

这不是一个好方法,因为它需要深入了解翻译知识。 是的,我的错。但是,您将如何以文化不可知论的方式处理?【参考方案3】:

前两个解决方案工作正常,但如果我们想将其扩展到任何文化怎么办,所以我想出了这种方法,我将当前文化日期时间数组更改为 TitleCase

private void SetDateTimeFormatNames()
        

            Thread.CurrentThread.CurrentCulture.DateTimeFormat.DayNames = ConvertoToTitleCase(Thread.CurrentThread.CurrentCulture.DateTimeFormat.DayNames);
            Thread.CurrentThread.CurrentCulture.DateTimeFormat.MonthNames = ConvertoToTitleCase(Thread.CurrentThread.CurrentCulture.DateTimeFormat.MonthNames);

        

private string[] ConvertoToTitleCase(string[] arrayToConvert)
            
                for (int i = 0; i < arrayToConvert.Length; i++)
                
                    arrayToConvert[i] = Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(arrayToConvert[i]);
                

                return arrayToConvert;
            

如果没有循环,如何改进?

【讨论】:

【参考方案4】:

有点晚了,但这对我有用!

 public static string GetFecha()
    
        System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("es-EC");
        System.Threading.Thread.CurrentThread.CurrentCulture = culture;

        // maldita sea!
        string strDate = culture.TextInfo.ToTitleCase(DateTime.Now.ToLongDateString());

        return strDate.Replace("De", "de");


    

【讨论】:

有史以来最糟糕的函数名称。西班牙语是邪恶的。【参考方案5】:

不变量文化的自定义长日期格式字符串是“dddd, dd MMMM yyyy”,所以可以使用string.Format和处理大写的方法:

private string GetDateFormated(DateTime date)

    return string.Format("0, 1 2 3",
        ToTitleCase(date.ToString("dddd")),
        date.ToString("dd"),
        ToTitleCase(date.ToString("MMMM")),
        date.ToString("yyyy"));


private string ToTitleCase(string input)

    return input[0].ToString().ToUpper() + input.Substring(1);

参考:The long date ("D") format specifier

【讨论】:

以上是关于如何将 ToLongDateString() 的日期和月份首字母大写导致 es-mx 文化?的主要内容,如果未能解决你的问题,请参考以下文章

DateTime格式转换结果

当前时间与某个日期对比

php如何计算两个时间戳之间相差的日时分秒

如何从子类访问父类数据成员,当父母和孩子的日成员具有相同的名称时

php如何计算两个时间戳之间相差的日时分秒

Sql中怎么样获取Datetime中的日