【问题标题】:Grouping milliseconds data into group of dates将毫秒数据分组为一组日期
【发布时间】:2017-03-12 15:28:00
【问题描述】:

我有一个类似的东西

{
    1489330777089: 100, // 12 March
    1489330824346: 45,  // 12 March
    1489330877089: 90,  // 13 March
    1489330824346: 120, // 13 March
    .....
}

键来自Date.now(),因为它们被创建,值是一个整数。

我想将这些数据绘制成图表,例如以日期为 x 轴的条形图。

如何使用 Javascript 将这些数据分组为日期,并将整数值汇总在一起。预期结果是:

{
    12 March 2017: 145 // 100 + 45
    13 March 2017: 210 // 90 + 120
    ...
} 

(如果需要注意的话,我在 React 应用程序中使用它。另外,使用 Firebase 存储数据)

谢谢!

【问题讨论】:

  • 您可以通过var date = new Date(milliseconds); 获得Date。使用date.toString(),您将获得一个可读的日期字符串。只需将其放入一个循环中即可完成。
  • @SchokokuchenBäcker 抱歉,我更新了问题以使其更清晰。我不仅想将毫秒转换为日期,我还想将具有相同日期的那些分组为一个。整数值也被求和
  • 请注意,由于时区的影响,这些时间值可能代表不同时区的不同日期。对我来说,所有 4 个时间值都是 3 月 13 日。您想在特定时区比较它们吗?这与get date string from utc unixtime and add a timezone offset 非常相似。
  • 您的对象字面量无效,有两个“1489330824346”属性,因此值 45 被 90 覆盖。
  • @RobG 是的,我上面的示例数据实际上并不是对应于这些日期的真正毫秒。我只是想更好地说明我的问题。抱歉,如果这具有误导性

标签: javascript date


【解决方案1】:

您可以使用 ISO 日期进行分组。也许您需要在正确的当地时间使用 ofsett。

var data = { 1489330777089: 100, 1489330824346: 45, 1489330877089: 90, 1489330824346: 120 },
    grouped = {};

Object.keys(data).forEach(function (k) {
    var date = (new Date(+k +1000*60*60*24)).toISOString().slice(0, 10);
    grouped[date] = grouped[date] || 0;
    grouped[date] += data[k];
});

console.log(grouped);

【讨论】:

  • 对我来说输出是{"2017-03-13": 310}。也许应该考虑时区?这个值应该是 355,所以其他的东西也会出错。
  • 是的,但是是哪一个? ;-)
  • 我不知道。这取决于 op 的本地时区。
  • 谢谢!与@smnbbrv 提供的答案相比,使用这个有什么优势吗?
【解决方案2】:

这会遍历这些值,将它们截断到一天,并使用分组值的总和进行输出

let source = {
    1489330777089: 100,
    1489330824346: 45, 
    1489330877089: 90, 
    1489330824346: 120,
}

let grouped = Object.keys(source).reduce((output, key) => {
  let date = new Date(Number(key)),
      groupedDate = new Date(date.getFullYear(), date.getMonth(), date.getDay());

  if (typeof output[groupedDate] === 'undefined') output[groupedDate] = 0;

  output[groupedDate] += source[key];

  return output;
}, {});

您可能想要更改输出属性字符串/运算符/截断单元,但这应该很容易通过上面代码中的小改动。

【讨论】:

  • 谢谢!这很棒。与 Nina Scholz 在这里提供的方法相比,使用您的方法有什么优势?
  • 这不允许时区。所有这些时间值都在同一日期,所以对我来说,结果是{ Wed Mar 01 2017 00:00:00 GMT+1000: 310 }
  • @RobG 我暂时不用担心时区。另外,我上面的示例数据实际上并不是对应于这些日期的真正毫秒。但你是对的。我也想知道性能比较:)
  • @GaddafiRusli — 但您必须担心时区,因为这将决定这些值所代表的日期。在 UTC 中查看,它们都在 3 月 12 日。在我的时区,它们都是 3 月 13 日。因此,根据执行代码的主机的时区设置,您将获得不同的结果。如果解决方案没有给出正确的结果,性能就无关紧要了。并且对全局变量使用 let 也没有多大意义,它极大地限制了兼容性而没有任何好处。
【解决方案3】:

你可以这样做

var date_obj={
    1489330777089: 100, // 12 March
    1489330824346: 45,  // 12 March
    1489330877089: 90
 }
 var tempData = {};
for ( var index in date_obj ) {
  if ( date_obj[index] != "undefined" ) { 
      var milisec=  parseInt(index);
      var get_data= new Date(milisec);
var str_date=get_data.toString();
  var date_str=  str_date.substr(0,15);
  if(typeof(tempData[date_str])=== "undefined"){
    tempData[date_str] = parseInt(date_obj[index]); 
  }else{
      tempData[date_str] = tempData[date_str]+parseInt(date_obj[index]); 
  }
  } 
 }
data = tempData;
console.log(data);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多