C#中是否有内置的月份名称变格?

37

我想知道在.NET中是否有任何内置功能可用于支持名词格变化的语言中的日期(例如,在俄语中月份名称是февраль,但如果我要说日期或表示某事到期,我会使用形式февраля)。 我制作了适用于此情况的自己的版本,但我需要将其扩展到其他情况和其他语言,它们将具有其日期的特定格式。

此功能是内置的还是可在外部库中使用? 感谢任何帮助。

如果我的解释不清楚,我提供了适用于俄语属格的函数。

public static string DeclineMonth(this DateTime time)
{
    var month = time.ToString("MMMM");
    if (month.Last() == 'ь')
        return month.Replace('ь', 'я');
    else
        return month + "a";
}       
2个回答

56

你可以在两种情况下获得月份的名称,主格

DateTimeFormatInfo info = CultureInfo.GetCultureInfo("ru-RU").DateTimeFormat;

// February: 2 - 1 (array is zero based) - "Февраль"
Console.Write(info.MonthNames[2 - 1]);

并且 属格

// February: 2 - 1 (array is zero based) - "февраля"
Console.Write(info.MonthGenitiveNames[2 - 1]);

其他情况(例如DativeAccusative)不受支持,我们必须手动实现它们。


4
不知道.NET中有这样的东西,很好。但是这引出了一个问题,为什么他们停止使用属格? - Tim Schmelter
9
@Tim Schmelter:即使是俄语也有6个标准和5个废弃的格;芬兰语使用15个,匈牙利语使用21个……至少在常规用法中,属格(Genetive)是常见的。 - Dmitry Bychenko
2
谢谢,非常好用!作为奖励,它返回小写的月份(这在您的代码注释中显示,但我错过了,所以我特别高兴)! - Kolichikov
@dumetrulo:我更愿意说,世界各地的日期格式只使用主格或属格月份名称。在英语中,这两个列表根本没有区别,因此它绝对不是基于英语(这对于微软来说是不寻常的,仅基于英语惯例来建模“CultureInfo”)。 - Joey
@DmitryBychenko 是的,匈牙利语有许多令人困惑的格形式,但大多数情况下(包括像“二月”或“二月二十日”这样的词组,但不包括“2017年二月”这样的短语),你可以使用主格。 - biziclop
显示剩余5条评论

0
要获取"1 января 2023"而不是"1 январь 2023",并且获取"1 мая"而不是"1 май",请使用以下代码:
CultureInfo culture = new CultureInfo("ru-RU");
culture.DateTimeFormat.MonthNames = culture.DateTimeFormat.MonthGenitiveNames;
culture.DateTimeFormat.AbbreviatedMonthNames = culture.DateTimeFormat.AbbreviatedMonthGenitiveNames;
string result1 = DateTime.Now.ToString("d MMMM yyyy", culture);
string result2 = DateTime.Now.ToString("d MMM", culture);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接