我有一个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服务中引起问题。
是因为某些文化格式问题?如何确定结果字符串由冒号而不是点分隔?
我有一个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服务中引起问题。
是因为某些文化格式问题?如何确定结果字符串由冒号而不是点分隔?
Answers:
是因为某些文化格式问题?
是。您的用户必须处在时间分隔符为点的区域中。“:”和“ /”都以对文化敏感的方式以自定义日期和时间格式进行解释。
如何确定结果字符串由冒号而不是点分隔?
我建议指定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日。)
useUserOverride
参数设置为false,否则某些用户设置可能会覆盖区域性设置。例如,在您的情况下,我建议使用new CultureInfo("ar-SA", false)
。
:
具有特殊含义:它是时间分隔符。(自定义日期和时间格式字符串)。
使用\
逃脱它:
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的回答对解决我的问题很有帮助。
我还用测试表进行了进一步研究,发现当当前区域性设置为"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版本中都是文化。
将日期转换为字符串
使用名称空间
using System.Globalization;
码
string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");