自定义DateTime格式字符串无法按预期工作

时间:2012-10-11 22:45:08

标签: c# string datetime .net-4.0 datetime-format

我有一个自定义的DateTime格式字符串:"M/d/yyyy h:m:ss tt"

例如,对于日期' 2012年9月18日@onon',我希望此输出类似于"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

这是MSDN doc for custom DateTime format strings

关于我做错什么的任何想法?我怎样才能达到预期的效果?

修改
在示例代码的最后一行中不正确的是有连字符而不是斜线,我不知道为什么。

另外,我的计算机语言设置为英语(加拿大)。但是我的"短片"也不是"长"日期格式看起来像M-d-yyyy所以我不知道它来自哪里。

5 个答案:

答案 0 :(得分:17)

/是日期分隔符,与文化相关 - 在您当前的文化中,它被定义为-。如果您希望始终使用/

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 :(得分:13)

尝试:

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

您的文化可能会覆盖您的日期分隔符。

答案 2 :(得分:2)

This article解释了当前文化如何改变DateTime.ToString(string)的输出。阅读包含此文本的部分:

  

此方法使用从当前导出的格式信息   培养

This article解释了如何获取/设置文化,以便您可以测试这种可能性。

This article解释了如何使用文化显式提供DateTime.ToString。

答案 3 :(得分:1)

尝试添加不变文化Using the InvariantCulture Property

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

答案 4 :(得分: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"));