C# 如何根据主机日期时间格式解析日期时间

C# 如何根据主机日期时间格式解析日期时间,c#,sql-server,date,parsing,datetime,C#,Sql Server,Date,Parsing,Datetime,我的项目中有一个关于日期时间的主要问题。用户输入日期,有时我根据项目要求从数据库中获取日期。但是,如果用户手动插入,则用户提供的格式是不同的,并且我从数据库获得的日期格式在不同的服务器上是不同的。为了将日期时间转换成一种格式,我在开发中使用了这个方法tryParseExact(),它运行正常,但在生产中也失败了。生产日期时间格式不同,所以有时解析,有时采用错误的日期格式,比如不采用dd/MM/yyyy,而是采用MM/dd/yyyy。我添加了用于解析日期时间的代码段 SqlParameter St

我的项目中有一个关于日期时间的主要问题。用户输入日期,有时我根据项目要求从数据库中获取日期。但是,如果用户手动插入,则用户提供的格式是不同的,并且我从数据库获得的日期格式在不同的服务器上是不同的。为了将日期时间转换成一种格式,我在开发中使用了这个方法
tryParseExact()
,它运行正常,但在生产中也失败了。生产日期时间格式不同,所以有时解析,有时采用错误的日期格式,比如不采用dd/MM/yyyy,而是采用MM/dd/yyyy。我添加了用于解析日期时间的代码段

SqlParameter StartingDateParam=null;
DateTime mdate=null;
string idate = GetEffectiveFromDate();//retriving date from database

string[] formats = new[] { "dd-MM-yyyy", "MM/dd/yyyy", "dd/MM/yyyy", "yyyy-MM-dd", "dd/MM/yyyy HH:mm:ss"};

string sysFormat = CultureInfo.CurrentCulture.DateTimeFormat.;//getting the host datetime format

if (DateTime.TryParseExact(idate, formats, System.Globalization.CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None, out mdate))
{ 
    StartingDateParam = new SqlParameter("@startingdate", SqlDbType.DateTime);
    StartingDateParam.Value = mdate;
}
这里的一个问题是formats数组中给定的格式序列,其次我必须根据用户输入在数组中添加所有类型的datetime格式。
请帮助获得统一的解决方案

你的方法是不可能的

想象一下,用户输入的2017年4月7日(今天的日期为2017年4月7日)。你无法知道这是4月7日还是7月4日

如果允许用户以两位数输入年份,情况会更糟

更糟糕的是,如果允许用户以文字形式输入部分内容(例如2017年4月7日)


明确建议:使用日期选择器控件而不是文本输入。至少在应用程序中进行转换,并将转换后的日期呈现给用户。目前,当代码处理值时,验证/转换必须已经完成…

您的方法是不可能的

想象一下,用户输入的2017年4月7日(今天的日期是2017年4月7日),你无法知道这是4月7日还是7月4日

如果允许用户以两位数输入年份,情况会更糟

更糟糕的是,如果允许用户以文字形式输入部分内容(例如2017年4月7日)



明确建议:使用日期选择器控件而不是文本输入。至少在应用程序中进行转换,并将转换后的日期提供给用户。目前,当代码处理值时,验证/转换必须已经完成…

尝试更改
System.Globalization.CultureInfo.CurrentCulture
进入
系统.全球化.文化信息.不变量文化
日期时间.TryParseExact
中,它仍然不起作用。你能给我们一个失败的日期例子吗?有时它采用系统日期格式。我遇到了类似的问题。请尝试在数据库中始终以唯一的格式保存日期,这样它就会成功更容易检索。尝试将
System.Globalization.CultureInfo.CurrentCulture
更改为
System.Globalization.CultureInfo.InvariantCulture
中的
DateTime.TryParseExact
不,它仍然不工作。您能给我们一个日期传递失败的示例吗?有时它采用系统日期格式。我遇到了类似的问题假设。尝试在数据库中始终以唯一的格式保存日期,以便更容易检索。好的,对于用户,我可以将其限制为特定的格式,但主机格式如何?它在生产中以及使用
datetime时会发生更改。现在,
它为每个用户提供不同的格式。如何解析这些格式?@abhishek
DateTime.Now
没有任何格式,是一个日期。如果您在
DateTime上执行
ToString
。Now
要将值保存到数据库中作为字符串,请始终使用
InvariantCulture
如下所示:
DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantCulture);
。这样,无论应用程序中的文化背景如何,格式都将保持一致client@abhishek-
DateTime。现在
不会生成不同的格式。它会生成一个
DateTime
,它在内部只存储自01/01/0001以来的100ns间隔数。将
DateTime
s转换为字符串时会出现问题。因此尽可能多地使用oid(从用户处获取输入,转换为
DateTime
,仅在向用户展示时转换回字符串)@正如其他人所说,您正在混合日期的值及其文本表示。您不应该依赖于系统的区域性设置,也不应该依赖于任何依赖于区域性/语言的日期/时间格式。我有一个问题,如果机器格式是MM/dd/yyyy,用户输入是dd/MM/yyyy格式,那么如果我尝试转换,我会遇到异常吗使用
Convert.ToDateTime()
将其转换为datetime并存储在数据库中?对用户来说,我可以将其限制为特定格式,但主机格式如何?它在生产过程中以及使用
datetime时会发生变化。现在
为每个用户提供不同的格式。如何解析这些格式?@abhishek
datetime。现在
没有任何格式,是日期。如果您愿意的话ing
ToString
on
DateTime.Now
要将值作为字符串保存到数据库中,请始终像这样使用
InvariantCulture
DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantCulture);
。这样,无论应用程序中的文化背景如何,格式都将保持一致client@abhishek-
DateTime。现在
不会生成不同的格式。它会生成一个
DateTime
,它在内部只存储自01/01/0001以来的100ns间隔数。将
DateTime
s转换为字符串时会出现问题。因此尽可能多地使用oid(从用户处获取输入,转换为
DateTime
,仅在向用户展示时转换回字符串)@正如其他人告诉阿披实的那样,你把日期的值和它的文本表示混为一谈。你不应该依赖于系统的文化设置,也不应该依赖于任何文化/语言相关的日期/时间格式。我有一个问题,如果机器