String.Format(格式,日期)忽略格式

时间:2008-11-25 16:46:23

标签: .net datetime

不确定这里发生了什么。

我有一个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 - 它只是格式字符串中的/被更改为 - char。


分辨率:

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

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

8 个答案:

答案 0 :(得分:24)

/实际上是特定文化的日期分隔符,可能是 - 换句话说,格式字符串不会被忽略但实际上是正确使用的。看看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 :(得分:9)

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

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

这很奇怪。格式化对我来说正常。您可能想尝试使用_date.ToString(“dd / MM / yyyy”)(尽管这只是在黑暗中拍摄)。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

这将为您提供所需的输出

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

答案 7 :(得分:0)

有趣的帖子!

我有一个应用程序,它读取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);