我需要用各种语言写日期。 是否可以使用文化写一个像7月1日到10月3日的日期?
无法找到办法 有什么建议吗?
修改
我的意思是,如果选择的文化是英语,它应该显示 2010年10月1日 如果西班牙语应该显示西班牙语注释后缀的等效物(第一等...)
答案 0 :(得分:4)
正如其他人所指出的那样,.NET Framework中没有内置任何特定于文化的序号数字格式。无论如何,在许多语言中,序数不会用于日期(例如西班牙语,今天的日期是“2010年9月9日”,而不是“2010年9月9日”)。
为什么像.NET这样的通用框架永远不可能包含文化敏感的“GetOrdinalSuffix”方法或类似方法的其他原因包括性别(法语为1er,1ère;西班牙语为1o,1a,以及在给定的语言中可能有多个表单(西班牙语为1o /1º或1a /1ª) - 您使用的表单可能取决于您在输出文本时使用的编码。
有什么建议吗?
我的建议是不要这样做。相反,向您的用户解释它很复杂,因为您必须研究每种支持的语言,并说服他们在没有后缀的情况下生活。还向他们解释,最好将日期格式化为他们使用的每个其他应用程序。
答案 1 :(得分:2)
好吧,如果你绝对坚持这样做,这就是我采取的方法。
使用一个带有数字并吐出后缀的方法定义一些简单的接口。像这样:
interface INumberSuffixProvider
{
string GetSuffix(int number);
}
现在,确定您要支持的语言。弄清楚他们的后缀是什么。编写一个为每种语言实现INumberSuffixProvider
的类(您可能会发现编写一个基类,它提供了一个非常标准的实现,对大多数语言都有类似的功能)。
最后,创建一个工厂类,为给定的文化字符串创建INumberSuffixProvider
:
public class NumberSuffixProviderFactory
{
public INumberSuffixProvider GetProvider(Language language)
{
switch (name)
{
case Language.English: return new EnglishNumberSuffixProvider();
case Language.German: return new GermanNumberSuffixProvider();
// etc., etc. -- this is just for illustration
default: throw new ArgumentException("Unknown language.");
}
}
}
这不是最简单的解决方案,因为它需要您做一些工作。但是如果你能确定你想要支持哪种语言,至少一旦你有了基本的结构(上面只是一个想法的草图,真的),实际上使用这个代码应该很容易。
例如:
string FormatDate(DateTime date)
{
// These might be a static members.
var language = _currentLanguage;
var suffixProvider = _suffixProviderFactory.GetProvider(language);
return string.Format(
"{0}{1} {2:MMM} {3}",
date.Day,
suffixProvider.GetSuffix(date.Day),
date,
date.Year
);
}
答案 2 :(得分:1)
来自msdn:
string dateString = "5/1/2008 8:30:52 AM";
DateTime date1 = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture);
DateTime date1 = new DateTime(2008, 3, 1, 7, 0, 0);
Console.WriteLine(date1.ToString("F", new System.Globalization.CultureInfo("fr-FR")));
// Displays samedi 1 mars 2008 07:00:00
您可以找到DateTime.ToString()模式here。
答案 3 :(得分:0)
用英语显示月份名称的“天数月份年份”很容易:
var dt = new DateTime(2010,9,9);
var str = dt.ToString("d MMMM yyyy", CultureInfo.InvarientCulture);
给出:
9 September 2010
但custom DateTime
format strings中没有任何内容可以给出“st”等后缀,所以你需要自己做(未经测试):
var dt = get the date ...
var day = dt.Day;
var dayStr = day.ToString();
switch (day % 10) {
case 1:
dayStr += "st";
break;
case 2:
dayStr += "nd";
break;
default:
dayStr += "th";
break;
}
var result = String.Format({0} {1:MMMM yyyy}", dayStr, dt);
NB。这假定为英语:不同的语言具有不同的后缀,因此您需要构建自己的文化代码,因为NumberFormatInfo
不提供序数。维基百科在此处提供了一些信息(并注意到需要包括性别一词):http://en.wikipedia.org/wiki/Ordinal_indicator