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


131

我有一个WP8应用程序,它将把当前时间发送到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服务中引起问题。

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


2
唯一的区别是冒号与点。
Eldorado 2013年

Answers:


244

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

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

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

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

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


谢谢乔恩。我认为结果字符串将与格式字符串完全一样。我会尝试你的建议。
Eldorado 2013年

3
只是一个小考虑。从特定代码加载CultureInfo对象时,我总是建议将useUserOverride参数设置为false,否则某些用户设置可能会覆盖区域性设置。例如,在您的情况下,我建议使用new CultureInfo("ar-SA", false)
Davide Icardi,2013年

@DavideIcardi:有趣,谢谢-尽管在这种情况下,使用沙特阿拉伯的目的是专门说明为什么使用不变文化可能是正确的。不过,在以后的帖子中会牢记这一点。
乔恩·斯基特

7
中途通过这个广泛的答案,我开始怀疑:这会再次成为乔恩吗?是的
绝望的鬼脸

如何使用Html.TextBoxFor(x => x.Date,“ {0:MM / dd / yyyy}”)进行管理?
VISHMAY'9

9

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

使用\逃脱它:

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

或使用CultureInfo.InvariantCulture

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

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


2
不仅仅是日期分隔符是一个问题-参见我的答案也可以看到影响实际数字的文化示例……
Jon Skeet 2013年

1
\不能逃脱!
Shereef Marzouk '17

8

您可以使用InvariantCulture,因为您的用户必须是使用点而不是冒号的区域性:

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

7

最近,我从另一个方向碰到Windows 10的问题发现@JonSkeet的回答对解决我的问题很有帮助。

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

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


我很想知道是什么真正造成了这种情况。
劳里·佩尔顿

2
它已被识别并修复为Windows 10本地化错误。因此,客户端计算机上的Windows更新将解决此问题。更多细节在这个博客帖子可供选择: heikniemi.net/hardcoded/2015/08/...
哈康Seljåsen

我在上面链接的Jouni Heikniemi博客似乎已损坏。列出了已解决问题的相关Windows更新:2015-10-09:KB3093266 – Windows 10 KB3088956 – Windows Server 2012 R2和Windows 8.1 KB3088955 – Windows Server 2012和Windows 8 KB3088957 – Windows 7 SP1,Windows Server 2008 SP2 ,Windows Server 2008 R2 SP1和Windows Vista SP2,这次尝试通过archive.org再次链接到博客:web.archive.org/web/20161030193739/http
//www.heikniemi.net/…–HåkonSeljåsen

4

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

0

将日期转换为字符串

使用名称空间

using System.Globalization;

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

这不是将日期转换为字符串的方法。解析是相反的!
Vincent Vancalbergh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.