自定义日期时间格式字符串没有按预期工作

9
我有一个自定义的DateTime格式字符串:"M/d/yyyy h:m:ss tt"
例如,对于日期“2012年9月18日中午”,我希望输出结果类似于"9/18/2012 12:0:00 PM"
时间部分似乎格式正确,但日期部分出现了问题。我看到日期格式为"MM-dd-yyyy",但我无法弄清楚原因。
以下是一些用于重现问题的示例代码:
var datetime = DateTime.Now;
Console.WriteLine("Date: " + datetime.ToString("MMMM d, yyyy"));       // Date: October 11, 2012 --> correct
Console.WriteLine("Date: " + datetime.ToString("M/d/yyyy h:m:ss tt")); // Date: 10-11-2012 4:34:17 PM --> wrong

这里是有关自定义DateTime格式的MSDN文档。(链接) 你知道我做错了什么吗?怎样才能得到我想要的结果? 编辑:
示例代码的最后一行中不正确的地方在于,它使用连字符而不是斜杠,我不知道为什么会这样。
另外,我的计算机语言设置为英语(加拿大)。但是我的“短日期”和“长日期”格式都不像M-d-yyyy,所以我不知道那是从哪里来的。

另外,请不要问为什么格式很奇怪(没有零占位符等),我正在与一个只接受这种格式日期的外部服务集成。否则,这不会是我的首选。;) - Jesse Webb
我得到的输出显示在示例代码每行旁边的注释中。它是错误的,因为(在我的系统上),我得到的输出是“日期:2012年10月11日下午4:34:17”。 - Jesse Webb
这是正确的输出。我们现在是十月 = 10。 - lahsrah
@sylon - 注意使用连字符而不是斜杠 - Jesse Webb
你的Windows运行在哪种文化环境下? - lahsrah
尝试使用以下代码:datetime.ToString("M/d/yyyy h:m:ss tt", CultureInfo.InvariantCulture) - lahsrah
5个回答

18

/ 是日期分隔符,它取决于文化环境 - 在你当前的文化环境中,它被定义为 -。如果你想始终使用 /,请使用:

Console.WriteLine("Date: " + datetime.ToString("M\"/\"d\"/\"yyyy h:m:ss tt"));
或者
Console.WriteLine("Date: " + datetime.ToString("M'/'d'/'yyyy h:m:ss tt"));

也就是说,将想要直接输出的部分用引号括起来。


1
我不知道斜杠字符不是一个字面字符,谢谢! - Jesse Webb

13

尝试:

datetime.ToString("M/d/yyyy h:m:ss tt", CultureInfo.InvariantCulture);

你的日期分隔符可能被你的语言环境所覆盖了。


2
这篇文章解释了当前的文化如何改变 DateTime.ToString(string) 的输出。请阅读包含以下内容的部分:
“此方法使用从当前区域性派生的格式信息”
这篇文章解释了如何获取/设置区域性以便测试这种可能性。
这篇文章解释了如何显式地提供 DateTime.ToString 用于使用的区域性。

1

尝试添加不变文化,使用InvariantCulture属性

Console.WriteLine("Date: " + datetime.ToString("M/d/yyyy h:m:ss tt", CultureInfo.InvariantCulture));

0
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
var datetime = DateTime.Now;
Console.WriteLine("Date: " + datetime.ToString("MMMM d, yyyy"));

// Date: October 11, 2012 --> correct
Console.WriteLine("Date: " + datetime.ToString("M/d/yyyy h:m:ss tt"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接