在javascript中,如何从日期字符串“yyyy-mm-dd”或timeStamp中提取月份?

时间:2017-05-26 22:15:10

标签: javascript date datetime

我有一个带有某些记录事件的数据库作为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分钟的总和。

任何帮助将输入解析为适当的变量进行计数都将非常感激!

由于

5 个答案:

答案 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();

然后只对结果实施计数