构建可在.NET中本地化的自定义日期/时间字符串格式的正确方法是什么?

时间:2012-09-28 22:22:14

标签: .net localization

我需要一个月份为一位数的日期字符串,一天为一位数,一年为两位数(美国为M/d/yy,大多数其他地方为d/M/yy。我还需要它跨区域设置工作,因此它应该自动处理月/日和分隔符的顺序。与此最接近的是d格式,当通过MM/dd/yyyy调用时会返回date.ToString("d")

这需要跨区域工作,所以我尝试了这就是我提出的:

string format = culture.DateTimeFormat.ShortDatePattern
                                   .Replace("yyyy", "yy")
                                   .Replace("dd", "d")
                                   .Replace("MM", "M");

return date.ToString(format);

使用culture.DateTimeFormat.ShortDatePattern为我提供了用于d日期格式的日期格式。使用此属性将处理日/月/年和日期分隔符的排序。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

如果您确实希望完全格式M/d/yy,那么只需使用:

return date.ToString("M/d/yy", culture);

但是,对于文化来说,这不一定是适当的字符串。例如,对于英国的任何人来说,这将是相当陌生的,它可能会在前一天预期有更多的d/M/yy格式。

请注意MM/dd/yyyy格式可能是您使用date.ToString("d")时获得的格式,但这绝对不是您在英国获得的格式。

基本上,您需要决定是否要确定格式,在这种情况下,您要进行本地化 - 或者您是否要使用“普通”文化特定的短日期字符串格式,在这种情况下{{ 1}}会有意义。

听起来你可能试图走到一半 - “短日期格式,但绝对不使用4位数年份”等等。而可以工作(确保你通过同样date.ToString("d", culture)方法中的culture也无法保证文化的短日期模式将使用ToString等开始。它可能会出现严重错误,例如,如果正常的短日期格式为dd,您最终会得到ddd dd MMM yyyy,那么就像2012年6月9日的“09 9 06 12”一样。

基本上,除非你实际从文化到“甚至更短的日期格式”的映射,否则我不建议像这样捏造它。

编辑:这是一个简短的程序,你应该检查它的输出。基本上它会打印原始格式和修改后的格式。

dd d MM yy

在我的机器上,快速扫描列表,我认为你真的没事。似乎没有以原始格式使用using System; using System.Globalization; class Program { public static void Main() { foreach (var culture in CultureInfo.GetCultures(CultureTypes.SpecificCultures)) { string original = culture.DateTimeFormat.ShortDatePattern; string modified = original.Replace("yyyy", "yy") .Replace("dd", "d") .Replace("MM", "M"); Console.WriteLine("{0,11}: {1,12} => {2,-9}", culture, original, modified); } } } ddd。但不能保证会继续如此......