0

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

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

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

return date.ToString(format);

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

有一个更好的方法吗?

4

1 回答 1

1

如果您确实想要确切的格式M/d/yy,那么只需使用它:

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

但是,这不一定是适合文化的字符串。例如,它对英国的任何人来说都是陌生的,他们会期望更多的d/M/yy格式 - 前一个月。

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

基本上,您需要决定是否要确定格式,在这种情况下您正在吹本地化 - 或者您是否要使用“正常”文化特定的短日期字符串格式,在这种情况下date.ToString("d", culture)是有意义的。

听起来您可能正在尝试中途 - “短日期格式,但绝对不要使用 4 位数年份”等。虽然这可能有效(确保您也传递culture到该ToString方法)但不能保证文化的短日期模式将使用ddetc 开始。它可能会出现严重错误,例如,如果正常的短日期格式是ddd dd MMM yyyy你最终会得到的dd d MM yy,那么就像 2012 年 6 月 9 日的“09 9 06 12”。

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

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

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或使用MMM原始格式。但不能保证这种情况会继续下去......

于 2012-09-28T22:24:08.857 回答