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

时间:2017-04-07 06:48:56

标签: c# sql-server date parsing datetime

我的项目中有一个关于日期时间的重大问题。用户提供日期输入,或者有时我根据项目要求从数据库中获取日期。但是如果手动插入用户给出的格式不同,我从数据库获得的日期格式与不同的服务器不同。为了使日期时间采用一种格式,我在开发中使用了这种方法tryParseExact()它运行正常,但在生产中它也失败了生产日期时间格式也不同,所以有时它会解析,有时需要错误的dateformat而不是采用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;
}

这里有一个问题是格式数组中给出的格式序列,第二个我必须根据用户输入在数组中添加所有类型的日期时间格式。 请帮助获得统一的解决方案。

1 个答案:

答案 0 :(得分:3)

你的方法是不可能的!

想象一下用户输入dd/MM/yyyy(今天7 apr 2017的日期)。如果这是4月7日或7月4日,你无法知道

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

如果允许用户输入部分字词(例如select d.* ,((d.week-m.min_w+1) -(48*(cast(left(d.week,4) as int) - cast(left(min_w,4) as int) ) ) )as dynamic_week from dynw d inner join (select store_id,min(week) min_w from dynw group by store_id ) m on d.store_id=m.store_id order by 1,2 ),情况会更糟。

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