【问题标题】:How to get the total month by given months如何获得给定月份的总月份
【发布时间】:2014-11-25 11:53:34
【问题描述】:

我有一个这样的数组

var array = [ 
           { date:2014-11-11,
             title:test },
           { date:2014-11-12,
             title:test },
           { date:2014-11-13,
             title:test },
           …more
           …more
           { date:2015-01-01
             title:test},
           { date:2015-01-02
             title:test},
           …more
           …more
           { date:2015-03-01
             title:test}
]

我的问题是如何获得每年的总月份。 例如,我需要 2014 年 2 个月(11 月到 12 月)和 2015 年 3 个月(1 月到 3 月)。

var firstYear  = parseInt($filter('date')(array[0].date, 'yyyy'));
var lastYear = parseInt($filter('date')(array[array.length-1].date, 'yyyy'));

我不确定接下来要怎么做才能得到一年中的总月份

谁能帮帮我?谢谢!

【问题讨论】:

  • 你的问题不清楚。你所说的“总月”是什么?数组中每一年的最新日期?如果这是一个范围,为什么不将其表示为一个范围而不是每个日期?只有当月的所有天都存在于数组中时,“总月”才成立吗?

标签: javascript angularjs


【解决方案1】:

您的数组语法不是有效的 javascript。你真的有像这样的日期字符串:

date: '2014-11-11',

或者该值是代表该日期的 Date 对象吗?日期是本地日期还是 UTC?无论如何,我假设你有字符串,不管它们是 UTC 还是本地都无关紧要。

我的问题是如何获得每年的总月份。例如,我需要 2014 年 2 个月(11 月到 12 月)和 2015 年 3 个月(1 月到 3 月)。

我不确定您想要什么,您应该提供一个预期输出的示例。以下返回特定年份的月份范围,没有将字符串转换为日期:

// Sample data
var array = [ 
       { date:'2014-11-11',
         title:'test'},
       { date:'2014-11-12',
         title:'test'},
       { date:'2014-11-13',
         title:'test'},
       { date:'2015-01-01',
         title:'test'},
       { date:'2015-01-02',
         title:'test'},
       { date:'2015-03-01',
         title:'test'}
];

以及功能:

function getMonthCount2(arr) {
  var yearsMonths = arr.map(function(v){return v.date.substr(0,7).split(/\D/)}).sort();
  var monthRanges = {}
  yearsMonths.forEach(function(v,i) {
    if (monthRanges[v[0]]) {
      monthRanges[v[0]] += v[1] - yearsMonths[--i][1];
    } else {
      monthRanges[v[0]] = 1;
    }
  });
  return monthRanges;
}

console.log(getMonthCount2(array)); // {'2014': 2, '2015': 3}

以上假设输入有效,您可能需要进行验证步骤以确保数据在传递给函数之前是干净的。

【讨论】:

    【解决方案2】:

    如果您正在处理日期和时间,您可能应该考虑使用库,因为工作日期和时间存在许多细微差别。

    我刚刚做了类似的事情,并使用moment jsdate range extension 解决了它。

    查看 moment-range 的文档,您似乎可以执行以下操作:

    var start = new Date(2012, 2, 1);
    var end   = new Date(2012, 7, 5);
    var range1 = moment().range(start, end);
    
    range1.by('months', function(moment) {
      // Do something with `moment`
    });
    

    【讨论】:

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