来看一种时间格式:December 17, 2015 | 0:48 AM CT,CT指的是美国中部时区——CENTRAL TIME(CT) 芝加哥、圣路易斯、新奥尔良、休斯顿等在此时区.北京时间为中部时间加 十四个小时。这个时间与当前时间做比较主要要考虑2点:
- 时间的比较可以转换为时间戳的比较,即new Date().valueOf()。当前给的CT时间格式是不能直接用new Date()方法来将string转为Date对象的,因此,这个问题就转换为将当前给予的时间格式转化为Date对象。ps:时间戳就是从1970年1月1日0时0分0秒到当前时间点的所有秒数。1970.1.1 0:0:0 这个时间就是IT中所谓的“时间纪元” 。
时间差的换算。当前时间的获取可以用new Date()来初始化,但是如果电脑的时区不是CT的,就会存在时间差的问题。举个例子北京时间“2016-12-24 15:15:15”与美国时间“2016-12-24 15:15:15”就不是同一个时刻,因此需要把相比较的2个时间需要统一换算到世界标准时间(格林威治时间)后再做比较。
首先来看将“December 17, 2015 | 0:48 AM CT”转换为时间对象。December 17, 2015是可以转换为时间对象的字符串格式,0:48 AM CT表示的是12时制的时间,AM表示的是上午,PM表示的是下午,需要将其转化为24小时制的。对于“December 17, 2015 0:48”和“December 17, 2015 | 19:48”是可以通过new Date()转换为时间格式的。代码思路是获取AM和PM,如果是AM那么时间保持不变,如果是PM则需要在时上+12,代码实现如下所示:
var clock12To24 = function (str){
var returnValue = '00:00';
if(str.match(/^\d{1,2}:\d{2} (AM|PM)$/g)){
var array = str.split(' ');
if(array[1] == 'AM'){
returnValue = array[0];
}else{
var time = array[0].match(/^\d{1,2}/g);
if(time){
returnValue = array[0].replace(/^\d{1,2}/,12 + parseInt(time[0]));
}
}
}
return returnValue;
}
下面来思考一下时区的转换,CT时区与世界标准时间的时差是6小时,那么CT时间转换为世界标准时间就需要+6小时(即6*60*60*1000毫秒)。因为new Date()获取的当前时间是本地的时间,所以这个时区是根据电脑设置时区的不同而变化的,那变化的如何取得时差?不用担心,Date有个方法getTimezoneOffset(),是用来取得与世界标准时间的时差的,返回的结果值单位为分,换算成毫秒就需要乘以60*1000。
完整的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Date</title>
</head>
<body>
<script type="text/javascript">
var compareDate = {
// 早于当前时间返回false,晚于当前时间返回true
compareWithNow: function(str){
var that = this;
var arrayStr = str.split('|');
var strTime = arrayStr[1].match(/\d{1,2}:\d{2} (AM|PM)/g);//获取时间字符串
var dateCompared;
if(strTime){
dateCompared = new Date(arrayStr[0] + that.clock12To24(strTime[0]));
}else{
dateCompared = new Date(arrayStr[0]);
}
// CT时间转换成国际标准时间
var offsetCT = 6; // CT与国际标准时间的时差,单位为小时
var utc_dateCompared = dateCompared.valueOf() + offsetCT * 3600000;
// console.log(dateCompared.valueOf() + ',' + utc_dateCompared);
// 当地时间转换成国际标准时间
var now = new Date();
var utc_now = now.valueOf() + now.getTimezoneOffset() * 60000;
// console.log(now.valueOf() + ',' + utc_now);
// console.log(now.getTimezoneOffset());
return utc_now < utc_dateCompared;
},
// str格式为11:00 AM 或 2:35 PM
clock12To24: function (str){
var returnValue = '00:00';
if(str.match(/^\d{1,2}:\d{2} (AM|PM)$/g)){
var array = str.split(' ');
if(array[1] == 'AM'){
returnValue = array[0];
}else{
var time = array[0].match(/^\d{1,2}/g);
if(time){
returnValue = array[0].replace(/^\d{1,2}/,12 + parseInt(time[0]));
}
}
}
return returnValue;
}
}
// 测试
console.log(compareDate.compareWithNow('December 17, 2015 | 0:48 AM CT'));
console.log(compareDate.compareWithNow('December 17, 2015 | 3:00 AM CT'));
console.log(compareDate.compareWithNow('February 3, 2016 | 11:30 PM CT'));
</script>
</body>
</html>
可以在浏览器的控制台中查看结果,如下图所示: