【问题标题】:Get dates for last quarter and this quarter through Javascript通过 Javascript 获取上一季度和本季度的日期
【发布时间】:2012-03-23 14:02:13
【问题描述】:

我正在尝试创建一个需要通过 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;
}

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

【问题讨论】:

  • 你用什么库来做 Date 的原型,比如 moveToLastDayOfMonth()?是您的自定义代码吗?
  • 在我写这篇文章的时候,我正在使用dateJS,然而,我已经切换到Moment.js。 DateJS 已经有一段时间没有维护了。 MomentJS 得到维护,并且与一些附加功能相同。
  • 希望对您有所帮助。 stackoverflow.com/a/20989200/2837412

标签: javascript html


【解决方案1】:

如果您使用 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 应该相当容易。

【讨论】:

  • 很棒的 sn-p,但我注意到要获得季度的第一天,需要稍作修改 - 将 startOf('month') 更改为 endOf('month') 并添加了一天: var lastQuarterStartDate = lastQuarterEnd.clone().subtract(3, 'months').endOf('month').add(1,'days')
  • 啊,不错。我想你也可以这样做: var lastQuarterStartDate = lastQuarterEndDate.clone().subtract({ months: 2 }).startOf('month');
  • 简单的const endOfLasQuarter = moment().date(1).subtract(1, 'quarter').endOf('quarter')怎么样
【解决方案2】:

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

const quarter = Math.floor((today.getMonth() / 3));
const today = new Date();

接下来,当前季度

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);

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

【讨论】:

    【解决方案3】:

    使用 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');
    

    【讨论】:

    • 上一季度的结束日期不应该是:End date of last quarter = moment().subtract(lastQuarterNumber, 'quarter').endOf('quarter');
    • 有没有办法获得季度至今 (QTD)?
    【解决方案4】:

    关于第一次功能变化

    var quarterMonth = (Math.floor(month/3)*3)+1;
    

    var quarterMonth = (Math.floor((month-1)/3)*3)+1;
    

    关于第二个功能

    var quarter = (Math.floor(month/3))+1;
    

    var quarter = (Math.floor((month-1)/3))+1;
    

    我认为会没事的。

    而在第二个功能上我看不到

    ((((lastQuarter-1)*3)+1) < 10)
    

    一个简单的

    (lastQuarter < 4)
    

    会做同样的工作

    【讨论】:

      【解决方案5】:

      使用 moment.js

      • 本季度开始:moment().startOf('quarter')
      • 本季度结束: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')

      【讨论】:

        【解决方案6】:

        我已经使用 date-fns 库有一段时间了。它公开的方法对于解决此类问题非常有用。

        您可以使用addQuartersubQuarter 方法。

        代码看起来像:

            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))
        

        参考:https://date-fns.org/v2.21.2/docs/addQuarters

        【讨论】:

          【解决方案7】:

          使用这个简单的代码获取基于 1 月和 4 月的所有季度

          Demo

          代码:

           // 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');
          

          Fiddle

          【讨论】:

            【解决方案8】:

            使用它,我们可以动态地获取季度的开始和结束日期,而与财政年度(季度)的开始无关。

            var fYearStart=new Date('2021-1-29') //Pass your financial year's start date
            var q1Start=new Date(fYearStart.getFullYear(),fYearStart.getMonth(),1)
            var dummy1=new Date(fYearStart.getFullYear(),fYearStart.getMonth(),1)
            var dummy5=new Date(fYearStart.getFullYear(),fYearStart.getMonth(),1)
            var q1End=new Date(dummy1.setMonth(dummy1.getMonth()+3))
            var q1FinalEnd=new Date(dummy5.setMonth(dummy5.getMonth()+3))
            q1FinalEnd.setSeconds(q1End.getSeconds()-1)
            console.log(q1Start.toLocaleString())
            console.log(q1FinalEnd.toLocaleString())
            var q2Start=new Date(q1End.getFullYear(),q1End.getMonth(),1)
            var dummy2=new Date(q1End.getFullYear(),q1End.getMonth(),1)
            var dummy6=new Date(q1End.getFullYear(),q1End.getMonth(),1)
            var q2End=new Date(dummy2.setMonth(dummy2.getMonth()+3))
            var q2FinalEnd=new Date(dummy6.setMonth(dummy6.getMonth()+3))
            q2FinalEnd.setSeconds(q2End.getSeconds()-1)
            console.log(q2Start.toLocaleString())
            console.log(q2FinalEnd.toLocaleString())
            var q3Start=new Date(q2End.getFullYear(),q2End.getMonth(),1)
            var dummy3=new Date(q2End.getFullYear(),q2End.getMonth(),1)
            var dummy7=new Date(q2End.getFullYear(),q2End.getMonth(),1)
            var q3End=new Date(dummy3.setMonth(dummy3.getMonth()+3))
            var q3FinalEnd=new Date(dummy7.setMonth(dummy7.getMonth()+3))
            q3FinalEnd.setSeconds(q3End.getSeconds()-1)
            console.log(q3Start.toLocaleString())
            console.log(q3FinalEnd.toLocaleString())
            var q4Start=new Date(q3End.getFullYear(),q3End.getMonth(),1)
            var dummy4=new Date(q3End.getFullYear(),q3End.getMonth(),1)
            var dummy8=new Date(q3End.getFullYear(),q3End.getMonth(),1)
            var q4End=new Date(dummy4.setMonth(dummy4.getMonth()+3))
            var q4FinalEnd=new Date(dummy8.setMonth(dummy8.getMonth()+3))
            q4FinalEnd.setSeconds(q4End.getSeconds()-1)
            console.log(q4Start.toLocaleString())
            console.log(q4FinalEnd.toLocaleString())

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多