不确定这里发生了什么。
我有一个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),原因有些奇怪。
答案 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);