DateTime.ToString(“MM / dd / yyyy HH:mm:ss.fff”)导致类似于“2013年9月14日07.20.31.371”

我有一个WP8应用程序,它将发送当前时间到一个Web服务。

我通过调用获取date时间string

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

对于大多数用户来说,它的工作很好,并给我正确的string,如"09/10/2013 04:04:31.415" 。 但是对于某些用户来说,结果string就像"09/14/2013 07.20.31.371" ,这会导致我的Web服务出现问题。

是否因为一些文化格式问题? 我怎样才能确保结果string由冒号而不是点分隔?

是否因为一些文化格式问题?

是。 您的用户必须处于时间分隔符为点的文化中。 “:”和“/”都以自定义date和时间格式以文化敏感的方式进行解释。

我怎样才能确保结果string由冒号而不是点分隔?

我build议指定CultureInfo.InvariantCulture

 string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture); 

或者,你可以引用时间和date分隔符:

 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 

我的猜测是,你的networking服务会感到惊讶!

我实际上build议不仅要使用不变的文化,而且要更改为ISO-8601date格式:

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

这是一个更为全球接受的格式 – 它也是可sorting的,并使月份和date顺序明显。 (根据读者的文化,06/07/2013可以解释为6月7日或7月6日)

:有特殊含义:是时间分隔符。 ( 自定义date和时间格式string )。

\来转义它:

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

或者使用CultureInfo.InvariantCulture

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

我会build议去第二个,因为/也有特殊的含义(这是date分隔符 ),所以你也可以有这个问题。

您可以使用InvariantCulture,因为您的用户必须处于使用点而不是冒号的文化中:

 DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture); 

最近我从另一个方向讨论了Windows 10的问题,并从@JonSkeet中find了解决我的问题的答案。

我还用testing表单做了进一步的研究,发现当运行时( Thread.CurrentThread.CurrentCulture = new CultureInfo("no"); )将当前文化设置为"no""nb-NO" ToString(“yyyy-MM-dd HH:mm:ss”)调用在Windows 7和Windows 10中的响应方式不同。它返回了我在Windows 7中预期的结果,在Windows 10中返回了HH.mm.ss!

我觉得这有点吓人! 因为我相信,至less在任何Windows版本中,文化都是一种文化。

你可以使用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" 

将date转换为string

使用名称空间

 enter code here using System.Globalization; 

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