【问题标题】:TryParseExact() method not parsing dates selected from jQuery's datepickerTryParseExact() 方法不解析从 jQuery 的 datepicker 中选择的日期
【发布时间】:2015-04-01 04:49:24
【问题描述】:

我正在通过以下方式使用 jQuery 的 datepicker 小部件(在我的 Master Page 中):

<script>
   $(".datepicker").datepicker({
                    showAnim: 'fadeIn',
                    minDate: 0,
                    maxDate: "3M",
                    dateFormat: "dd-mm-yy"                    
                });
 </script>

我的内容页面中有一个asp:Repeater控件。在(我的内容页面的)C#代码中,我使用DateTime.TryParseExact方法来获取来自转发器控件的日期并按以下方式对其进行解析:

for (int i = 0; i < rptr.Items.Count; i++)
 {
....
...//find other controls
...
      TextBox txtDate = (TextBox)rptr.Items[i].FindControl("txtServiceDate");

   DateTime eventDate = new DateTime();

            if (txtDate.Text != null)
            {
                if (DateTime.TryParseExact(txtDate.Text, "dd-mm-yy", null, System.Globalization.DateTimeStyles.None, out eventDate))
                {
                    cartObj.ServiceDate = eventDate; //code doesn't go here
                }
                else
                {
                    cartObj.ServiceDate = DateTime.Now; //code reaches here!which means parsing failed
                }
            }
            else
            {
                cartObj.ServiceDate = DateTime.Now;
            }
...
....

...//other code
}

正如您在datepicker() 中看到的,我已将日期格式指定为dd-mm-yy', but this date doesn't get formatted in myTrParseExact()` 方法,即使指定的格式相同。

可能有什么问题?

编辑: 我添加了在调试模式下进入 TryParseExact 方法的屏幕截图:

【问题讨论】:

  • mm 表示 .NET 自定义格式字符串中的分钟,而不是几个月...(我也强烈建议使用 yyyy 而不是 yy... 最好是 yyyy -MM-dd 而不是相反的方式......这样它就是 ISO-8601 格式。)
  • @JonSkeet:我使用的是yyyy-MM-dd 格式。但这也没有得到解析,我想我不能在datepicker() 中使用相同的格式,因为它不会产生所需的日期格式。
  • 那么,通过给出一个无法解析的值的样本,将 jQuery 部分剪掉,并将其硬编码为一个简短但完整的程序来演示该问题。
  • 你是否建议我从 datepicker() 中删除 dateFormat 选项??
  • 不完全是,因为您将 null 作为 IFormatProvider 传入。最好解析成CultureInfo.InvariantCulture。但除此之外,屏幕截图看起来还不错 - 但不是问题其余部分中显示的代码。如果在您更改为使用不变文化后仍然无法正常工作,我建议您尝试在一个简短但完整的示例中隔离该行为,最好是作为控制台应用程序。

标签: c# jquery asp.net datepicker


【解决方案1】:

您正在尝试按如下方式格式化您的日期:

dd-mm-yy

[day]-[minute]-[year]

在 .NET 中,月份表示为 MM

您可以在此处找到所有日期字符串表示形式的完整参考 https://msdn.microsoft.com/en-us/library/8kb3ddd4%28v=vs.110%29.aspx

【讨论】:

    【解决方案2】:

    在 C# 中,mm 表示分钟。尝试使用 MM,如:

    if (DateTime.TryParseExact(txtDate.Text, "dd-MM-yy", etc etc etc
    

    【讨论】:

      【解决方案3】:

      所有功劳归于 @Jon Skeet。在TryParseExact() 方法中,我将null 作为值传递给IFormatProvider。在其中传递文化信息,发挥了作用。

      我将IFormatProvider 的值更改为CultureInfo.InvariantCulture,它位于System.Globalization 命名空间中。

      CultureInfo.InvariantCulture 属性用于您提前不确定日期和十进制/货币值的文化格式。

      以下是我现在使用的方法:

       if (DateTime.TryParseExact(txtDate.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture , System.Globalization.DateTimeStyles.None, out eventDate))
         {
            //date parsed successfully . Do something with it !
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-24
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-05
        相关资源
        最近更新 更多