Я пишу функцию, которая вычисляет, сколько дней назад данная дата была с сегодняшнего дня. (например, yesterday = 1, last week = 7, today = 0, tomorrow = -1 и т. д.)

Казалось, достаточно просто, и с помощью JavaScript {{X0 }} функция, которую я изначально написал так:

let historicalDate = new Date(2017,05,17).getTime(); // example date: last week
let diff = Math.round((new Date().getTime() - historicalDate) / (24*60*60*1000) );

После того, как я получил странные результаты, я исправил код, но все еще получил ту же проблему, как показано ниже:

/**
* Returns an integer, representing the number of days since a given date
**/
function getNumDaysFromDate(historicalDate){
  const day = 24*60*60*1000;              // The number of milliseconds in one day
  const now = new Date().getTime();       // The time right now 
  const then = historicalDate.getTime();  // The time comparing to
  return Math.round((now - then) / day ); // Find difference in milliseconds, then days
}

// Test1: last week, should return 7
let creationDate1 = new Date(2017,05,17);
console.log("Last week:", getNumDaysFromDate(creationDate1)); // Fail, prints -23

// Test2: yesterday, should return 1
let creationDate2 = new Date(2017,05,23);
console.log("Yesterday:", getNumDaysFromDate(creationDate2)); // Fail, prints -29

// Test3: Today, should return 0
let creationDate3 = new Date();
console.log("Today:", getNumDaysFromDate(creationDate3)); // Pass, prints 0

// Test4: day affer tomrrow, should return -2
let creationDate4 = new Date(2017,05,26);
console.log("Future:", getNumDaysFromDate(creationDate4)); // Fail, prints -32

Все вышеперечисленные результаты, по-видимому, истекли примерно через 1 месяц (кроме «теста 3», сегодня).

Я уверен, что для этого есть очевидная или простая причина, что один из вас сразу заметит, но я потратил на это последние несколько часов!

Заранее спасибо!

Изменить . Если возможно, я бы не хотел использовать такую библиотеку, как Moment.js. , так как это должно быть возможно Рождество (?), и это единственный калькулятор, связанный с датой в моем приложении.

1
Alicia 24 Май 2017 в 23:52

2 ответа

Лучший ответ

Будьте осторожны: API даты Javascript совершенно безумен (точно так же, как API даты Java).

Месяц начинается с 0 (январь) и продолжается до 11 (декабрь). Так что new Date(2017,5,17) означает 17 июня 2017 года.

5
Rolf Schäuble 24 Май 2017 в 21:03

Напомним, что месяцы в JavaScript начинаются с нуля (январь = 0, февраль = 1, ...). Так что, если вам нужно, может быть 4 (не 5).

/**
* Returns an integer, representing the number of days since a given date
**/
function getNumDaysFromDate(historicalDate){
  const day = 24*60*60*1000;              // The number of milliseconds in one day
  const now = new Date().getTime();       // The time right now 
  const then = historicalDate.getTime();  // The time comparing to
  var value = Math.round((now - then) / day );
  if(value == 0){
     return 0
    }
  else{
    return value+30;
    }// Find difference in milliseconds, then days
}

// Test1: last week, should return 7
let creationDate1 = new Date(2017,04,17); // 17th of May 2017
console.log("Last week:", getNumDaysFromDate(creationDate1)); // Fail, prints -23

// Test2: yesterday, should return 1
let creationDate2 = new Date(2017,04,23); // 23 of May 2017
console.log("Yesterday:", getNumDaysFromDate(creationDate2)); // Fail, prints -29

// Test3: Today, should return 0
let creationDate3 = new Date();
console.log("Today:", getNumDaysFromDate(creationDate3)); // Pass, prints 0

// Test4: day affer tomrrow, should return -2
let creationDate4 = new Date(2017,04,26); // 26th of May 2017
console.log("Future:", getNumDaysFromDate(creationDate4)); // Fail, prints -32
-3
Apotheka 24 Май 2017 в 21:29