DateTime.ToString(“MM / dd / yyyy HH:mm:ss.fff”)导致类似“09/14/2013 07.20.31.371”

时间:2013-09-18 13:52:52

标签: c# windows-phone-8

我有一个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服务出现问题。

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

分隔

6 个答案:

答案 0 :(得分:222)

  

是因为某些文化格式问题吗?

是。您的用户必须处于时间分隔符为点的区域中。在custom date and time formats中,“:”和“/”都以文化敏感的方式解释。

  

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

分隔

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

这是一种更全球公认的格式 - 它也是可排序的,并且使月份和日期顺序显而易见。 (根据读者的文化,06/07/2013可以解释为6月7日或7月6日。)

答案 1 :(得分:9)

:具有特殊含义:它是时间分隔符。Custom Date and Time Format Strings)。

使用\来逃避它:

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

或使用CultureInfo.InvariantCulture

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

我建议使用第二个,因为/也有特殊含义(它是日期分隔符。),所以你也可能遇到问题。

答案 2 :(得分:7)

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

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

答案 3 :(得分:6)

我最近从another direction,使用Windows 10遇到了这个问题,并且发现@JonSkeet的答案对解决我的问题非常有帮助。

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

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

答案 4 :(得分:3)

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

答案 5 :(得分:0)

将日期转换为字符串

使用名称空间

using System.Globalization;

代码

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