2010-05-11 110 views
0

我希望得到這個正確的,我有點與這個狡猾。我想要做的是讓小時,幾天和幾周都正確。正確的時間顯示

例子:

,如果這個職位是< 60分鐘舊然後把它讀:發佈不到1分鐘前

,如果這個職位是< 120min的老然後把它讀:發佈時間1小時前

,如果這個職位是> 120分鐘舊然後把它讀:發佈時間1小時前

,如果這個職位是< 1440min老然後把它讀:1天前

如果這篇文章大於1440分鐘,那麼請閱讀:發佈時間2天以前

是嗎?

這是我到目前爲止有:

if (lapsedTime < 60) { 
     return '< 1 mimute'; 
    } else if (lapsedTime < (60*60)) { 
     return Math.round(lapsedTime/60) + 'minutes'; 
    } else if (lapsedTime < (12*60*60)) { 
     return Math.round(lapsedTime/2400) + 'hr'; 
    } else if (lapsedTime < (24*60*60)) { 
     return Math.round(lapsedTime/3600) + 'hrs'; 
    } else if (lapsedTime < (7*24*60*60)) { 
     return Math.round(lapsedTime/86400) + 'days'; 
    } else { 
     return Math.round(lapsedTime/604800) + 'weeks'; 
    } 
+0

你不必計數1小時, 1小時':),你已經設置了不到12小時,以顯示小時,我不認爲這是故意的 – marianboda 2010-05-11 21:47:20

+0

elapsedTime not lapsedTime;) – 2010-05-11 21:52:22

回答

1

你有幾個錯別字,錯過了情況:

if (lapsedTime < 60) { 
     return '< 1 minute'; 
    } else if (lapsedTime < (2*60*60)) {  // Missed this case 
     return '1 minute'; 
    } else if (lapsedTime < (60*60)) { 
     return Math.round(lapsedTime/60) + ' minutes'; 
    } else if (lapsedTime < (2*60*60)) {  // This should be 2, not 12 
     return '1 hour'; 
    } else if (lapsedTime < (24*60*60)) { 
     return Math.round(lapsedTime/3600) + ' hours'; 
    } else if (lapsedTime < (2*24*60*60)) { 
     return '1 day'; 
    } else if (lapsedTime < (7*24*60*60)) { 
     return Math.round(lapsedTime/86400) + ' days'; 
    } else if (lapsedTime < (2*7*24*60*60)) { // Missed this case 
     return '1 week'; 
    } else { 
     return Math.round(lapsedTime/604800) + ' weeks'; 
    } 

我不同意,一個更好的方法是計算周,日,小時,分鐘,並使用這些格式化字符串:

function formatTime(t, tStr) { 
    // Singular case 
    if(t==1) { return t+' '+tStr; } 

    // Plural case 
    return t+' '+tStr+'s'; 
} 

function timeString(lapsedTime) { 
    // These could be "round" or "floor", depending on what you want 
    var minutes = Math.floor(lapsedTime/60); 
    var hours = Math.floor(lapsedTime/3600); 
    var days = Math.floor(lapsedTime/86400); 
    var weeks = Math.floor(lapsedTime/604800); 
    var years = Math.floor(lapsedTime/31536000); 

    if(minutes == 0) { return '< 1 minute';     } 
    if(hours == 0) { return formatTime(minutes, 'minute'); } 
    if(days == 0) { return formatTime(hours, 'hour');  } 
    if(weeks == 0) { return formatTime(days, 'day');   } 
    if(years == 0) { return formatTime(weeks, 'week');  } 
    return formatTime(years, 'year'); 
} 
0

技術上你有什麼是正確的。然而,該化合物if是一場噩夢:不容易理解它的作用,或者它是否正常工作,沒有想到。

您可能想要預先計算所有周/天/小時/等值,然後使用這些值來提高代碼的可讀性:例如,請看my answer here

在你的情況,你會怎麼做:

var weeks = Math.round(lapsedTime/604800); 
var days = Math.round(lapsedTime/86400); 
// etc for the other quantities 

if (weeks >= 1) { 
    return weeks + " weeks"; 
} 
else if (days >= 1) { 
    return days + " days"; 
} 

// etc 

我想你會同意,這是很容易理解和驗證正確性。

編輯:當掃描您的問題的明顯問題時,我設法錯過了所有其他人指出的錯誤。我認爲這是說:a)我是一個匆忙的快速讀者,b)確實很難驗證這樣的if。 :-)

1

你不需要寫「elseif的」,因爲一旦返回值,函數不執行了,所以它是安全的寫:

if (time < 60) return '< 1 minute'; 
if (time < 120) return '1 minute'; 
if (time < 60*60) ... 
... 

另一個錯誤是,你做了幾個小時,但不是幾分鐘,幾天和幾周。 正如我在評論中寫的,還有一個小時的錯字,你有12 * 60 * 60 - 我認爲你的意思是2 * 60 * 60

相關問題