DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")
对于大多数用户,它运行良好并给出了正确的字符串,例如"09/10/2013 04:04:31.415"
。但是对于某些用户,结果字符串类似于"09/14/2013 07.20.31.371"
,这在我的Web服务中会引起问题。
这是否是由于某些文化格式问题?我该如何确保结果字符串用冒号代替点来分隔?
DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")
对于大多数用户,它运行良好并给出了正确的字符串,例如"09/10/2013 04:04:31.415"
。但是对于某些用户,结果字符串类似于"09/14/2013 07.20.31.371"
,这在我的Web服务中会引起问题。
这是否是由于某些文化格式问题?我该如何确保结果字符串用冒号代替点来分隔?
是因为某个文化格式的问题吗?
是的。您的用户必须处于时间分隔符为点号的文化环境中。在自定义日期和时间格式中,冒号和斜杠都会根据文化环境以敏感的方式进行解释。
如何确保结果字符串以冒号而不是点号分隔?
我建议指定CultureInfo.InvariantCulture
:
string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
CultureInfo.InvariantCulture);
或者,你可以只引用时间和日期分隔符:
string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");
......但是如果你在默认日历系统不是公历的文化环境中运行用户,那么这将给你带来“有趣”的结果,这可能会让你感到意外。例如,看看以下代码:
using System;
using System.Globalization;
using System.Threading;
class Test
{
static void Main()
{
DateTime now = DateTime.Now;
CultureInfo culture = new CultureInfo("ar-SA"); // Saudi Arabia
Thread.CurrentThread.CurrentCulture = culture;
Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss.fff"));
}
}
这将产生输出结果(于2013年9月18日):
11/12/1434 15:04:31.750
我猜你的网络服务可能会对此感到惊讶!
实际上,我建议不仅使用不变文化,而且还要更改为ISO-8601日期格式:
string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff", CultureInfo.InvariantCulture);
这是一种更受全球认可的格式 - 它也可以排序,并且使月份和日期顺序显而易见。(而“06/07/2013”可能会根据读者文化的不同被解释为6月7日或7月6日。)
CultureInfo("ar-SA", false)
。 - Davide Icardi:
有特殊含义:它是时间分隔符(自定义日期和时间格式字符串)。
使用\
进行转义:
DateTime.ToString(@"MM/dd/yyyy HH\:mm\:ss.fff")
或者使用 CultureInfo.InvariantCulture
:
DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture)
我建议选择第二个,因为 /
也具有特殊含义(它是日期分隔符),所以你也可能会遇到问题。
您可以使用InvariantCulture,因为您的用户必须处于使用点而不是冒号的文化中:
DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);
最近,我在使用Windows 10时遇到了一个问题,从另一个角度找到了JonSkeet的答案对解决我的问题非常有帮助。
此外,我还进行了一些测试,并发现当运行时将当前文化设置为"no"
或"nb-NO"
(Thread.CurrentThread.CurrentCulture = new CultureInfo("no");
), 在Windows 7和Windows 10中,ToString("yyyy-MM-dd HH:mm:ss")调用会有不同的响应。在Windows 7中返回我期望的结果,在Windows 10中返回HH.mm.ss!
我认为这有点可怕!因为我至少认为在任何Windows版本中都是相同的文化。
DateTime d = DateTime.Now;
string str = String.Format("{0:00}/{1:00}/{2:0000} {3:00}:{4:00}:{5:00}.{6:000}", d.Month, d.Day, d.Year, d.Hour, d.Minute, d.Second, d.Millisecond);
// I got this result: "02/23/2015 16:42:38.234"
using System.Globalization;
代码
string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");