【问题标题】:How to make javascript Date.parse understand short years?如何让 javascript Date.parse 理解短暂的岁月?
【发布时间】:2010-07-12 01:30:50
【问题描述】:

我注意到Date.Parse 不能只处理 2 位数的日期。

说我有这个

mm/dd/yy = 7/11/20

日期解析会认为它是= 7/11/1920。你能设置它使用2000年吗?有点奇怪我得到了 jquery u.i 日期选择器,如果你输入7/11/20,它会找出2020

所以如果Date.parse 能跟上就好了,我宁愿让他们俩都不知道发生了什么,或者都知道发生了什么,然后让一个知道的和一个不知道的。

【问题讨论】:

  • 最好的解决方案是始终提供完整的日期。
  • @BurnoLM 我同意这就是为什么我在单击文本框时弹出一个日期选择器的原因,但是出于某种原因,用户仍然可以出于某种原因手动输入我在“20 年 7 月 11 日”所做的事情。它不会影响我的任何 C# 代码,因为它发现它是 2020 年,但它会破坏我的一些下拉列表,这些下拉列表会根据日期进行过滤。因此,如果我可以修复它,我也希望无论出于何种原因 jquery validate "date" 都认为它不是验证错误并且格式有效。

标签: javascript jquery-ui datepicker


【解决方案1】:

我不知道。但您可以随时调整年份:

YourDate="7/11/20";
DateObj=new Date(YourDate.replace(/(\d\d)$/,"20$1"));

alert(DateObj);

This code in action.

编辑:以下代码将处理整年和短年:

YourDate="7/11/2020";
DateObj=new Date(YourDate.replace(/\/(\d\d)$/,"/20$1"));

alert(DateObj);

This code in action.

【讨论】:

  • 这是在做什么?我对 1 美元有点困惑,用户也总是可以给出完整的日期。然后这失败了。那么怎么修改呢?
  • 这种方法的问题是,如果他们输入 7/11/98,日期将是 7/11/2098,这可能不是他们的意思,除非他们是在您的特定情况下,输入总是应该是在未来。需要在某处有一个截止日期才能使两位数日期起作用......截止日期是任意的,但大约 50 可能是有意义的......但实际上,根本不接受两位数日期将是我最好的主意思考。 :)
  • @chobo2 - $1 插入在正则表达式中找到的值((\d\d) 部分,为两位数)。
  • @chobo2 - 没有默认值。 \/(\d\d) 尝试匹配 /dd,其中 d 是一个数字。如果匹配,则将匹配替换为/20dd,如果没有,例如/2015,则不会替换。
【解决方案2】:

所以您的问题是您是否可以更改 Date.parse 的工作方式,以便将低编号的两位日期解释为 2000 年之后的日期?

是的,可以做到,只需使用自己的解析函数隐藏 Date.parse 即可。

// don't do this!
Date.parse = function (str) { /* your parse routine here */ }

当然,隐藏宿主对象的属性(包括“方法”又名函数属性)通常是一个非常糟糕的主意,因为它会导致其他脚本中期望这些属性以某种方式工作的错误行为。

使用两位数字日期也是一个坏主意,但这可能超出您的控制范围。如果它不是您无法控制的,我建议您忘记两位数的日期并使用全年值。

【讨论】:

  • 强制执行:这非常非常危险!
【解决方案3】:

这是我的解决方案:

function parseDate(stringValue)
{
    var date = new Date(stringValue);
    if (!isNaN(date.getTime()))
    {
        // if they typed the year in full then the parsed date will have the correct year, 
        // if they only typed 2 digits, add 100 years to it so that it gets translated to this century
        if (stringValue.indexOf(date.getFullYear()) == -1)
        {
            date.setFullYear(date.getFullYear() + 100);
        }

        return date;
    }
    else
    {
        return null;
    }
}

【讨论】:

    【解决方案4】:

    这个怎么样?

    var date = '7/11/20';
    var idx = date.lastIndexOf('/') + 1;
    date = date.substr(0,idx) + '20' + date.substr(idx);
    var result = Date.parse(date);​
    alert(result);
    

    或此版本将首先测试 YYYY 格式。

    var date = '7/11/2020'; 
    var idx = date.lastIndexOf('/') + 1;
    if(date.substr(idx).length < 4) {
        date = date.substr(0,idx) + '20' + date.substr(idx);
    }
    var result = Date.parse(date);
    alert(new Date(result))​;​
    

    【讨论】:

    • @BrunoLM - 我认为假设是始终使用 YY 格式。很容易为 YYYY 格式添加测试。
    • 用户可以输入 YY 或 YYYY。我不确定 YYY 不知道这是否有效。我知道前 2 个 C# 可以计算和解析,datepicker 也可以。
    猜你喜欢
    • 1970-01-01
    • 2020-12-25
    • 2015-11-23
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多