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的建议。编辑被拒绝了,所以我自己添加了它。