根据地区返回不同的日期

时间:2019-03-25 17:23:33

标签: javascript date datetime datetime-format

我有一个Javascript函数,该函数返回当前/上一个/下一个季度的日期范围。例如,对于当前季度,它将返回2019-01-012019-03-31。由于某些原因,一些同事说他们的日期范围不正确:对他们来说,它们返回2018-12-312019-02-27。我注意到这两个用户都在德国/波兰地区。

这是我的jsFiddle

function formatDate(date) {
    var d = new Date(date),
        month = '' + (d.getUTCMonth() + 1),
        day = '' + d.getUTCDate(),
        year = d.getUTCFullYear();

    if (month.length < 2) month = '0' + month;
    if (day.length < 2) day = '0' + day;

    return [year, month, day].join('-');
}

function getDate_FQ(range){
    var now = new Date();
    switch(range){
        case 'Previous FQ':
            now.setMonth(now.getMonth()-3);
            break;
        case 'Next FQ':
            now.setMonth(now.getMonth()+3);
            break;
        case 'Current FQ':
            break;
    }
    var quarter = Math.floor((now.getUTCMonth() / 3));
    var firstDate = new Date(now.getUTCFullYear(), quarter * 3, 1);
    var endDate = new Date(firstDate.getUTCFullYear(), firstDate.getUTCMonth() + 3, 0);
    return([firstDate, endDate])
}

let [first, end] = getDate_FQ('Current FQ')
console.log(formatDate(first), formatDate(end))

一个日期过1天,另一个日期过1个月零一天又如何呢?

2 个答案:

答案 0 :(得分:1)

如果您想让Date在每个时区都指向同一时间,请在UTC中工作,并将代码两行更改为:

var firstDate = new Date(Date.UTC(now.getUTCFullYear(), quarter * 3, 1));
var endDate = new Date(Date.UTC(firstDate.getUTCFullYear(), firstDate.getUTCMonth() + 3, 0));

答案 1 :(得分:0)

NaDeR Star posted a solution解决了我的时区问题,但我发现运行10万次时的速度几乎快一倍。

由于季度范围的日期始终相同(1月1日至3月31日,4月1日至6月30日等),并且唯一变化的是年份,因此将年份与日期范围结合起来会更快。

这是我的新解决方案:

function getDate_FQ(range){
    var now = new Date();
    var dateArr = {0: ['-01-01', '-03-31'], 1: ['-04-01', '-06-30'], 2: ['-07-01', '-09-30'], 3: ['-10-01', '-12-31']}
    switch(range){
        case 'Previous FQ':
            now.setUTCMonth(now.getUTCMonth()-3);
            break;
        case 'Next FQ':
            now.setUTCMonth(now.getUTCMonth()+3);
            break;
        case 'Current FQ':
            break;
    }
    var quarter = Math.floor((now.getUTCMonth() / 3));
    var dates = dateArr[quarter]
    var firstDate = (now.getUTCFullYear()) + dates[0];
    var endDate = (now.getUTCFullYear()) + dates[1];
    return([firstDate, endDate])
}