【问题标题】:problem in comparing two dates比较两个日期的问题
【发布时间】:2011-08-28 00:40:31
【问题描述】:

我使用两个CalendarExtender 来组合两个日期:开始日期结束日期,我使用compare validator 来验证结束日期是否大于开始日期。

当结束日期的日期小于开始日期的日期时验证器触发的问题,即使整个结束日期大于整个开始日期..

如何解决这个问题?

我的 aspx:

1-开始日期:

<asp:TextBox ID="txt_startDate" runat="server" ValidationGroup="insertgroup" MaxLength="10"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txt_startDate"
    ErrorMessage="!" ValidationGroup="insertgroup"></asp:RequiredFieldValidator>
<cc1:MaskedEditExtender ID="txt_startDate_MaskedEditExtender" runat="server" CultureAMPMPlaceholder=""
    CultureCurrencySymbolPlaceholder="" CultureDateFormat="" CultureDatePlaceholder=""
    CultureDecimalPlaceholder="" CultureThousandsPlaceholder="" CultureTimePlaceholder=""
    Enabled="True" Mask="99/99/9999" MaskType="Date" TargetControlID="txt_startDate">
</cc1:MaskedEditExtender>
<cc1:CalendarExtender ID="txt_startDate_CalendarExtender" runat="server" Enabled="True"
    TargetControlID="txt_startDate" Format="dd/MM/yyyy">
</cc1:CalendarExtender>

2-结束日期:

<asp:TextBox ID="txt_endDate" runat="server" ValidationGroup="insertgroup" MaxLength="10"></asp:TextBox>
<cc1:CalendarExtender ID="txt_endDate_CalendarExtender" runat="server" TargetControlID="txt_endDate"
    Format="dd/MM/yyyy">
</cc1:CalendarExtender>
<cc1:MaskedEditExtender ID="txt_endDate_MaskedEditExtender" runat="server" CultureAMPMPlaceholder=""
    CultureCurrencySymbolPlaceholder="" CultureDateFormat="" CultureDatePlaceholder=""
    CultureDecimalPlaceholder="" CultureThousandsPlaceholder="" CultureTimePlaceholder=""
    Enabled="True" Mask="99/99/9999" MaskType="Date" TargetControlID="txt_endDate">
</cc1:MaskedEditExtender>
<asp:RequiredFieldValidator ID="RequiredFieldValidator10" runat="server" ControlToValidate="txt_endDate"
    Display="Dynamic" ErrorMessage="!" ValidationGroup="insertgroup"></asp:RequiredFieldValidator>
<asp:CompareValidator ID="CompareValidator2" runat="server" ControlToCompare="txt_startDate"
    ControlToValidate="txt_endDate" Display="Dynamic" ErrorMessage="????? ??????? ??? ?? ???? ??? ?? ????? ???????"
    Operator="GreaterThan" Type="Date" ValidationGroup="insertgroup"></asp:CompareValidator>

编辑: 两个日期的示例会产生问题:

//error message
    start date: 
    28/01/2014

    end date :
    25/07/2014

同时

// no error message
    start date: 
    28/01/2014

    end date :
    01/07/2014

【问题讨论】:

标签: asp.net ajax validation calendarextender


【解决方案1】:

这里有一些关于您为什么会出现这种行为以及为什么 Chad 的代码会帮助您的更多信息。

现在,您的应用程序在一种文化设置下运行,即日期应该是 mm/dd/yyyy(您的计算机或网络服务器像美国人一样工作)。如果您查看 ASP.NET 为验证器发出的 javascript,您会发现在进行比较时,它首先检查 ControlToValidate 的数据类型是否正确。它通过使用 RegEx 解析输入的值来做到这一点,并期望月份值是第一个,然后是天(因为文化设置)。当它看到您的值 25 时,它认为这是一个无效的月份,因此说您的日期无效。然后它返回 false,甚至不检查第二个字段的日期值或尝试比较它们。

在您的第二个示例中,验证通过,因为首先,它检查结束日期的数据类型,该日期可以是有效的 mm/dd/yyyy 日期。然后它检查第二个日期的数据类型,因为 28,导致它认为它不是一个有效的日期。然后验证器返回 true,因为它假定有效日期大于无效日期。

Chad 的代码会将您页面线程的文化设置为使用 dd/MM/yyyy 格式的文化,因此您的验证器将在检查您的日期是否有效时使用它。

这里是the MSDN page,提供有关文化设置及其作用的更多信息。

【讨论】:

  • “网络服务器像美国人一样工作”阅读正常:p
  • 谢谢,但我得到了同样的错误。我不知道是什么问题?你的解释对我来说非常好和合乎逻辑,我以为我解决了问题,但在查德的代码之后,我仍然面临同样的问题。
  • 终于明白了,非常感谢。我将Culture="ar-EG" 放在页面指令中,它可以工作。
【解决方案2】:

试着把它放在页面加载后面的代码中

System.Globalization.CultureInfo vCulture = (System.Globalization.CultureInfo)System.Globalization.CultureInfo.CreateSpecificCulture("en-GB").Clone(); 
vCulture.DateTimeFormat.ShortDatePattern = "dd/mm/yyyy";    
System.Threading.Thread.CurrentThread.CurrentCulture = vCulture; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    相关资源
    最近更新 更多