日期时间';s的ToLongString方法没有';t返回日期名称

本文关键字:日期 返回 ToLongString 时间 方法 | 更新日期: 2023-09-27 18:25:00

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

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

是否有任何方法可以使默认情况下省略日期名称的区域性显示日期名称?

日期时间';s的ToLongString方法没有';t返回日期名称

这是正确的。

.NET做了它应该做的事情,如果你查看了windows pc的区域设置,你可以更改区域性,并查看日期(长)字段中显示的内容,你会看到以下内容:

荷兰语:d.MMMMYYYY

对于匈牙利语:YYYY。MMMM d.

对于冰岛语:d.MMMMYYYY

如果你真的想为所有人添加它,或者用强制使用某种格式的布局,你就必须手动添加它

DateTime.Now.ToString("dddd, dd MM YYYY");

请查看此页面,查看windows 7电脑上的区域设置:http://windows.microsoft.com/en-us/windows7/change-the-country-or-region-setting

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

    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);
        }
    }

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

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

你基本上是在说"如果区域性X不包含日期名称,请添加它",翻译过来就是:

var date = DateTime.Now;
if(!date.ToLongDateString().Contains(date.ToString("dddd"))
    //Add it
DateTime dt = new DateTime(2001, 5, 16);
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("nl-NL");
Debug.WriteLine(dt.ToLongDateString());
// output:  woensdag 16 mei 2001

我想其他文化可能有不包含星期几名称的格式,但您提供的-至少在我的机器上是这样。

需要注意的一点是,如果你要自己检查并添加它,你确定它应该总是在字符串的前面吗?在许多文化中都是这样,但也许并不是所有的文化都是这样。另外,分离器呢?这里只使用了一个空格,但很多都使用逗号和空格。其他人可以使用不同的东西。