【问题标题】:String.Format (format,date) is ignoring formatString.Format (format,date) 忽略格式
【发布时间】:2008-11-25 16:46:22
【问题描述】:

不知道这里发生了什么。

我有一个 DateTime 对象,当我尝试时:

String.Format( "{0:dd/MM/yyyy}", _date)

返回值为:

"24-05-1967"

我想要的是

"24/05/1967"

谁能解释为什么我的格式字符串被忽略了?

更多背景知识: 这是一个以 .net 1.1 开始的网络应用程序,我正在将其升级到 2.0/3.5。

更新:

如果我将格式更改为 {0:dd:MM:yyyy},它会返回 24:05:1967 - 只有格式字符串中的 / 会更改为 - 字符。


分辨率:

更新应用程序以在 2.0 下运行时,asp.net 全球化设置被搞砸了。

从网站属性、ASP.NET 选项卡、编辑配置、应用程序选项卡 - 文化和 UI 文化都被设置为列表中的第一项 (af-ZA) 出于某种奇怪的原因。

【问题讨论】:

    标签: .net datetime


    【解决方案1】:

    / 实际上是您特定文化的日期分隔符,可以是 -,换句话说,格式字符串不会被忽略,但实际上是正确使用的。查看 CultureInfo 与正在运行的线程关联的内容:

    System.Threading.Thread.CurrentThread.CurrentCulture
    

    如果你试试这个:

    String.Format(new CultureInfo("en-US"), "{0:dd/MM/yyyy}", DateTime.Now);
    

    您将获得格式为 / 的日期,因为这是 en-US 的正确分隔符。您可能应该做的是使用短日期格式字符串并确保线程具有相关的适当文化,然后这将为您提供所需的内容,并且它也可以在全球化的应用程序中工作:

    DateTime.Now.ToString("d", Thread.CurrentThread.CurrentCulture);
    

    希望这会有所帮助!

    【讨论】:

    • +1 用于记住“/”已转换为文化并指出“d”短日期字符串说明符可能更好:)
    【解决方案2】:

    您可能希望使用 DateTime 对象的 ToString() 方法来获取您所追求的字符串表示形式。 "dd'/'MM'/'yyyy" 格式字符串将为您提供您描述的格式。请注意,您需要使用单引号对格式字符串中的文字字符进行转义。

    例如:DateTime.Now.ToString("dd'/'MM'/'yyyy");

    【讨论】:

    【解决方案3】:

    除非您指定 IFormatProvider(通常是 CultureInfo 对象),否则它将默认使用 Thread.CurrentThread.CurrentCulture 的日期/时间格式,这将为您提供更改的结果。

    是的,它会改变/但不会:.

    这种情况下的解决方案是指定格式提供者,如下所示:

    String.Format(CultureInfo.InvariantCulture, "{0:dd/MM/yyyy}", _date)
    

    【讨论】:

      【解决方案4】:

      “/”字符是区域设置中定义的日期时间分隔符的文化中性占位符。时间的“:”字符也是如此。

      要按字面意思嵌入“/”而不是作为占位符,您需要在格式字符串中将其括在单引号 '/' 中。

      【讨论】:

        【解决方案5】:

        这很奇怪。这种格式对我来说是正确的。您可能想尝试 _date.ToString("dd/MM/yyyy") 代替(尽管这只是在黑暗中拍摄)。

        【讨论】:

          【解决方案6】:

          区域设置(在网络服务器上?)将日期分隔符设置为“-”。在我的语言环境(EE)中,输出将是“24.05.1967”:)

          【讨论】:

            【解决方案7】:

            这将为您提供所需的输出

            String.Format( "{0:dd/MM/yyyy}", Convert.ToDateTime(_date));
            

            【讨论】:

              【解决方案8】:

              有趣的话题!

              我有一个读取 Excel 文件的应用程序,并允许用户以 用户定义的格式将其数据导出到 .csv 文件。

              我特别想让用户能够将日期导出为(完全)像 yyyy/mm/dd 这样的格式,而不管他们笔记本电脑的文化信息如何。

              我尝试了其中一些建议,但唯一有效的是 Pop Catalin 的建议,即用撇号包装任何 / 字符:

              outputFormat = outputFormat.Replace("/", "'/'");
              valueToExport = ImportedDate.ToString(outputFormat);
              

              这似乎是唯一强制 ToString() 使用确切格式字符串的方法,而不尝试做任何文化特定的事情。

              更新

              当我回答 StackOverflow 问题时,我总是觉得很有趣,几年后又遇到了同样的错误,然后偶然发现了我自己的答案!

              正如许多这些答案中提到的,解决方案是将正斜杠字符包含在撇号中,以强制 ToString() 忽略文化设置。

              因此,如果您的文化设置有一个句号作为日期分隔符(例如“20.07.2015”),那么当您尝试很好地格式化圣诞节的日期时,您会看到以下内容,以及如何您可以轻松地强制它始终使用正斜杠:

              DateTime dtChristmas = new DateTime(2015, 12, 31);
              
              //  This might return "31/12/2015", "31.12.2015", etc, depending on Culture settings
              string str1 = dtChristmas.ToString("dd/MM/yyyy");
              
              //  ...but these two statements will both *always* return "31/12/2015"
              string str2 = dtChristmas.ToString("dd'/'MM'/'yyyy");
              string str3 = dtChristmas.ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2018-07-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-04-05
                相关资源
                最近更新 更多