2013-06-30 44 views
1

我寫下面的腳本來比較時間:如何比較JavaScript中的時間(只有幾小時)?

var TC1WarningTime = new Date(2013, 6-1, 30, 4), 
TC1WarningTimeformat = [TC1WarningTime.getDate(), 
      (TC1WarningTime.getMonth()+1), 
      TC1WarningTime.getFullYear()].join('/')+ 
      ' ' + 
      [TC1WarningTime.getHours().padLeft()]+'HKT'; 

var TC1ReportTime = new Date(2013, 6-1, 30, 3), 
    TC1ReportTimeformat = [TC1ReportTime.getDate(), 
      (TC1ReportTime.getMonth()+1), 
      TC1ReportTime.getFullYear()].join('/')+ 
      ' ' + 
      [TC1ReportTime.getHours().padLeft()]+'HKT'; 

var TC1CurrentTime = ""; 
if (TC1WarningTime>TC1ReportTime) { 
    TC1CurrentTime = TC1WarningTimeformat; } 
else { TC1CurrentTime = TC1ReportTimeformat; } 

在上述例子中,是TC1WarningTime 04:00 30/6/2013和TC1ReportTime是30/6/2013 03:00。所以TC1WarningTime應該> TC1ReportTime,但爲什麼結果會給我TC1ReportTimeformat而不是TC1WarningTimeformat?

+0

你能解釋一下這段代碼應該做什麼嗎? –

+1

當我運行你的代碼時,我得到了預期的最後的04:00時間。你錯過了運行代碼所需的函數,所以我使用了一個存根版本:'Number.prototype.padLeft = function(){return this; };'。該代碼打印'「30/6/2013 4HKT」'。 –

+0

其實我有以下代碼(從互聯網複製),我沒有提到上面。 'Number.prototype.padLeft = function(base,chr){var len =(String(base || 10).length - String(this).length)+1;返回len> 0? new Array(len).join(chr ||'0')+ this:this; }' – hkson

回答

1

你應該做的一件事就是簡化代碼。取而代之的是重複的格式化代碼,你可以將這些模塊組合成一個單一的功能:

function formatDate(date) { 
    return [ 
     date.getDate(), 
     date.getMonth() + 1, 
     date.getFullYear() 
    ].join('/') + ' ' + 
    [ date.getHours().padLeft() ] + 'HKT'; 
} 

然後我們就可以定義測試變量,無併發症:

var 
    dateWarn = new Date(2013, 6-1, 30, 4), 
    dateReport = new Date(2013, 6-1, 30, 3); 

然後,對它們進行比較,並獲得以後的日子,您可以在Date對象直接比較,因爲你已經做:

var dateLatest = dateWarn > dateReport ? dateWarn : dateReport; 

或者另一種方式來做到這一點是使用Math.max()在他們身上。這將它們轉換爲數字,並返回一個數字,所以你需要將其轉換回Date

var dateLatest = new Date(Math.max(dateWarn, dateReport)); 

無論哪種方式,你就可以格式化爲formatDate功能結果:

var formattedDate = formatDate(dateLatest); 
+0

我正在google map api V3上工作。如果它晚於ReportTime,我想在infowindow中顯示WarningTime。否則,會顯示ReportTime。但在上面的例子中,即使WarningTime稍後(較大),它仍然顯示ReportTime。 – hkson

+0

而我剛纔試圖將WarningTime(dateWarn)設置爲31/12/2013 03:00 ...如果dateReport是28,29或30/12/2013 02:00,則仍然會顯示dateReport。但是,如果我將dateReport更改爲2013年12月27日02:00,現在它終於顯示dateWarn。 – hkson

+0

>和<是非常合適的運算符,不僅僅是數字。他們確實使用日期以及字符串。 –

0

比較使用getTime()。像這樣

var TC1CurrentTime = ""; 
    if (TC1WarningTime.getTime() >TC1ReportTime.getTime()) { 
     TC1CurrentTime = TC1WarningTimeformat; } 
    else { TC1CurrentTime = TC1ReportTimeformat; } 
+0

但是,這可以比較日期嗎? (例如1/7/2013 00:00晚於2013年6月30日23:00,我想顯示1/7/2013 00:00) – hkson

+0

@hkson:是的,getTime()函數將date(和時間)到自1970年1月1日UTC時間以來的毫秒數並進行比較。你可以檢查它。 –

+0

@hkson:實際上,datetime自1970年1月1日00:00 UTC起在內部存儲爲毫秒數。 (你也可以檢查Date.valueOf) –