Javascript getTime с начала 2012 года в миллисекундах - PullRequest
0 голосов
/ 08 января 2012

getTime() дает вам миллисекунды с 1 января 1970 года.

Как я могу получить миллисекунды с 1 января 2012 года?

Вот что у меня сейчас есть:

var n = new Date()
var a = n.getTime()

console.log (a)

Ответы [ 4 ]

4 голосов
/ 08 января 2012

Как насчет:

var diff = new Date() - new Date(2012, 0, 1); // diff is in milliseconds

для расчета различий, включая отклонения местного часового пояса, или

var diff = new Date() - Date.UTC(2012, 0, 1); // diff in ms

для более научных решений.

Обратите внимание, что месяцы в Javascript начинаются с нуля.

3 голосов
/ 08 января 2012
var ms = +new Date() - new Date( '2012/01/01' )

или сделайте объект 2-й даты new Date( '2012/01/01 GMT' ), если хотите

2 голосов
/ 09 января 2012

Вот пример:

Пример вывода.Обратите внимание, как DurationGMT & DurationLocal отличаются.При сравнении с датами всегда используйте GMT.

Now:         1,326,054,979,124 ms (Sun, 08 Jan 2012 20:36:19 GMT)

Start1:      1,325,376,000,000 ms (Sun, 01 Jan 2012 00:00:00 GMT)
Start2:      1,325,376,000,000 ms (Sun, 01 Jan 2012 00:00:00 GMT)
Start3:      1,325,376,000,000 ms (Sun, 01 Jan 2012 00:00:00 GMT)
DurationGMT: 678,979,124 ms (Accurate method)

StartLocal1:   1,325,397,600,000 ms (Sun, 01 Jan 2012 06:00:00 GMT)
DurationLocal: 657,379,124 ms !!! Don't use this method

Вот три способа получить дату по Гринвичу, # 3 будет тем, что вы хотите.

var now = new Date();
var startOfYear1 = createGMTDate1(2012, 0, 1, 0, 0, 0, 0);
var startOfYear2 = createGMTDate2(2012, 0, 1, 0, 0, 0, 0);
var startOfYear3 = createGMTDate3(2012, 0, 1, 0, 0, 0, 0);
var durationGMTMillis = now.getTime() - startOfYear1.getTime(); // accurate

var startOfYearLocal1 = new Date(2012, 0, 1, 0, 0, 0, 0);
var durationLocalMillis = now.getTime() - startOfYearLocal1.getTime(); // inaccurate

function createGMTDate1(year, month, date, hours, mins, secs, millis) {
  var dateDefaultTz = new Date(year, month, date, hours, mins, secs, millis);
  var localeTzGMTMillis = dateDefaultTz.getTime();
  var localeTzGMTOffsetMillis = dateDefaultTz.getTimezoneOffset() * 60 * 1000;
  var dateGMT = new Date(localeTzGMTMillis - localeTzGMTOffsetMillis);
  return dateGMT;
}

function createGMTDate2(year, month, date, hours, mins, secs, millis) {
  var dateGMT = new Date(0);
  dateGMT.setUTCFullYear(year);
  dateGMT.setUTCMonth(month);
  dateGMT.setUTCDate(date);
  dateGMT.setUTCHours(hours);
  dateGMT.setUTCMinutes(mins);
  dateGMT.setUTCSeconds(secs);
  dateGMT.setUTCMilliseconds(millis);
  return dateGMT;
}

function createGMTDate3(year, month, date, hours, mins, secs, millis) {
  var dateGMT = new Date(Date.UTC(year, month, date, hours, mins, secs, millis));
  return dateGMT;
}
0 голосов
/ 08 января 2012

Как уже говорили другие, решение вычитает Date случаев:

var ms = now - before;

Это работает, потому что оператор - преобразует свои операнды в Number ( Спецификация языка ECMAScript, издание 5.1 , раздел 11.6.2). Соответствующий алгоритм ToNumber проверяет, есть ли у объекта метод valueOf, и вызывает его, если он существует (разделы 9.3, 9.1 и 8.12.8).

Теперь случается, что метод Date.prototype.valueOf(), который наследуют Date экземпляров, возвращает то же значение, что и Date.prototype.getTime() для данного экземпляра Date (раздел 15.9.5.8). Количество миллисекунд с 1 января 1970 года (CE) 00: 00: 00.000 UTC («эпоха») (раздел 15.9.1.1).

Первый операнд очевиден, если вы хотите сравнить с местным временем:

var now = new Date();

Вторая часть немного сложнее, потому что вы хотите считать с 1 января 2012 года (CE) 00: 00: 00.000 GMT . Для этого вы не можете использовать

var before = new Date(2012, 0, 1);

(или его вариации), потому что он использует 00: 00: 00.000 местное время (раздел 15.9.3.1). Есть как минимум два способа сделать эту работу:

  1. Используйте строковое значение в формате даты, которое должно быть распознано с помощью соответствующих реализаций ECMAScript Edition 5.1 (раздел 15.9.1.15):

    var ms = new Date() - new Date("2012-01-01T00:00:00.000Z");
    
  2. Если вас беспокоит обратная совместимость, вы можете установить время явно (раздел 15.9.5):

    var before = new Date();
    before.setUTCFullYear(2012, 0, 1);
    before.setUTCHours(0, 0, 0, 0);
    
    var ms = now - before;
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...