关于将日期转换为纪元时间的毫秒,减去这些,并将结果从毫秒转换回您所需的单位,所有答案通常都是正确的(尽管其他地方提供的具体实现目前并不能准确地为您提供要求 - 即两个日期时间之间的分钟数和秒数)。
不过,请注意...
新日期('2012-10-07 12:42:13')
...这不是从 SQLite 日期字符串构造日期的可靠方法。
当您将字符串输入到 Date 对象的构造函数中时,您实际上是在调用 Date.parse()。这在不同的浏览器上表现不同。
看看这个:
> new Date('1-1-2012');
Sun Jan 01 2012 00:00:00 GMT-0800 (PST)
> new Date('01-01-2012');
Sun Jan 01 2012 00:00:00 GMT-0800 (PST)
> new Date('2012-1-1');
Sun Jan 01 2012 00:00:00 GMT-0800 (PST)
看起来不错,对吧?但那是在 Chrome 上。
现在看看最新版本的 Firefox 中发生了什么,调用完全相同:
> new Date('1-1-2012');
Date {Invalid Date}
> new Date('01-01-2012');
Date {Invalid Date}
> new Date('2012-1-1');
Date {Invalid Date}
> new Date('2012-01-01');
Date {Sat Dec 31 2011 16:00:00 GMT-0800 (PST)}
此外,看看这两种浏览器的行为:
> new Date('2012-01-01');
Sat Dec 31 2011 16:00:00 GMT-0800 (PST)
简单地将零添加到月份和日期数字会导致时间扭曲!你必须设置时间和时区(对我来说,PST)才能让它消失:
> new Date('2012-01-01T00:00:00-08:00')
Sun Jan 01 2012 00:00:00 GMT-0800 (PST)
基本上,处理日期字符串解析是一件令人头疼的事情。您不需要消化和考虑 this、this 和 this 等规范。
所以,这是一个更好的选择——将日期时间的各个部分作为单独的参数传递给 Date 对象的构造函数。这将为您可靠地创建日期,因此您的后续比较是有效的。
新日期(年、月、日[、时、分、秒、毫秒])
对于您的案例,初始化可能如下所示:
// Extract month, day, year from SQLite format, 'trimming' whitespace.
var sqlLiteSampleStr = "2012-10-07 11:01:13";
var re = /^\s*(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})\s*$/;
var match = re.exec(sqlLiteSampleStr);
if (match) {
var year = parseInt(match[1]);
var month = parseInt(match[2]) - 1; // Zero-indexed months.
var date = parseInt(match[3]);
var hour = parseInt(match[4]);
var minute = parseInt(match[5]);
var second = parseInt(match[6]);
var date = new Date(year, month, date, hour, minute, second);
}
注意:请注意时区问题。您似乎没有任何 SQLite 格式 sn-p 的时区数据。
更新
@james-j 澄清说他正在寻找分钟和秒。
这里有一个 sn-p 来提取分钟和秒:
var msPerMin = 1000 * 60;
var min = Math.floor(timeInMs / msPerMin);
var timeInMs = timeInMs - (min * msPerMin);
var sec = Math.floor(timeInMs / 1000 );