在 Javascript 中验证日期时间

Posted

技术标签:

【中文标题】在 Javascript 中验证日期时间【英文标题】:Validating Date Time In Javascript 【发布时间】:2015-07-18 05:05:20 【问题描述】:

我需要一些帮助来根据浏览器的语言验证 javascript 中的日期时间字符串。

我可以很容易地获得日期时间格式,例如,如果语言设置为 pt-BR 格式将是

dd/MM/yyyy HH:mm:ss

我尝试使用这样的东西:

var dateFormat = "dd/MM/yyyy HH:mm:ss";
var x = Date.parseExact($("#theDate").val(), dateFormat);

但是 x 始终为 Null。我在想,因为 Date.parseExact 不能做时间。我需要能够为所有浏览器语言执行此操作,并且我不想使用其他库。使用正则表达式也不行,因为我需要编写很多不同的表达式。

有没有人有任何建议可以帮助我走上正轨?我也不反对使用网络方法。

我尝试使用以下 webmethod,它适用于 en-US,但没有别的:

Public Function ValidateDates(ByVal strDate_In As String) As String
    Dim theFormat As String = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern() + " " + CultureInfo.CurrentCulture.DateTimeFormat.LongTimePattern()
    Try
        Dim d As DateTime = DateTime.ParseExact(strDate_In, theFormat, CultureInfo.CurrentCulture)
        Return "true"
    Catch ex As Exception
       Return "false"
    End Try
End Function

【问题讨论】:

JavaScript 通常不理解本地日期,因此您必须以某种方式自己解析它。您如何获得本地日期格式的开头? 我正在使用全球化文化。这是一个 asp.net 网络应用程序,我也可以通过 vb.netcultureinfo 获得它。我也必须使用此日期格式以正确的格式显示日期。我们使用 datetimepickers 来选择日期,但是我们希望用户也能够输入日期,这就是问题所在。有些国家如 dd/mm/yyyy 有些是 dd.mm.yyyy 等。部分问题还在于时间在同一个输入框中。我什至尝试过使用使用 vb.net 的 DateTime.ParseExact 的网络方法,但我似乎也无法让它工作。 所以用ajax将日期发送到服务器并在那里解析成时间戳 查看我对我尝试的网络方法的编辑。 【参考方案1】:

您可以使用正则表达式来执行此操作:

var dateFormat = "dd/MM/yyyy HH:mm:ss";
var x = $("#theDate").val().match(/^(\d2)\/(\d2)\/(\d4) (\d2):(\d2):(\d2)$/);
console.log(x);

演示:https://jsfiddle.net/kzzn6ac5/

更新 以下正则表达式可以帮助您并根据您的需要进行改进:

^((\d2|\d4)[\/|\.|-](\d2)[\/|\.|-](\d4|\d2) (\d2):(\d2):(\d2))$

它与/.-yyyy/mm/dd hh:mm:ssdd/mm/yyyy hh:mm:ss匹配以下格式

更新的演示:https://jsfiddle.net/kzzn6ac5/1 或 https://regex101.com/r/aT1oL6/1

更多与日期匹配相关的正则表达式可以在here找到。

【讨论】:

OP 说 Regex 对他的场景没有用处! 是的,我更新了anwser,它匹配dd-mm-yyyydd/mm/yyyy。已经测试过了! :) @NiteTrip 如果您想强制执行特定格式,您可以使用正则表达式匹配一般日期格式,然后检查不同捕获组匹配的捕获内容(即“-”或“/” ) (假设“...不应该以 dd/mm/yyyy 的格式放入它。”意味着您在某些情况下不允许某些格式) 所以您需要检索日期格式,然后将其设置为:new RegExp(date) @NiteTrip 日期格式的数量非常有限。如果您查看我添加到此答案的链接,则有许多现成的正则表达式可用于匹配大多数格式。如果这太难了,只需设置一种格式供用户使用。鉴于 mm-dd-yyyy 和 dd-mm-yyyy 看起来一样,您无论如何都需要设置一些规则。【参考方案2】:

JavaScript 日期对象看似简单,我曾在一个项目中使用过它们,但它们的学习曲线很隐秘,需要花费大量时间才能掌握(与 JavaScript 的其余部分相反,这是相对幼稚的游戏)。我建议让 VB 或其他任何东西来处理它。

但是,如果您想在没有 Regex 的情况下在 javascript 中执行此操作(如您的问题中所述),您可以像这样对其执行字符串操作:

try 
    var user_input = $("#theDate").val();
    var split = user_input.split(" "); // 0: date, 1: time
    var split_time = split[1].split(":"); // 0: hours, 1: minutes, 2: seconds

    d.setHours(split_time[0]);
    d.setMinutes(split_time[1]);
 catch 
    // not in a valid format

此解决方案假定输入格式正确,如果发生错误,则不是。这不是最好的处理方式,但 JS Date 对象非常可怕。

【讨论】:

以上是关于在 Javascript 中验证日期时间的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript:日期选择器组件的使用

JavaScript:日期选择器组件的使用

开始日期结束日期验证 -Jquery/javascript - kendoUI

为 2 Datepicker 开始日期和结束日期设置验证 javascript

在javascript中检查给定的日期格式

JavaScript isDateValid - 在javascript中验证日期