ToString (“ MM/dd/yyyy HH: MM: ss.fff”)的结果类似于“09/14/201307.20.31.371”

我有一个 WP8应用程序,它会发送当前的时间到一个网络服务。

我通过调用

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")

对于大多数用户来说,它工作得很好,并给我正确的字符串,如 "09/10/2013 04:04:31.415"。但是对于某些用户,得到的字符串类似于 "09/14/2013 07.20.31.371",这会在我的 Web 服务中引起问题。

是因为文化格式问题吗?如何确保结果字符串由冒号而不是点分隔?

494152 次浏览

是因为文化格式问题吗?

是的。您的用户必须处于时间分隔符为点的区域性中。在 自定义日期和时间格式中,“ :”和“/”都是以文化敏感的方式解释的。

如何确保结果字符串由冒号而不是点分隔?

我建议指定 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

我的猜测是,您的 Web 服务会对此感到惊讶!

实际上,我建议不仅使用不变区域性,而且将 还有更改为 ISO-8601日期格式:

string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff", CultureInfo.InvariantCulture);

这是一种更为全球接受的格式——它也是可排序的,并且使得月份和日期顺序显而易见。(而06/07/2013可以解释为6月7日或7月6日,这取决于读者的文化。)

:有特殊的含义: 它是 时间分隔器。(自定义日期和时间格式字符串)。

使用 \进行转义:

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

可以使用 String.Format:

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"

我最近在使用 另一个方向,的 Windows10时碰到了这个问题,发现@JonSkeet 的答案对解决我的问题很有帮助。

我还进一步研究了一个测试表单,发现当当前区域性在运行时(Thread.CurrentThread.CurrentCulture = new CultureInfo("no");)设置为 "no""nb-NO"时,ToString (“ yyyy-MM-dd HH: mm: ss”)调用在 Windows 7和 Windows 10中的响应不同。它返回了我在 Windows7和 Windows10中所期望的 HH.mm.ss!

我觉得这有点吓人!因为我相信区域性至少在任何 Windows 版本中都是一种区域性。

将日期转换为字符串

使用名称 Space

using System.Globalization;

密码

string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");