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

C# Web应用和Windows服务之间的DateTime.ToString格式不一致,c#,windows-services,C#,Windows Services,在尝试对DateTime值执行ToString()时,我们在web应用程序和windows服务之间遇到了奇怪的行为。 请参见下面的示例 DateTime parsedReportDate; reportDate = DateTime.Now.ToString("yyyyMMdd"); reportDateWithSlash = DateTime.Now.ToString("dd/MM/yyyy"); if (DateTime.TryParse(MyDateValue, out parsedRep

在尝试对
DateTime
值执行
ToString()
时,我们在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应用程序调用的函数相同,那么为什么格式不同呢?

将日期格式化为字符串使用对象来知道要使用的格式

每个人都有自己的财产

public class Program
{
    public static void Main()
    {
        Console.WriteLine(Thread.CurrentThread.CurrentCulture.Name);
    }
}
通过使用获取当前
线程
,然后检查其
Thread.CurrentCulture
属性,可以了解当前
线程
设置了什么
CultureInfo

public class Program
{
    public static void Main()
    {
        Console.WriteLine(Thread.CurrentThread.CurrentCulture.Name);
    }
}

输出:
en-US

您可以为
线程设置
CultureInfo
,或者在每次调用
ToString
时传递它

设置Thread.CultureInfo 您可以使用与读取相同的属性设置
线程.CultureInfo

Thread.CurrentCulture = new CultureInfo("en-gb");
不幸的是.NETFiddle不支持更改线程属性

我不知道这一点,但bradbury9指出,由于.NET4.6,您也可以设置属性

CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("nl-NL");
不幸的是.NETFiddle也不支持以这种方式改变文化

将CultureInfo传递给ToString 具有可以接受的重载,并且
CultureInfo
实现
IFormatProvider

DateTime.Now.ToString(new CultureInfo("en-gb"));

输出:

en-US
03/28/2017 09:43:49
3/28/2017 9:43:49 AM

问题一定来自不同的文化。将重载与属性一起使用可以解决以下问题:

DateTime.Now.ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);

可能是Windows服务正在格式化日期。代码当然很清楚。尝试通过附加到正在运行的进程来调试windows服务,并查看它生成了什么。如果您的服务消费者是一个web应用程序,请查看F12开发人员工具,查看响应流中返回的内容。

可能是文化问题。尝试
DateTime.Now.ToString(“dd/MM/yyyy”,System.Globalization.CultureInfo.InvariantCulture)并通过
Regex
TryParseExact
@Pikoh进行求解,这可以通过查看两个文件中的CultureInfo.CurrentCulture进行确认environments@Pikoh,这确实解决了问题。请回答。@bradbury9是的,但无论如何使用
InvariantCulture
都可以解决问题,无需检查任何内容。或者在代码中使用InvariantCulture,使其在所有环境中的行为都相同,而不考虑当前使用的区域性。如果要使用的格式是不变区域性,则可以使用不变区域性。如果你想使用德语风格的格式,那么不变量就不是你想要的。我会对代码使用不变量区域性,而特定区域性仅用于显示目的。这样,使用不同文化和共享代码库的不同前端可以在必要时以非常严格的方式使用,但这是我个人的观点。是的,这是一个很好的选择,有助于减少出错的机会。感谢您提供有关设置CultureInfo.CurrentCulture的建议。编辑被拒绝了,所以我自己添加了它。