1

我目前正在编写一个 ASP.NET 应用程序(在 SharePoint 中),它需要对表单中的字段执行验证。我目前正在寻找验证日期和时间的方法,包括比较两个日期时间(小于/大于)和验证格式。

我最初查看了datejs,但自 2007 年以来一直没有更新。根据文档,最后一个版本似乎缺少两个函数 - isAfter 和 isBefore - 所以我将注意力转移到使用moment javascript library

我目前有一个开始日期、开始时间、结束日期和结束时间文本字段 - 所有这些都是必需的,所以我没有开始日期时间和结束日期时间 - 用户输入输入。我还使用 jQuery Date Picker 和jquery-ui-timepicker-addon来选择日期和时间。

我遇到的一个问题是在时间字段中输入时间时,我可以输入以下内容:

11:90 - 这将调整为 11:59。

11:100 - 没有调整。

这是我将值输入自定义验证 javascript 函数以验证时间的地方。这是使用以下代码完成的:

function ValidateTimeFormat(objSource, objArgs) {
    var strToCompare = objArgs.Value;
    var timeFormat = 'HH:mm';
    var expectedEndDateObj = moment(strToCompare, timeFormat);
    objArgs.IsValid = expectedEndDateObj.isValid();
} 

使用 ASP.NET 代码段:

<div class="label-div">
    <asp:Label ID="StartTimeLabel" runat="server" Text="Actual Start Time:"></asp:Label>
    <asp:RequiredFieldValidator ID="ActualStartTimeRequiredValidator" 
        runat="server" 
        ControlToValidate="StartTimeTextBox"
        ErrorMessage="Actual start time is required field" 
        Display="Dynamic">*</asp:RequiredFieldValidator>
    <asp:CustomValidator ID="ActualStartTimeCustomValidator" 
        runat="server"
        ControlToValidate="StartTimeTextBox"
        ErrorMessage="Actual start time format is not correct" 
        Display="Dynamic" 
        ClientValidationFunction="ValidateTimeFormat">*</asp:CustomValidator>
</div>
<asp:TextBox ID="StartTimeTextBox" runat="server" ></asp:TextBox></li>

根据momentjs(如果我删除jQuery Time Picker):

  • 11:90 无效。
  • 11:100 有效。

我还没有看到任何论坛或对 momentjs 的支持,所以我想我会在这里问。有无数种方法可以验证时间,包括在您自己的自定义验证例程中使用正则表达式 - 但我现在不想重新发明轮子。我想要一个很好的图书馆来做这件事。

只是引用 momentjs 文档进行验证isValid

mainmoment()函数非常灵活,在解析输入时会允许溢出。例如,moment("2012-01-40", "YYYY-MM-DD")将日期值溢出到月份,使实际时刻为 2 月 9 日(1 月 31 天 + 2 月 9 天)。

这在获取一年中的第 150 天或一天中的第 500 分钟时很有用,但是,在尝试解析用户输入时可能会出现问题。

添加了 moment#isValid 以检查片刻的输入是否确实是有效日期。

鉴于该库是 Date 的包装器,我不确定这是javascript问题还是moment - 或者确实是我自己!

有什么想法吗?

4

1 回答 1

0

这看起来像是一个问题。从 2.3.0 开始,您可以尝试使用此处提到的严格解析 - http://momentjs.com/docs/#/parsing/string-format/

但是我仍然发现时刻解析器认为像 "01:k0 A" 这样的时间对 "hh:mm A" 有效

于 2013-10-10T23:11:07.073 回答