2015-06-01 62 views
3

我正在寫一個接受未來日期的函數,並以表示該日期的倒計時形式"X weeks, Y days, Z hours"返回一個字符串。我的方法是:我從Ruby到JavaScript的翻譯給出了不同的結果

  1. 通過從今天的紀元時間減去未來日期的紀元時間來獲得隔開兩個日期的秒數。
  2. 將秒數除以604800(一週內的秒數)。將結果存儲爲weeks,並重新定義seconds作爲餘數(這是Ruby的divmod所做的)。
  3. days,hoursminutes做同樣的事情。

首先,我寫在Ruby中,它的工作原理:

def time_countdown(*date_string) 
    seconds = Time.new(*date_string).to_i - Time.now.to_i 

    weeks, seconds = seconds.divmod 604800 
    days, seconds = seconds.divmod 86400 
    hours, seconds = seconds.divmod 3600 
    minutes, seconds = seconds.divmod 60 

    return "#{weeks} weeks, #{days} days, #{hours} hours." 
end 

我翻譯這JavaScript和除下列相同的方法:

  • 由於JavaScript的缺乏divmod,我做手動設置weeks/days/hours,然後將seconds設置爲其餘。
  • 我需要使用Math.floor,因爲JavaScript專門使用浮動。
  • 我將紀元時間除以1000,因爲JS使用毫秒爲其曆元時間戳,與Ruby不同。
  • 我的JS函數期望接收一個epochTime整數,因爲我還沒有學會如何在JS中傳遞任意長度的參數列表。

的代碼是:

function timeCountdown(epochTime) { 
    var seconds = epochTime/1000 - new Date().getTime()/1000; 

    var weeks = Math.floor(seconds/604800); 
    seconds = seconds % 604800; 
    var days = Math.floor(seconds/86400); 
    seconds = seconds % 86400; 
    var hours = Math.floor(seconds/3600); 
    seconds = seconds % 3600; 

    return weeks + " weeks, " + days + " days, " + hours + " hours."; 
} 

對於日期2015,6,19,截至6月1日,JS給"6 weeks, 5 days, 21 hours"和Ruby給"2 weeks, 3 days, 6 hours"。我無法弄清楚這種差異在哪裏出現。有人能指出我的錯誤嗎?

+1

調試器不能指出你的錯誤嗎? –

回答

2

然而,如果我喂日期2015,6,19這兩個函數,這是6月1日我寫這篇文章,JS告訴我6周,5天,21小時紅寶石告訴我2個wweeks,3天, 6個小時。

您還沒有表現出你是如何這樣做,但我的猜測是,你正在做的:

timeCountdown(new Date(2015, 6, 19)); 

...但在JavaScript中,一個月的數字0,而不是1開始,所以六月是月5,而不是6:

timeCountdown(new Date(2015, 5, 19)); 
// --------------------------^ 

實施例:

function timeCountdown(epochTime) { 
 
    var seconds = epochTime/1000 - new Date().getTime()/1000; 
 

 
    var weeks = Math.floor(seconds/604800); 
 
    seconds = seconds % 604800; 
 
    var days = Math.floor(seconds/86400); 
 
    seconds = seconds % 86400; 
 
    var hours = Math.floor(seconds/3600); 
 
    seconds = seconds % 3600; 
 

 
    return weeks + " weeks, " + days + " days, " + hours + " hours."; 
 
} 
 
snippet.log("July 19th: " + timeCountdown(new Date(2015, 6, 19))); 
 
snippet.log("June 19th: " + timeCountdown(new Date(2015, 5, 19)));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+1

你完全正確,那就是我正在做的。我不知道JS爲此使用了零索引數字,它甚至沒有發生在我身上。謝謝,完全解決了。 – GreenTriangle

相關問題