通过Javascript获取上个季度和本季度的日期

Kei*_*ith 4 html javascript

我正在尝试创建一个报告,需要通过Javascript获取上一季度和本季度的日期.该代码上个月有效,但在三月它不起作用.它显示了本季度的最后一个季度,本季度显示为下个季度.我在这个项目中使用datejs.这是我正在使用的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么它不正确或有更简单的方法吗?

小智 10

如果你正在使用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');
Run Code Online (Sandbox Code Playgroud)

转换为date.js应该相当容易.


Wal*_*zyk 6

纯 JS 中的简单通用解决方案。
首先计算季度数

const quarter = Math.floor((today.getMonth() / 3));
const today = new Date();
Run Code Online (Sandbox Code Playgroud)

接下来,当前季度

const startFullQuarter = new Date(today.getFullYear(), quarter * 3, 1);
const endFullQuarter = new Date(startFullQuarter.getFullYear(), startFullQuarter.getMonth() + 3, 0);
Run Code Online (Sandbox Code Playgroud)

上一季度

const startFullQuarter = new Date(today.getFullYear(), quarter * 3 - 3, 1);
const endFullQuarter = new Date(startFullQuarter.getFullYear(), startFullQuarter.getMonth() + 3, 0);
Run Code Online (Sandbox Code Playgroud)

3's在表达式中每季度加或减new Date(today.getFullYear(), quarter * 3 - x, 1)以获得未来或过去的季度。

  • @dewey 在以下计算中需要计算季度数,它不是像 Q1 等那样的直接季度数。如果您在 `startFullQuarter` 计算中使用 `quarter` 变量,它会产生 `Fri Apr 01 2022 00:00:00` 这是正确的结果。 (2认同)

pat*_*ter 5

在第一次功能更改时

var quarterMonth = (Math.floor(month/3)*3)+1;
Run Code Online (Sandbox Code Playgroud)

var quarterMonth = (Math.floor((month-1)/3)*3)+1;
Run Code Online (Sandbox Code Playgroud)

以及第二个函数

var quarter = (Math.floor(month/3))+1;
Run Code Online (Sandbox Code Playgroud)

var quarter = (Math.floor((month-1)/3))+1;
Run Code Online (Sandbox Code Playgroud)

我想一切都会好起来的。

在第二个功能上我不明白有什么意义

((((lastQuarter-1)*3)+1) < 10)
Run Code Online (Sandbox Code Playgroud)

一个简单的

(lastQuarter < 4)
Run Code Online (Sandbox Code Playgroud)

会做同样的工作


小智 5

使用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');
Run Code Online (Sandbox Code Playgroud)