2015-06-01 61 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

相关问题