【问题标题】:DateTime's ToLongString method doesn't return day nameDateTime 的 ToLongString 方法不返回日期名称
【发布时间】:2013-07-26 13:44:34
【问题描述】:

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

有什么方法可以让默认情况下省略的文化显示日期名称?

【问题讨论】:

  • 制作自己的格式字符串是不可能的吗?因为一方面你想要文化特定的显示,但另一方面你基本上说“这几种文化的文化特定格式是错误”......
  • 顺便说一句,为什么某些文化不显示日期名称(默认情况下)是一个“问题”?格式应该与显示相关。我希望您不要在 DateTime 的文化特定格式上绑定任何类型的逻辑。
  • 为什么不直接使用 DateTime.DayOfWeek 来获取日期?
  • @Corak 我不对文化特定格式使用任何逻辑。它只是显示。只是应用程序的利益相关者希望显示所有文化的日名。

标签: c# .net datetime xamarin globalization


【解决方案1】:

没错。

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

荷兰语: d。 MMMM YYYY

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

对于冰岛语: d。 MMMM YYYY

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

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

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

【讨论】:

  • +1。您还可以更改当前区域性的DateTimeFormatInfoLongDatePattern 属性。
【解决方案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);
        }
    }

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

【讨论】:

    【解决方案3】:

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

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

    var date = DateTime.Now;
    
    if(!date.ToLongDateString().Contains(date.ToString("dddd"))
        //Add it
    

    【讨论】:

      【解决方案4】:
      DateTime dt = new DateTime(2001, 5, 16);
      Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("nl-NL");
      Debug.WriteLine(dt.ToLongDateString());
      
      // output:  woensdag 16 mei 2001
      

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

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

      【讨论】:

        猜你喜欢
        • 2013-01-18
        • 1970-01-01
        • 2018-11-18
        • 1970-01-01
        • 1970-01-01
        • 2020-01-12
        • 1970-01-01
        相关资源
        最近更新 更多