141

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

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

4

6 回答 6

259

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

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

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

我建议指定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 日,具体取决于读者的文化。)

于 2013-09-18T13:55:52.030 回答
13

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

用来\逃避它:

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

或使用CultureInfo.InvariantCulture

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

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

于 2013-09-18T13:56:29.647 回答
9

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

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);
于 2013-09-18T13:56:39.290 回答
8

我最近从另一个方向使用 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 版本中都是一种文化。

于 2015-09-02T08:06:21.207 回答
5

您可以使用 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"
于 2015-02-23T14:43:34.013 回答
1

将日期转换为字符串

使用名称空间

using System.Globalization;

代码

string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");
于 2017-06-21T11:45:35.973 回答