Javascript,如何在mysql时间戳样式中找到两个日期时间之间的区别

时间:2011-11-04 00:22:47

标签: javascript datetime timestamp

假设我有

a = "2011-11-09 08:00:00"
b = "2011-11-10 08:30:00"

在Javascript中找出这两个时间戳之间差异的天数,小时数和分钟数的最佳方法是什么?

所以输出应该是“1天”(忽略分钟,因为差异中有更大的单位(天))?

3 个答案:

答案 0 :(得分:2)

将字符串转换为javascript中日期的唯一可靠方法是手动解析它。如果格式与您发布的内容一致,则可以将其转换为日期,如下所示:

function stringToDate(s) {
  var dateParts = s.split(' ')[0].split('-'); 
  var timeParts = s.split(' ')[1].split(':');
  var d = new Date(dateParts[0], --dateParts[1], dateParts[2]);
  d.setHours(timeParts[0], timeParts[1], timeParts[2])

  return d
}

所以你可以这样做:

var a = "2011-11-09 08:00:00"
var b = "2011-11-10 08:30:00"
alert(stringToDate(a) - stringToDate(b));

以毫秒为单位获得差异。但是,两个日期之间的天数差异可能不是将差异除以8.64e7(一个da中的毫秒)的简单问题。您需要确认与此相关的业务逻辑。

答案 1 :(得分:1)

已编辑以在任何浏览器中使用

var matchDate = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
var firstDateParsed = matchDate.exec("2011-11-09 08:00:00");
var secondDateParsed = matchDate.exec("2011-11-10 08:30:00");

var a = new Date(firstDateParsed[1], firstDateParsed[2], firstDateParsed[3], firstDateParsed[4], firstDateParsed[5], firstDateParsed[6], 0);
var b = new Date(secondDateParsed[1], secondDateParsed[2], secondDateParsed[3], secondDateParsed[4], secondDateParsed[5], secondDateParsed[6], 0);
var differenceInMilliseconds = a.getTime() - b.getTime();

// minutes
alert(differenceInMilliseconds / 1000 / 60);

// hours
alert(differenceInMilliseconds / 1000 / 60 / 60);

// days
alert(differenceInMilliseconds / 1000 / 60 / 60 / 24);

在IE和Firefox以及Chrome中进行了测试:http://jsfiddle.net/xkBTS/4/

答案 2 :(得分:0)

您必须自己将时间戳解析为日期:

function parseMySQLTimestamp(timestamp) {
    var parts = timestamp.match(/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/);
    return new Date(+parts[1], (+parts[2] - 1), +parts[3], +parts[4], +parts[5], +parts[6]);
}

通过从另一个日期中减去一个日期来获得以毫秒为单位的差异:

var msDifference = parseMySQLTimestamp(b) - parseMySQLTimestamp(a);

简单算术可以让你将毫秒转换为秒,分钟或其他任何内容。

顺便说一下,如果传入的时间戳与表达式不匹配,则此函数将抛出错误。从软件设计的角度来看,这种行为对我来说很有意义。但是,如果您希望能够将该函数用于可能格式不正确的字符串,则可以对parts执行空检查,如果没有匹配则返回null。