Web应用程序和Windows服务之间的DateTime.ToString格式不一致

时间:2017-03-28 09:26:36

标签: c# windows-services

我们在尝试对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应用程序相同的功能,那么为什么格式不同呢?

3 个答案:

答案 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.CultureInfo

Thread.CurrentCulture = new CultureInfo("en-gb");

不幸的是.Net Fiddle不支持更改线程属性。

我不知道这一点,但是bradbury9指出,自.net 4.6以来你也可以设置CultureInfo.CurrentCulture属性。

CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL");

不幸的是.NetFiddle也不支持以这种方式改变文化。

将CultureInfo传递给ToString

'DateTime.ToString'有重载,可能需要IFormatProviderCultureInfo条款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开发人员工具,并查看在响应流中发回的内容。