Я пишу функцию, которая принимает дату будущего, и возвращает строку в форме "X weeks, Y days, Z hours"
, представляющей обратный отсчет до этой даты. Мой подход:Мой перевод с Ruby на JavaScript дает различные результаты
- Получите количество секунд, отделяющих две даты, путем вычитания времени эпохи будущей даты из сегодняшней эпохи.
- Разделите количество секунд на 604800 (количество секунд в неделю). Сохраните результат как
weeks
, и переопределитеseconds
в качестве остатка (это то, что делает Ruby'sdivmod
). - Проделайте то же самое для
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"
. Я не могу понять, где эта разница. Может ли кто-нибудь указать на мою ошибку?
Не мог ли отладчик указать вашу ошибку? –