2017-08-11 110 views
0

我有一個函數來顯示從兩分鐘延遲JavaScript的時間。唯一的問題是,當時間是例如下午2:00,該功能顯示2:0-2pm而不是1:58 pm。Javascript時間函數顯示不正確

這裏是下面的代碼:

function startTime() { 
 
    var today = new Date(); 
 
    var h = today.getHours(); 
 
    var m = eval(today.getMinutes()-2); // needs eval function 
 
    var s = today.getSeconds(); 
 
    m = checkTime(m); 
 
    s = checkTime(s); 
 
    var time = h>=12?" PM":" AM" // am or pm 
 
    h = h % 12; 
 
    h = h ? h : 12; // the hour '0' should be '12' 
 
    m = m < 10 ? ''+m : m; 
 
    
 
    document.getElementById('txt').innerHTML = 
 
    "Time: " + h + ":" + m + ":" + s + time; 
 
    var t = setTimeout(startTime, 500); 
 
    
 
    } 
 
    function checkTime(i) { 
 
    if (i < 10) {i = "0" + i}; // add zero in front of numbers < 10 
 
    return i; 
 
    } 
 
<body onload="startTime()"> 
 
    <div id="txt"></div>

+0

爲什麼不使用'moment.js'? – jdmdevdotnet

+1

不,**你不需要'eval'函數。 – Dai

+0

你的'i =「0」+ i'函數並不符合你的想法。使用'i.toString()'。並使用'textContent'而不是'innerHTML'。 – Dai

回答

1

你的問題是,你正在減去2分鐘,而不考慮你是在處理時間,而不僅僅是數字。此外,你的功能可以更簡潔。

一個簡單的解決方案是從格式化之前的日期減去2分鐘。這也將調整小時,並允許夏令時觀察。如果轉換時間爲02:00並進入夏令時,則在03:00之前2分鐘是01:58。同樣,當夏令時結束時。

考慮:

function get2MinsAgo() { 
 
    function z(n){return (n<10? '0' : '') + n} 
 
    var d = new Date(); 
 
    d.setMinutes(d.getMinutes() - 2); 
 
    return (d.getHours() % 12 || 12) + ':' + 
 
     z(d.getMinutes()) + ':' + 
 
     z(d.getSeconds()) + ' ' + 
 
     (d.getHours() < 12? 'AM' : 'PM'); 
 
} 
 

 
function showTime(){ 
 
    // Run just after next full second 
 
    var lag = 1020 - new Date()%1000; 
 
    document.getElementById('timeText').textContent = get2MinsAgo(); 
 
    setTimeout(showTime, lag); 
 
} 
 

 
showTime()
<div>Two minutes ago was <span id="timeText"></span></div>

1

,我懷疑這是因爲在下午2:00或小時隨時「getMinutes()」函數將返回00分鐘。所以,當你從它減去兩個它自己設置爲-2而不是58.

+0

你已經確定了這個問題,但有修復? ;-) – RobG