DateTime的ToLongString方法不返回日期名称

时间:2013-07-26 13:44:35

标签: c# .net datetime xamarin globalization

我目前正在使用.NET的DateTime ToLongDateString()方法来解析日期字符串。 对于某些文化,这很好用:

US: Wednesday, May 16, 2001

但是对于其他一些文化,省略了名称(例如荷兰语,匈牙利语和冰岛文化)。

NL: 16 mei 2001

这些文化的DayNames数组包含一周中每一天的专有名称,但由于某种原因,它们不用于长日期字符串。

我尝试使用DateTimeFormat.DayNames [i] + "D"格式化解决方案,但它在这里不起作用,因为它会导致已经显示日期名称的文化的双日名称。

 US: Wednesday Wednesday, May 16, 2001
 NL: woensdag 16 mei 2001

有没有办法让默认情况下省略它的文化显示日期名称?

4 个答案:

答案 0 :(得分:3)

多数民众赞成。

.NET会做它应该做的事情,如果您查看一下Windows PC的区域设置,您可以更改文化并查看日期(长)字段中显示的内容,您将看到以下内容:

代表荷兰语: d。 MMMM YYYY

匈牙利语: YYYY。 MMMM d。

对于冰岛语: d。 MMMM YYYY

如果您真的想要为所有这些设置,或者强制使用

强制使用某种格式布局,则必须手动添加它
DateTime.Now.ToString("dddd, dd MM YYYY");

查看此页面,了解在Windows 7 PC上找到区域设置的位置: http://windows.microsoft.com/en-us/windows7/change-the-country-or-region-setting

答案 1 :(得分:2)

许多文化都有多个长日期模式,您可以从中选择第一个包含星期几模式的模式:

    static void Main(string[] args)
    {
        foreach (var cultureInfo in System.Globalization.CultureInfo.GetCultures(System.Globalization.CultureTypes.AllCultures))
        {
            string longDateWithDayOfWeek = null;
            foreach (var pattern in cultureInfo.DateTimeFormat.GetAllDateTimePatterns('D'))
            {
                if (pattern.Contains("ddd"))
                {
                    longDateWithDayOfWeek = pattern;
                    break;
                }
            }

            bool isFallbackRequired = string.IsNullOrEmpty(longDateWithDayOfWeek);
            if (isFallbackRequired)
            {
                longDateWithDayOfWeek = "dddd, " + cultureInfo.DateTimeFormat.LongDatePattern;
            }
            System.Console.WriteLine("{0} - {1} {2}", cultureInfo.Name, longDateWithDayOfWeek, (isFallbackRequired) ? " (generated)" : string.Empty);
        }
    }

荷兰语和冰岛语都是这样支持的,而匈牙利语需要更多的研究才能正确覆盖。

答案 2 :(得分:1)

如果你想到你在问什么 - 很明显你需要检查,然后自己添加。

你基本上是在说“如果文化X不包含日期名称,请添加它”,转换为:

var date = DateTime.Now;

if(!date.ToLongDateString().Contains(date.ToString("dddd"))
    //Add it

答案 3 :(得分:0)

DateTime dt = new DateTime(2001, 5, 16);
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("nl-NL");
Debug.WriteLine(dt.ToLongDateString());

// output:  woensdag 16 mei 2001

我认为其他文化可能包含不包含星期名称的格式,但您提供的的格式 - 至少在我的机器上。

有一点需要注意,如果您要自己检查并添加它,您确定它应该始终位于字符串的前面吗?在许多文化中它是,但也许并非所有文化都以这种方式运作。那么,隔板怎么样?这里只使用一个空格,但许多使用逗号和空格。其他人可以使用不同的东西。