从字符串日期中删除时间和时区

时间:2017-07-08 16:03:23

标签: javascript date datetime

我想从传递给我的函数的不同格式的字符串中获取日期(没有时区或时间)。我遇到的问题是由于我所处的时区,日期处理不正确。这是我当前的功能:

function pgFormatDate(date) {
    /* Via http://stackoverflow.com/questions/3605214/javascript-add-leading-zeroes-to-date */
    function zeroPad(d) {
        return ("0" + d).slice(-2)
    }

    if (date) {
        var parsed = new Date(date)
        return [parsed.getUTCFullYear(), zeroPad(parsed.getMonth() + 1), zeroPad(parsed.getDate())].join("-");
    } else {
        return null;
    }
}

这是我为它创建的临时测试工具(如果函数正在工作,所有"测试"应该记录true

var test1Result = dateConvertsCorrectly("Fri Jul 07 2017 22:10:08 GMT-0500 (CDT)", "2017-07-07"); // Currently working and logging true, but break when I try to fix the others
var test2Result = dateConvertsCorrectly("Fri Jul 07 2017 02:10:08 GMT-0500 (CDT)", "2017-07-07"); // Currently working and logging true, but break when I try to fix the others
var test3Result = dateConvertsCorrectly("2017-07-07", "2017-07-07"); // Currently not working and logging false
var test4Result = dateConvertsCorrectly("Fri Jul 06 2017 22:10:08 GMT-0500 (CDT)", "2017-07-06"); // Currently working and logging true, but break when I try to fix the others
var test5Result = dateConvertsCorrectly("2017-07-06T02:59:12.037Z", "2017-07-06"); // Currently not working and logging false
var test6Result = dateConvertsCorrectly("2017-06-07", "2017-06-07"); // Currently not working and logging false

console.log('test 1 passed:', test1Result);
console.log('test 2 passed:', test2Result);
console.log('test 3 passed:', test3Result);
console.log('test 4 passed:', test4Result);
console.log('test 5 passed:', test5Result);
console.log('test 6 passed:', test6Result);


function pgFormatDate(date) {
    /* Via http://stackoverflow.com/questions/3605214/javascript-add-leading-zeroes-to-date */
    function zeroPad(d) {
        return ("0" + d).slice(-2)
    }

    if (date) {
        var parsed = new Date(date)
        return [parsed.getUTCFullYear(), zeroPad(parsed.getMonth() + 1), zeroPad(parsed.getDate())].join("-");
    } else {
        return null;
    }
}

function dateConvertsCorrectly (input, expectedOutput) {
    return pgFormatDate(input) === expectedOutput;
}

测试3,5和6都在CDT时区失败。但我希望代码能够工作而不管时区(我真的只想保留提交的年,月和日)。使用时刻还没有奏效,因为日期不适合当前允许的接受日期类型,我收到错误,所以我希望能够使用vanilla javascript执行此操作。

这是jsFiddle:https://jsfiddle.net/lukeschlangen/bkyquu7j/

2 个答案:

答案 0 :(得分:2)

不使用片刻,我在vanilla JS中为这个数据集进行了手动正则表达式解析。

它并不完美,如果您开始向其投放格式不同的日期字符串,它可能会窒息,但它适用于此数据集。

Fiddle here

月份解析是一个很难看的开关,如下所示:

switch (true) { 
  case /Jan/i.test(date):
    parse.Month = "01";
    break;
  case /-01-/.test(date):
    date = date.replace(/-01/, '') + ' '; 
    parse.Month = "01";
    break;

但年度和日期解析是合理的正则表达式匹配。

 if (/\d{4}/.test(date)) {
      parse.Year = date.match(/\d{4}/)[0];
      } else {
      console.log("Year parse fail");
      }

 if (/\D\d{2}\D/.test(date)) { 
        parse.Day = date.match(/\D\d{2}\D/)[0].substring(1,3);
      } else {
      console.log("Day parse fail");
      }

诀窍最初是解析月份,然后从字符串中删除月份数据,否则日期正则表达式会首先找到 - 这有趣的是给出与问题中相同的错误集。

答案 1 :(得分:0)

非常感谢Máté Solymosi提供自定义时刻日期格式的建议。我最终使用的是时刻,这就是我的工作:

function pgFormatDate(date) {
    if (date) {
        if (moment(date.substring(4,15), 'MMM DD YYYY').isValid() && date.substring(4,15).length === 11) {
            return moment(date.substring(4,15), 'MMM DD YYYY').format('YYYY-MM-DD');
        } else if (moment(date.substring(0,10), "YYYY-MM-DD").isValid() && date.substring(0,10).length === 10) {
            return date.substring(0,10); 
        } else {
            throw 'Date not formatted correctly';
        }
    } else {
        throw 'Date must exist for formatting to occur'
    }
}