Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 根据地区返回不同的日期_Javascript_Date_Datetime_Datetime Format - Fatal编程技术网

Javascript 根据地区返回不同的日期

Javascript 根据地区返回不同的日期,javascript,date,datetime,datetime-format,Javascript,Date,Datetime,Datetime Format,我有一个Javascript函数,返回当前/上一个/下一个季度的日期范围。例如,对于当前季度,它将返回2019-01-01和2019-03-31。出于某种原因,一些同事说,日期范围对他们来说是不准确的:对于他们来说,它返回2018-12-31和2019-02-27。我注意到这两个用户都在德国/波兰地区 这是我的 函数格式日期(日期){ var d=新日期(日期), 月份=''+(d.getUTCMonth()+1), 日期=''+d.getUTCDate(), year=d.getUTCFull

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

这是我的

函数格式日期(日期){
var d=新日期(日期),
月份=''+(d.getUTCMonth()+1),
日期=''+d.getUTCDate(),
year=d.getUTCFullYear();
如果(月长<2)月='0'+月;
如果(日长<2)天='0'+天;
返回[年、月、日]。加入('-');
}
函数getDate_FQ(范围){
var now=新日期();
开关(范围){
案例“先前FQ”:
now.setMonth(now.getMonth()-3);
打破
案例“下一个FQ”:
now.setMonth(now.getMonth()+3);
打破
案例“当前FQ”:
打破
}
var quarter=Math.floor((now.getUTCMonth()/3));
var firstDate=新日期(现在是.getUTCFullYear(),季度*3,1);
var endDate=新日期(firstDate.getUTCFullYear(),firstDate.getUTCMonth()+3,0);
返回([firstDate,endDate])
}
let[first,end]=getDate\u FQ('当前FQ')
console.log(formattate(第一个)、formattate(最后一个))

如何将一个日期缩短1天,另一个日期缩短1个月和1天?

如果您想让
日期在每个时区中都指相同的时间,请在
UTC
中工作,并将代码分两行更改为:

var firstDate = new Date(Date.UTC(now.getUTCFullYear(), quarter * 3, 1));
var endDate = new Date(Date.UTC(firstDate.getUTCFullYear(), firstDate.getUTCMonth() + 3, 0));
这解决了我的时区问题,但我找到了一种方法,当运行这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])
}

问题是您混合了本地方法和UTC方法。只需专门使用其中一个。
formatDate
可以简化为
new Date(Date).toISOString().split('T')[0]
,如果我没有弄错的话。可能的副本是本地日期和UTC日期的混合,并且由于本地时区的差异,在季度末或季度初的某些日期仍然会得到不正确的结果。例如,对于UTC+10中的某些人,在2018年12月31日23:00时,此函数将上一季度返回为2018-10-10至2018-12-31,这是不正确的。这取决于您想要什么。如果您使用UTC时间,您将获得UTC季度。不是你的本地区。
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])
}