我们在尝试对ToString()
值执行DateTime
时遇到Web应用程序和Windows服务之间的奇怪行为。
请参阅下面的示例。
DateTime parsedReportDate;
reportDate = DateTime.Now.ToString("yyyyMMdd");
reportDateWithSlash = DateTime.Now.ToString("dd/MM/yyyy");
if (DateTime.TryParse(MyDateValue, out parsedReportDate))
{
reportDate = parsedReportDate.ToString("yyyyMMdd");
reportDateWithSlash = parsedReportDate.ToString("dd/MM/yyyy");
}
--reportDateWithSlash on Web Application: 28/03/2017
--reportDateWithSlash on Windows Service: 28-03-2017
Windows服务调用与Web应用程序相同的功能,那么为什么格式不同呢?
答案 0 :(得分:2)
将日期格式化为字符串使用CultureInfo
对象来了解要使用的格式。
每个Thread
都有Thread.CurrentCulture
属性。
您可以通过使用Thread.CurrentThread
获取当前CultureInfo
然后检查其Thread
属性,找出当前Thread
设置的Thread.CurrentCulture
。
public class Program
{
public static void Main()
{
Console.WriteLine(Thread.CurrentThread.CurrentCulture.Name);
}
}
https://dotnetfiddle.net/dsA3VT
输出:en-US
您可以为CultureInfo
设置Thread
,也可以在每次调用时将其传递给ToString
。
您可以使用与阅读相同的属性来设置Thread.CultureInfo
。
Thread.CurrentCulture = new CultureInfo("en-gb");
不幸的是.Net Fiddle不支持更改线程属性。
我不知道这一点,但是bradbury9指出,自.net 4.6以来你也可以设置CultureInfo.CurrentCulture
属性。
CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL");
不幸的是.NetFiddle也不支持以这种方式改变文化。
'DateTime.ToString'有重载,可能需要IFormatProvider
和CultureInfo
条款IFormatProvider
。
DateTime.Now.ToString(new CultureInfo("en-gb"));
https://dotnetfiddle.net/qkS5HF
public class Program
{
public static void Main()
{
var dateTime = DateTime.Now;
Console.WriteLine(Thread.CurrentThread.CurrentCulture.Name);
Console.WriteLine(dateTime.ToString(CultureInfo.InvariantCulture));
Console.WriteLine(dateTime.ToString(new CultureInfo("en-us")));
}
}
输出:
en-US
03/28/2017 09:43:49
3/28/2017 9:43:49 AM
答案 1 :(得分:0)
问题必然来自不同的文化。对DateTime.ToString (String, IFormatProvider)属性使用CultureInfo.InvariantCulture
重载可以解决问题:
DateTime.Now.ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);
答案 2 :(得分:0)
可能是调用Windows服务正在格式化日期的内容。代码当然很清楚。尝试通过附加到正在运行的进程来调试Windows服务,并查看它生成的内容。如果您的服务使用者是一个Web应用程序,请查看F12开发人员工具,并查看在响应流中发回的内容。