我想从传递给我的函数的不同格式的字符串中获取日期(没有时区或时间)。我遇到的问题是由于我所处的时区,日期处理不正确。这是我当前的功能:
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/
答案 0 :(得分:2)
不使用片刻,我在vanilla JS中为这个数据集进行了手动正则表达式解析。
它并不完美,如果您开始向其投放格式不同的日期字符串,它可能会窒息,但它适用于此数据集。
月份解析是一个很难看的开关,如下所示:
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'
}
}