1

我目前正在使用 .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

4 回答 4

3

那是正确的。

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

荷兰语:d。嗯嗯嗯嗯嗯嗯嗯

匈牙利语:YYYY。MMMM D.

冰岛语:d。嗯嗯嗯嗯嗯嗯嗯

如果您真的想为所有这些人都拥有它,您将不得不手动添加它,或者强制使用某种格式布局

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

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

于 2013-07-26T13:51:38.523 回答
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);
        }
    }

这种方式支持荷兰语和冰岛语,而匈牙利语需要您进行更多研究才能正确覆盖。

于 2013-08-13T17:45:19.370 回答
1

如果您考虑一下您要问的内容 - 很明显您需要检查并自己添加。

您基本上是在说“如果文化 X 不包含日期名称,请添加它”,意思是:

var date = DateTime.Now;

if(!date.ToLongDateString().Contains(date.ToString("dddd"))
    //Add it
于 2013-07-26T13:50:27.347 回答
0
DateTime dt = new DateTime(2001, 5, 16);
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("nl-NL");
Debug.WriteLine(dt.ToLongDateString());

// output:  woensdag 16 mei 2001

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

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

于 2013-07-27T18:28:14.670 回答