【问题标题】:DateTime.TryParse without Culture没有文化的 DateTime.TryParse
【发布时间】:2020-03-17 08:43:33
【问题描述】:

我想检查日期是否可以解析。但是当我尝试使用以下逻辑时,它会落在有效日期(例如:‎3‎/‎10‎/‎2020)。 我正在通过 ajax 请求接收这个 myDate。

我尝试过改变文化,但还是没用

DateTime validMyDate;
if(DateTime.TryParse(myDate, CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None, out validMyDate)){}

感谢您的帮助

已编辑:请在此处找到 ajax 代码

//fileds

<input name="StartDate" id="StartDate" type="hidden" value="3/10/2020 12:00:00 AM"  data-val="true">
<input name="EndDate" id="EndDate" type="hidden" value="3/26/2020 12:00:00 AM"  data-val="true">

// ajax call
$.get(domainUrl + "Controller/Action",
            {
              strartDate: dateFormatter.fomat($('#StartDate').val(), "mm/dd/yyyy"),
                endDate:  dateFormatter.fomat($('#EndDate').val(), "mm/dd/yyyy");
            },
            function (result) {

            }).fail(function (error) {

            });


// date formatter
var dateFormatter = {
    fomat: function (date, format) {
        var year = date.getFullYear();
        var month = date.getMonth() < 10 ? '0' + date.getMonth() : date.getMonth();
        var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
        var newDate;
        switch (format) {
            case "dd/mm/yyyy": newDate = day + "/" + month + "/" + year;
                break;            
            default: newDate = year + "-" + month + "-" + day;
        }
        return newDate;
    }
}       

请注意:这个格式化功能是添加的,因为.val()在乞讨时不起作用,所以我再次格式化它以检查它是否有效。

【问题讨论】:

  • "我正在通过 ajax 请求接收这个 myDate" - 你能更改你的 AJAX 代码吗?我强烈建议您确保以 ISO-8601 格式 (yyyy-MM-dd) 传输日期。
  • 但我怀疑这失败的至少部分原因是您的字符串包含 U+200E 五次。这是从左到右的标记字符,实际上不应该出现在字符串中的任何位置。
  • 这不是语言环境问题(尽管使用 MM/dd/yyyy 作为 IMO 数据格式不是一个好主意)。这是您的数据中存在额外不可见字符的问题。
  • 需要修复的代码是Javascript代码。为什么一开始就有看不见的字符?为什么要自己格式化日期,为什么不至少使用Date.toISOString()
  • 我不是 javascript 程序员,但我一点也不喜欢你的 javascript。如果month 小于 10 则为字符串,如果大于则为整数。 day 也是如此。这让我的老程序员皮肤毛骨悚然。

标签: .net c#-4.0 .net-core


【解决方案1】:

这段代码绝对有效:

if (DateTime.TryParseExact("3/10/2020","d/M/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime validStartDate))
{
}

但是你的字符串有问题。如果我从您上面的评论中复制“2020 年 3 月 10 日”,则它不起作用。如果我自己写它就可以了。您的字符串必须采用某种奇怪的编码,但我无法确定它是什么。

编辑: 要删除不可见字符,请执行以下操作:

var str = "‎3‎/‎10‎/‎2020";
str = str.Replace("\u200E","");
if (DateTime.TryParseExact(str,"d/M/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime validStartDate))
{
}

但这将是一个黑客攻击。问题应该在另一端改变。

【讨论】:

  • 就是OP的字符串中包含U+200E五次。
  • @JonSkeet:嗯,这就解释了。你是怎么知道的?粘贴到 Notepad++ 中并没有显示出来。
  • 我这里有个小工具:csharpindepth.com/Articles/Unicode#explorer
  • @KosalaFernando:那么问题出在 AJAX 代码中,我们不知道它是什么样子的。
  • 我强烈建议不要在没有进一步调查的情况下解决问题。它很可能会出现在其他地方。找出为什么这些字符被发送,并修复它。如果您因问题而中断,此解决方案可能在短期内很有用,但我会优先解决根本原因。
猜你喜欢
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
相关资源
最近更新 更多