将表单提交中指定的任何日期转换为给定格式

时间:2015-04-24 18:00:07

标签: c# html datetime datepicker

我们目前有一些困境,我们正在为客户设置一些搜索功能,特别是在日期和全球化方面。

在我们的搜索表单中,我们允许用户指定日期。在支持它的浏览器(例如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);
}

在我们当前的代码实现中,我们使用浏览器的请求标头来检索accept-language标头中的第一个项目。因此,这将返回类似[en-GB,en-US,fr-FR等]的内容。然后我们使用它来定义Razor页面上的当前文化信息,然后尝试将从表单发送的日期解析为给定文化的格式。

然后我们使用指定的两个日期创建一系列日期,以便我们可以在指定的两个日期之间搜索数据库中的所有离开。

在我们的数据库中,日期将简单地以dd / MM / yyyy格式存储,因此无论表单采用何种格式,我们始终需要将输入转换为此格式。

我们对上述设置的问题是在我们使用Javascript的情况下,输入将被修复为dd / MM / yyyy,但这可能不符合用户机器上的语言,这意味着接受语言标题将是不同,DateTime.Parse不起作用。

因此,我需要一种方法来确保我的表单中的日期是通过浏览器日期选择器,jQuery日期选择器选择还是输入到验证为特定格式的文本字段中的日期与我的数据库中的格式相同当它们被发送到我的剃刀页面进行处理或在剃刀页面的开头转换为所需的格式时。

有没有人对最佳方法有任何想法?

提前致谢。

1 个答案:

答案 0 :(得分:0)

使用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;
    }
}