1. 程式人生 > >CT時間與當前時間的大小比較

CT時間與當前時間的大小比較

來看一種時間格式:December 17, 2015 | 0:48 AM CT,CT指的是美國中部時區——CENTRAL TIME(CT) 芝加哥、聖路易斯、新奧爾良、休斯頓等在此時區.北京時間為中部時間加 十四個小時。這個時間與當前時間做比較主要要考慮2點:

  1. 時間的比較可以轉換為時間戳的比較,即new Date().valueOf()。當前給的CT時間格式是不能直接用new Date()方法來將string轉為Date物件的,因此,這個問題就轉換為將當前給予的時間格式轉化為Date物件。ps:時間戳就是從1970年1月1日0時0分0秒到當前時間點的所有秒數。1970.1.1 0:0:0 這個時間就是IT中所謂的“時間紀元” 。
  2. 時間差的換算。當前時間的獲取可以用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>

可以在瀏覽器的控制檯中檢視結果,如下圖所示:
這裡寫圖片描述