Вопрос по time, javascript – Как рассчитать мс с полуночи в Javascript

18

Каков наилучший способ рассчитать время, прошедшее с (последней) полуночи в мс?

Date Получить объект даты для (последней) полуночи и вычесть & quot; сейчас & quot; из него ... - просто математика Andreas
@ Ольга Ух, иногда я тупой. Вот что я получаю за то, что до 3 утра! Niet the Dark Absol
@Kolink Ольга просит миллисекунды между полуночью и сейчас. Для знака нет предпочтения: P Но ты прав :) Andreas
@Andreas Midnight, вычтенный с этого момента, дает отрицательное время;) Niet the Dark Absol
Спасибо, парни! Кольник, тебе решение тоже дает отрицательное время? Olga

Ваш Ответ

6   ответов
30

var d = new Date(), e = new Date(d);
var msSinceMidnight = e - d.setHours(0,0,0,0);

Как функция:

function getMsSinceMidnight(d) {
  var e = new Date(d);
  return d - e.setHours(0,0,0,0);
}

alert(getMsSinceMidnight(new Date()));
Это хорошо. Это правильно обрабатывает летнее время.
1

но вместо использования часов: минут: секунд все преобразуется в секунды.

Я думаю, что это должно сделать это:

var now = new Date();    
var hours = now.getHours()*(60*60);
var minutes = now.getMinutes()*60;
var seconds = now.getSeconds();

var secSinceMidnight = hours+minutes+seconds;
@ Мала, ты имеешь в виду, что этот код не работает, если коррекция перехода на летнее время была применена не позднее полуночи? Тогда ответ Эндрю Д. также не удался
Я думаю, это действительно зависит от того, что вы ищете. В моем случае я получаю показания от сервера с временем, которое мне нужно сравнить с фактическими часами, чтобы проверить, не слишком ли поздно считывание. По сути, это единственный метод, который обеспечивает корректность, так как он «очищает» Любое соображение о ДСТ. В других случаях может быть не правильным решением. +1
это неправильно при переходе на летнее время
@Dan: этот ответ предполагает, что 8:00 означает 8 часов с полуночи, что не верно в дни, когда переход на летнее время начинается или заканчивается. Я не внимательно посмотрел на ответ Эндрю, но в любом случае я рекомендовал ответ RobG выше, потому что я могу подтвердить, что он работает, и на него не влияет потенциальный такт между двумя объявлениями Date
0
var today = new Date();
var d = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0); 

var difference = today.getTime() - d.getTime();
1
var d=new Date();
// offset from midnight in Greenwich timezone
var msFromMidnightInGMT=d%86400000;
// offset from midnight in locale timezone
var msFromMidnightLocale=(d.getTime()-d.getTimezoneOffset()*60000)%86400000;
9

Много ответов кромеRobG (рекомендуемый ответ), Kolink & APOS; s а такжеЛай & APOS; s здесь не так

Давайте посмотрим ближе друг к другу


First mistake

OptimusCrime а такжеАндрей Д. ответы:

Какскуловая кость sugested, если коррекция перехода на летнее время была применена в ближайшую полночь, мы получаем неверное значение. Давайте отладим:

  1. Suppose it's last Sunday of March
  2. The time is fixed at 2 am.
  3. If we see 10 am on the clock, there's actually 11 hours passed from midnight
  4. But instead we count 10 * 60 * 60 * 1000 ms
  5. The trick is played when midnight happens in different DST state then current

Second mistake

kennebeck & APOS; s ответ:

КакRobG пишет, что часы могут тикать, если вы получаете системное время дважды. Мы можем даже появляться в разные даты иногда. Вы можете воспроизвести это в цикле:

for (var i = 0; true; i++) {
    if ((new Date()).getTime() - (new Date()).getTime()) {
        alert(i); // console.log(i);  // for me it's about a 1000
        break;
    }
}

Third моя личная ловушка, которую вы могли бы испытать

Рассмотрим следующий код:

var d = new Date(),
    msSinceMidnight = d - d.setHours(0,0,0,0);

msSinceMidnight всегда0 поскольку объект изменяется во время вычисления перед операцией вычитания


Наконец, этот код работает:

var d = new Date(),
    msSinceMidnight = d.getTime() - d.setHours(0,0,0,0);
28

Создайте новую дату, используя текущий день / месяц / год, и получите разницу.

var now = new Date(),
    then = new Date(
        now.getFullYear(),
        now.getMonth(),
        now.getDate(),
        0,0,0),
    diff = now.getTime() - then.getTime(); // difference in milliseconds
Ну, я и РобГ не правы в комментариях выше. @RobG (о его втором предложении): системная дата получается здесь только один раз, а вторая дата рассчитывается сnow в качестве основы, таким образом, часы не могут «тикать». Вот
@Dan: нет, объект Date использует временные метки, которые безразличны к DST. Добавьте к тому факту, что летнее время изменяется рано утром, но не в полночь, это нормально.
Отредактировано, чтобы убрать вниз
Вы можете сделать это намного проще, скопировав объект даты и установив время на 00:00:00. Ваш ответ может быть неправильным, если между двумя датами тикают часы.
Это работает неправильно в2 / 365 * 100% случаи из-за изменения летнего времени

Похожие вопросы