根据地区返回不同的日期
Different dates being returned depending on region
我在 Javascript 中有一个函数 return 是 current/previous/next 季度的日期范围。例如,对于当前季度,它将 return 2019-01-01
和 2019-03-31
。出于某种原因,一些同事表示日期范围对他们来说不准确:对他们来说 returns 2018-12-31
和 2019-02-27
。我注意到这两个用户都在 Germany/Poland 地区。
这是我的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个月零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));
解决了我的时区问题,但我发现一种方法在 运行 这 100K 次时快了将近两倍。
由于季度范围的日期始终相同(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])
}
我在 Javascript 中有一个函数 return 是 current/previous/next 季度的日期范围。例如,对于当前季度,它将 return 2019-01-01
和 2019-03-31
。出于某种原因,一些同事表示日期范围对他们来说不准确:对他们来说 returns 2018-12-31
和 2019-02-27
。我注意到这两个用户都在 Germany/Poland 地区。
这是我的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个月零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 月 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])
}