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