2008-11-25 96 views
16

不确定这里发生了什么。String.Format(格式,日期)忽略格式

我有一个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全球化设置被搞砸了。

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

回答

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

希望这可以帮助!

9

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

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

+0

谢谢,这工作 - 我不认为你知道什么时候该改变(1.1和3.5之间),并在它的记录? – chris 2008-11-25 17:10:01

+0

请参阅.NET Framework 3.5:http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx(.NET 3.5)和.NET Framework 1.1:http://msdn.microsoft.com/en-us /library/8kb3ddd4(VS.71).aspx(.NET 1.1)以获取详细信息。它没有出现针对自定义DateTime格式字符串更改的API。 – Oppositional 2008-11-25 20:46:45

0

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

0

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

1

除非你指定IFormatProvider(通常是一个CultureInfo对象),它将默认使用Thread.CurrentThread.CurrentCulture的日期/时间格式,这将给你不断变化的结果。

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

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

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

的“/”字符是针对其在区域设置定义的日期时间分隔符培养中性占位符。时间的“:”字符也是如此。

要以字面方式嵌入“/”而不是占位符,您需要用格式字符串中的单引号“/”括起来。

0

这会给你你需要输出

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

有趣的线索!

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

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

我试过几个这些建议,但没有工作的唯一一个是流行克特林的建议,封装任意/字符,撇号:

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