将表单提交中指定的任何日期转换为给定格式
Posted
技术标签:
【中文标题】将表单提交中指定的任何日期转换为给定格式【英文标题】:Convert any date specified in a form submission to a given format 【发布时间】:2015-07-03 11:12:55 【问题描述】:目前,我们正在为客户设置一些搜索功能,特别是在涉及日期和全球化时,我们有点进退两难。
在我们的搜索表单中,我们允许用户指定日期。在支持它的浏览器(例如 Chrome)上,将使用 html5 日期选择器输入日期,这样我们就不会使用任何不必要的 javascript。在那些没有的情况下,我们将使用 JavaScript 解决方案,例如 jQuery 日期选择器。
在 jQuery 日期选择器的情况下,我们可以在日期发布到处理表单发布的页面之前指定日期的格式。因此,如果我们总是希望日期显示为 dd/MM/yyyy,我们可以这样做。使用浏览器日期选择器,这超出了我们的控制范围,因为我相信日期格式是由所使用机器的语言决定的。
我们将在数据库中搜索的日期采用 dd/MM/yyyy 格式,因此我们希望将表单中的日期转换为这种格式。
我们曾尝试在 C# 中使用 DateTime.Parse 选项,但这会带来很多问题。
请看下面的代码:
/* Posted Data */
string difficulty = Request["tripDifficulty"];
string type = Request["tripType"];
string duration = Request["tripDuration"];
string startDate = Request["dateFrom"];
string endDate = Request["dateTo"];
string locale = Request.Headers["Accept-Language"].Split(new char[] ',' )[0];
CultureInfo ci = CultureInfo.GetCultureInfo(locale);
DateTime dateFrom = DateTime.Parse(startDate, ci);
DateTime dateTo = DateTime.Parse(endDate, ci);
List<string> dates = new List<string>();
for (DateTime dt = dateFrom; dt <= dateTo; dt = dt.AddDays(1))
string date = dt.Date.ToString("dd/MM/yyyy");
dates.Add(date);
在我们当前的代码实现中,我们使用浏览器的请求标头来检索接受语言标头中的第一项。因此,这将返回类似 [en-GB、en-US、fr-FR 等] 的内容。然后,我们使用它来定义 Razor 页面上的当前文化信息,然后尝试将表单发送的日期解析为给定文化的格式。
然后我们使用指定的两个日期来创建一个日期范围,以便我们可以在我们的数据库中搜索指定的两个日期之间的所有出发时间。
在我们的数据库中,日期将简单地以 dd/MM/yyyy 格式存储,因此无论表单来自什么格式,我们总是需要将输入转换为这种格式。
上述设置的问题是在我们使用 Javascript 的情况下,输入将被固定为 dd/MM/yyyy 但这可能不符合用户机器上的语言,这意味着接受语言标头将是不同,DateTime.Parse 将不起作用。
因此,我需要一种方法来确保表单中的日期无论是通过浏览器日期选择器、jQuery 日期选择器还是输入到已验证为某种格式的文本字段中都与我的数据库中的格式相同当它们被发送到执行处理的我的剃须刀页面或在剃须刀页面开始时转换为所需的格式时。
有没有人知道解决这个问题的最佳方法?
提前致谢。
【问题讨论】:
您能否在使用 javascript 选择器时简单地为时间格式填充一个隐藏字段,以便在使用该输入法时覆盖文化? 【参考方案1】:试试DateTime.ParseExact 和String.Format
例子
string someDate = "12/30/2015";
string[] formats = "MM/dd/yyyy", "dd/MM/yyyy" ;
DateTime date = DateTime.ParseExact(someDate, formats, new CultureInfo("en-US"), DateTimeStyles.None);
String.Format("0:dd/mm/yyyy", date);
更新:如果您的日期使用“.”或“-”作为分隔符,您可以使用 foreach 循环将它们替换为“/”。 像这样:
string someDate = "12.30.2015";
string newDate = "";
foreach (char c in someDate)
if (c == '.' || c == '-')
newDate += '/';
else
newDate += c;
【讨论】:
非常感谢。这意味着我可以指定最常见的日期格式(MM/dd/yyyy、dd/MM/yyyy、yyyy/MM/dd),然后如果这些都不存在,则会出错。 但是,存在一个问题,因为这不适用于使用 (.) 或 - 作为日期分隔符的国家/地区以上是关于将表单提交中指定的任何日期转换为给定格式的主要内容,如果未能解决你的问题,请参考以下文章
在表单上使用 jquery 日期选择器将用户输入转换为整数日期