2015-06-01 4 views
3

Я пишу функцию, которая принимает дату будущего, и возвращает строку в форме "X weeks, Y days, Z hours", представляющей обратный отсчет до этой даты. Мой подход:Мой перевод с Ruby на JavaScript дает различные результаты

  1. Получите количество секунд, отделяющих две даты, путем вычитания времени эпохи будущей даты из сегодняшней эпохи.
  2. Разделите количество секунд на 604800 (количество секунд в неделю). Сохраните результат как weeks, и переопределите seconds в качестве остатка (это то, что делает Ruby's divmod).
  3. Проделайте то же самое для days, hours и minutes.

Сначала я написал в 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, по состоянию на 1 июня, JS дает "6 weeks, 5 days, 21 hours" и Руби дает "2 weeks, 3 days, 6 hours". Я не могу понять, где эта разница. Может ли кто-нибудь указать на мою ошибку?

+1

Не мог ли отладчик указать вашу ошибку? –

ответ

2

Тем не менее, если я передаю дату 2015,6,19 в обе функции, это будет 1 июня, когда я пишу это, JS сообщает мне 6 недель, 5 дней, 21 час, и Ruby сообщает мне 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

Смежные вопросы