通过Javascript获取上一季度和本季度的日期
我正在尝试创建一个报告,该报告需要通过Javascript获取上一季度和本季度的日期。该代码上个月起作用,但在三月份就不起作用了。它显示上一季度为本季度,本季度为下一季度。我在这个项目中使用datejs。以下是我正在使用的代码:通过Javascript获取上一季度和本季度的日期,javascript,html,Javascript,Html,我正在尝试创建一个报告,该报告需要通过Javascript获取上一季度和本季度的日期。该代码上个月起作用,但在三月份就不起作用了。它显示上一季度为本季度,本季度为下一季度。我在这个项目中使用datejs。以下是我正在使用的代码: function thisQuarterDates(from, to) { var month = Date.parse('today').toString('MM'); var quarterMonth = (Math.floor(month/3)*3
function thisQuarterDates(from, to) {
var month = Date.parse('today').toString('MM');
var quarterMonth = (Math.floor(month/3)*3)+1;
var year = Date.parse('today').toString('yyyy');
var quarterStartDate = (quarterMonth < 10) ? quarterMonth+'/1/' +year : quarterMonth+'/1/'+ year;
var quarterEndDate = Date.parse(quarterStartDate).add(2).months().moveToLastDayOfMonth().toString('M/d/yyyy');
var today = Date.parse('today').toString('M/d/yyyy');
document.getElementById(from).value = quarterStartDate;
document.getElementById(to).value = quarterEndDate;
}
function lastQuarterDates(from, to) {
var month = Date.parse('today').toString('MM');
var quarter = (Math.floor(month/3))+1;
var lastQuarter = (quarter > 1) ? quarter - 1 : lastQuarter = 4;
var year;
if (((((lastQuarter-1)*3)+1) < 10))
{
year = Date.parse('today').toString('yyyy');
}
else
{
year = Date.parse('today').add(-1).years().toString('yyyy');
}
var firstDate = ((((lastQuarter-1)*3)+1) < 10) ? (((lastQuarter-1)*3)+1) +'/1/'+ year : (((lastQuarter-1)*3)+1) +'/1/'+ year;
var lastDate = Date.parse(firstDate).add(2).months().moveToLastDayOfMonth().toString('M/d/yyyy');
document.getElementById(from).value = firstDate;
document.getElementById(to).value = lastDate;
}
函数thisQuarterDates(从,到){
var month=Date.parse('today').toString('MM');
var quarterMonth=(数学下限(月/3)*3)+1;
var year=Date.parse('today').toString('yyyy');
var quarterStartDate=(quarterMonth<10)?quarterMonth+/1/'+年:quarterMonth+/1/'+年;
var quarterEndDate=Date.parse(quarterStartDate).add(2.months().moveToLastDayOfMonth().toString('M/d/yyyyy');
var today=Date.parse('today').toString('M/d/yyyy');
document.getElementById(from).value=quarterStartDate;
document.getElementById(to).value=quarterEndDate;
}
函数lastQuarterDates(从,到){
var month=Date.parse('today').toString('MM');
var季度=(数学下限(月/3))+1;
var lastQuarter=(季度>1)?季度-1:lastQuarter=4;
var年;
如果(
{
year=Date.parse('today').toString('yyyy');
}
其他的
{
year=Date.parse('today').add(-1.years().toString('yyyy');
}
var firstDate=(((上季度-1)*3)+1)<10?((上季度-1)*3)+1)+'/1/'+年:((上季度-1)*3)+1)+'/1/'+年;
var lastDate=Date.parse(firstDate).add(2.months().moveToLastDayOfMonth().toString('M/d/yyyy');
document.getElementById(from).value=firstDate;
document.getElementById(to).value=lastDate;
}
有人知道为什么不正确或者有更简单的方法吗 在第一次功能更改时
var quarterMonth = (Math.floor(month/3)*3)+1;
与
关于第二个函数
var quarter = (Math.floor(month/3))+1;
与
我想一切都会好起来的
关于第二个函数,我看不出
((((lastQuarter-1)*3)+1) < 10)
(((上季度-1)*3)+1)<10)
简单的
(lastQuarter < 4)
(上季度<4)
如果您使用的是moment.js,则将执行相同的任务。这可能更容易:
var quarterAdjustment= (moment().month() % 3) + 1;
var lastQuarterEndDate = moment().subtract({ months: quarterAdjustment }).endOf('month');
var lastQuarterStartDate = lastQuarterEndDate.clone().subtract({ months: 3 }).startOf('month');
转换到date.js应该相当容易。使用这个简单的代码可以获得基于1月和4月的所有季度 代码:
// startMonth should be january or april
function setQuarter(startMonth) {
var obj = {};
if(startMonth=='january'){
obj.quarter1 = {start:moment().month(0).startOf('month'),end:moment().month(2).endOf('month')}
obj.quarter2 = {start:moment().month(3).startOf('month'),end:moment().month(5).endOf('month')}
obj.quarter3 = {start:moment().month(6).startOf('month'),end:moment().month(8).endOf('month')}
obj.quarter4 = {start:moment().month(9).startOf('month'),end:moment().month(11).endOf('month')}
console.log(obj);
return obj;
}
else if(startMonth=='april'){
obj.quarter1 = {start:moment().month(3).startOf('month'),end:moment().month(5).endOf('month')}
obj.quarter2 = {start:moment().month(6).startOf('month'),end:moment().month(8).endOf('month')}
obj.quarter3 = {start:moment().month(9).startOf('month'),end:moment().month(11).endOf('month')}
obj.quarter4 = {start:moment().month(0).startOf('month').add('years',1),end:moment().month(2).endOf('month').add('years',1)}
console.log(obj);
return obj;
}
}
setQuarter('april');
使用moment.js库很容易获得特定季度的开始和结束日期,如下所示:
Start date of last quarter = moment().subtract(lastQuarterNumber, 'quarter').startOf('quarter');
End date of last quarter = moment().subtract(lastQuarterNumber, 'quarter').endOf('quarter');
Start date of current quarter = moment().startOf('quarter');
End date of current quarter = moment().endOf('quarter');
纯JS中的简单通用解决方案
第一次计算季度数: 接下来,本季度:
const startFullQuarter = new Date(today.getFullYear(), quarter * 3, 1);
const endFullQuarter = new Date(startFullQuarter.getFullYear(), startFullQuarter.getMonth() + 3, 0);
上一季度
const startFullQuarter = new Date(today.getFullYear(), quarter * 3 - 3, 1);
const endFullQuarter = new Date(startFullQuarter.getFullYear(), startFullQuarter.getMonth() + 3, 0);
在表达式
新日期(today.getFullYear(),quarter*3-x,1)中,每季度添加或减去3个
,以获取未来或过去的季度。使用矩.js:
const startFullQuarter = new Date(today.getFullYear(), quarter * 3, 1);
const endFullQuarter = new Date(startFullQuarter.getFullYear(), startFullQuarter.getMonth() + 3, 0);
- 本季度开始:
moment().startOf(“季度”)
- 本季度末:
moment().endOf('quarter')
- 上一季度开始:
moment().subtract(1,'quarter').startOf('quarter')
- 上一季度末:
moment().subtract(1,'quarter').endOf('quarter')
- 下一季度开始:
moment().add(1,'quarter').startOf('quarter')
- 下一季度末:
moment().add(1,'quarter').endOf('quarter')
使用此功能,我们可以动态获取季度的开始日期和结束日期,而不考虑财政年度(季度)的开始日期。
var fYearStart=new Date('2021-1-29')//传递您的财政年度开始日期
变量q1Start=新日期(fYearStart.getFullYear(),fYearStart.getMonth(),1)
var dummy1=新日期(fYearStart.getFullYear(),fYearStart.getMonth(),1)
var dummy5=新日期(fYearStart.getFullYear(),fYearStart.getMonth(),1)
var q1End=新日期(dummy1.setMonth(dummy1.getMonth()+3))
var q1FinalEnd=新日期(dummy5.setMonth(dummy5.getMonth()+3))
q1FinalEnd.setSeconds(q1End.getSeconds()-1)
console.log(q1Start.toLocaleString())
console.log(q1FinalEnd.toLocaleString())
var q2Start=新日期(q1End.getFullYear(),q1End.getMonth(),1)
var dummy2=新日期(q1End.getFullYear(),q1End.getMonth(),1)
var dummy6=新日期(q1End.getFullYear(),q1End.getMonth(),1)
var q2End=新日期(dummy2.setMonth(dummy2.getMonth()+3))
var q2FinalEnd=新日期(dummy6.setMonth(dummy6.getMonth()+3))
q2FinalEnd.setSeconds(q2End.getSeconds()-1)
console.log(q2Start.toLocaleString())
console.log(q2FinalEnd.toLocaleString())
var q3Start=新日期(q2End.getFullYear(),q2End.getMonth(),1)
var dummy3=新日期(q2End.getFullYear(),q2End.getMonth(),1)
var dummy7=新日期(q2End.getFullYear(),q2End.getMonth(),1)
var q3End=新日期(dummy3.setMonth(dummy3.getMonth()+3))
var q3FinalEnd=新日期(dummy7.setMonth(dummy7.getMonth()+3))
q3FinalEnd.setSeconds(q3End.getSeconds()-1)
console.log(q3Start.toLocaleString())
console.log(q3FinalEnd.toLocaleString())
var q4Start=新日期(q3End.getFullYear(),q3End.getMonth(),1)
var dummy4=新日期(q3End.getFullYear(),q3End.getMonth(),1)
var dummy8=新日期(q3End.getFullYear(),q3End.getMonth(),1)
var q4End=新日期(dummy4.setMonth(dummy4.getMonth()+3))
var q4FinalEnd=新日期(dummy8.setMonth(dummy8.getMonth()+3))
q4FinalEnd.setSeconds(q4End.getSeconds()-1)
console.log(q4Start.toLocaleString())
console.log(q4FinalEnd.tolocalString())
我使用日期fns库已经有一段时间了。它所揭示的方法对于解决此类问题非常有用
您可以使用addQuarter
和subQuarter
方法
代码看起来像:
const lastQuarterStartDate = startOfQuarter(subQuarters(new Date(2014, 8, 1),1))
const lastQuarterEndDate = lastDayOfQuarter(subQuarters(new Date(2014, 8, 1),1))
const thisQuarterStartDate = startOfQuarter(new Date(2014, 8, 1))
const thisQuarterEndDate = lastDayOfQuarter(new Date(2014, 8, 1))
参考资料:对于日期原型,例如moveToLastDayOfMonth(),您使用什么库?这是你的自定义代码吗?在我写这篇文章的时候,我正在使用,但是,我已经切换到了。DateJS已经有一段时间没有维护了。MomentJS是维护的,它的工作原理与其他一些功能相同。这可能会对你有所帮助。非常棒的片段,但我注意到,为了获得季度的第一天,有一个小小的修改是nee
const startFullQuarter = new Date(today.getFullYear(), quarter * 3 - 3, 1);
const endFullQuarter = new Date(startFullQuarter.getFullYear(), startFullQuarter.getMonth() + 3, 0);
const lastQuarterStartDate = startOfQuarter(subQuarters(new Date(2014, 8, 1),1))
const lastQuarterEndDate = lastDayOfQuarter(subQuarters(new Date(2014, 8, 1),1))
const thisQuarterStartDate = startOfQuarter(new Date(2014, 8, 1))
const thisQuarterEndDate = lastDayOfQuarter(new Date(2014, 8, 1))