我有一个带有某些记录事件的数据库作为json对象,每个对象都有自己的JS毫秒时间戳,还有一个格式为“yyyy-mm-dd”的日期字符串,以及一个分钟条目。
我想使用时间戳或日期字符串(以较简单的方式)作为算法的输入,该算法将计算在给定月份中输入的日志数量。
我还希望算法将给定月份内记录的累计分钟数相加。
例如,
log1: {
Date:"2017-05-24",
TimeStamp:1495612800,
Minutes: 15},
log2: {
Date:"2017-05-19",
TimeStamp:1495180800,
Minutes: 45},
log3: {
Date:"2017-04-24",
TimeStamp:1493020800,
Minutes:30}
在此示例中,算法将计算5月份有两个日志,4月份有一个日志。
该算法还将在5月份和4月份的30分钟内返回60分钟的总和。
任何帮助将输入解析为适当的变量进行计数都将非常感激!
由于
答案 0 :(得分:2)
JavaScript getMonth()方法
getMonth()方法根据当地时间返回指定日期的月份(从0到11)。
注意:1月是0,2月是1,依此类推。
使用函数(注意:你需要将UNIX时间戳转换为毫秒,所以在getMon函数中只需要时间1000):
UNIX时间戳以秒为单位
function getMon(timestamp) {
return (new Date(timestamp * 1000)).getMonth() + 1;
}
var log1 = {Date: "2017-05-24",TimeStamp: 1495612800};
var log2 = {Date: "2017-05-19",TimeStamp: 1495180800};
var log3 = {Date: "2017-04-24",TimeStamp: 1493020800};
function getMon(timestamp) {
return (new Date(timestamp * 1000)).getMonth() + 1;
}
console.log(getMon(log1['TimeStamp']));
console.log(getMon(log2['TimeStamp']));
console.log(getMon(log3['TimeStamp']));
答案 1 :(得分:2)
要从单个对象获取月份,它将如下所示:
var month = new Date(log1.TimeStamp * 1000).getMonth() +1
getMonth()从零开始,因此您需要添加1
要计算每月发生的次数,您可以执行以下操作:
var logs = [{
Date: "2017-05-24",
TimeStamp: 1495612800,
Minutes: 15
},
{
Date: "2017-05-19",
TimeStamp: 1495180800,
Minutes: 45
},
{
Date: "2017-04-24",
TimeStamp: 1493020800,
Minutes: 30
}
];
var occurrences = logs.reduce(function (result, current) {
// multiply unix timestamp by 1000 to get ms
var date = new Date(current.TimeStamp * 1000);
var month = date.getMonth() + 1;
if (!result[month]) {
result[month] = {
occurrences: 0,
minutes: 0
};
}
result[month].occurrences++;
result[month].minutes += Number(current.Minutes);
return result;
}, {});
console.log(occurrences);
如果您想按年份和按月对日期进行分组,则只需稍微更改代码即可。它看起来如下:
var logs = [{
Date: "2017-05-24",
TimeStamp: 1495612800,
Minutes: 15
},
{
Date: "2017-05-19",
TimeStamp: 1495180800,
Minutes: 45
},
{
Date: "2017-04-24",
TimeStamp: 1493020800,
Minutes: 30
}
];
var occurrences = logs.reduce(function(result, current) {
// multiply unix timestamp by 1000 to get ms
var date = new Date(current.TimeStamp * 1000);
var year = date.getFullYear();
var month = date.getMonth() + 1;
// make sure result[year] is defined
if (!result[year]) {
result[year] = {};
}
// notice the original code below is now [year][month]
if (!result[year][month]) {
result[year][month] = {
occurrences: 0,
minutes: 0
};
}
result[year][month].occurrences++;
result[year][month].minutes += Number(current.Minutes);
return result;
}, {});
console.log(occurrences);
答案 2 :(得分:1)
使用Date(miliseconds)
构造函数将是最强大的方法,以防日期格式发生变化。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
new Date(value);
value 整数值,表示自1970年1月1日00:00:00 UTC以来的毫秒数,忽略闰秒(Unix Epoch;但请考虑大多数Unix时间戳功能以秒为单位)。
var log1 = { Date: "2017-05-24", TimeStamp: 1495612800 };
var log1Date = new Date( log1.TimeStamp * 1000 );
log1Date.toLocaleString(); // "5/24/2017"
*1000
是因为提供的TimeStamp
值看起来只有几秒钟,但JavaScript需要 mili 第二个值。
答案 3 :(得分:1)
鉴于月份号已在 Date 属性中可用,因此无需使用Date对象:
var logs = [
{Date: "2017-05-24", TimeStamp: 1495612800, Minutes: 15},
{Date: "2017-05-19", TimeStamp: 1495180800, Minutes: 45},
{ Date: "2017-04-24", TimeStamp: 1493020800, Minutes: 30}
];
var logMonthCount = logs.reduce(function(acc, log) {
var month = log.Date.split('-')[1];
acc[month] = acc[month]? acc[month]+1 : 1;
return acc;
}, Object.create(null));
console.log(logMonthCount);

如果使用 TimeStamp 属性,它将被视为UTC并根据客户端时区转换为本地日期。因此,对于主机从月初或月末的时区偏移量内的某些日志,可能是 Date 属性中的月份与{{1]返回的月份不同。 }}
答案 4 :(得分:0)
使用时间戳,这应该有效:
var date = new Date(1495612800 * 1000);
var month = date.getMonth();
然后只对结果实施计数