DateTime.ToString(“MM/dd/yyyy HH:mm:ss.fff”) 的结果类似于“09/14/20
本文关键字:结果 类似于 fff mm MM ToString dd yyyy DateTime HH ss | 更新日期: 2023-09-27 18:32:00
我有一个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 服务出现问题。
是因为某些区域性格式问题吗?如何确保结果字符串由冒号而不是点分隔?
是因为某些区域性格式问题吗?
是的。用户必须处于时间分隔符为点的区域性中。":"和"/"都以区分区域性的方式在自定义日期和时间格式中进行解释。
如何确保结果字符串由冒号而不是点分隔?
我建议指定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 日,具体取决于读者的文化。
:
具有特殊含义:它是时间分隔符。 (自定义日期和时间格式字符串)。
使用'
来转义它:
DateTime.ToString(@"MM/dd/yyyy HH':mm':ss.fff")
或使用CultureInfo.InvariantCulture
:
DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture)
我建议使用第二个,/
因为它也有特殊的含义(它是日期分隔符),所以你也可能遇到问题。
可以使用固定文化,因为用户必须处于使用点而不是冒号的区域性中:
DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);
我最近从另一个方向在Windows 10上遇到了这个问题,并发现@JonSkeet的答案对解决我的问题非常有帮助。
我还用测试表单做了进一步的研究,发现当当前区域性在运行时(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!
我觉得这有点吓人!因为我相信文化至少在任何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"
将日期转换为字符串
使用命名空间
using System.Globalization;
法典
string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");