Класс даты неправильно конвертирует метку времени

В своем приложении я создаю живую консоль, на которой я выводю сообщения с их отметкой времени и содержимым. Из того, что я прочитал, подход, который я использую ниже с классом Date (), должен работать должным образом, где временная метка умножается на 1000, чтобы получить миллисекунды.

Я регистрирую метку времени для целей отладки и получаю такие значения, как «1441041070066». Когда я подключаю их к конвертерам Epoch / Unix, дата / время правильные. Однако мой код дает мою бессмыслицу вроде «22: 7: 46», а затем через 1 минуту «20:48:37». Может ли кто-нибудь объяснить, что я делаю неправильно в этом случае?

messages.forEach( function (item)
{
    var timestamp = item.Timestamp; // /Date(1440823073243)/
    var timestamp = timestamp.substring(timestamp.lastIndexOf("(")+1, timestamp.lastIndexOf(")"));

    console.log(timestamp);

    var source = item.Source;
    var type = item.Type;
    var contents = item.Contents;

    // Get Date/Time in Milliseconds
    var date = new Date(timestamp * 1000);
    var time = date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();

    console_log("<font color='blue'>" + time + "</font>" + ": " + contents);
});

person Community    schedule 30.08.2015    source источник
comment
Почему 22: 7: 46 - ерунда, когда вы форматируете его вот так, без отступов?   -  person Jon Skeet    schedule 30.08.2015
comment
Какой ожидаемый результат?   -  person guest271314    schedule 30.08.2015
comment
Я не имел в виду одну цифру, я указывал, что час / минута резко меняются для записей, которые разделяются всего на несколько минут.   -  person    schedule 30.08.2015


Ответы (1)


У вас уже есть временная метка в миллисекундах. Я не знаю, какой конвертер вы использовали, но если вы поместите 1440823073243 в epochconverter.com, он покажет:

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

... и появляется метка времени GMT: Sat, 29 Aug 2015 04:37:53 GMT.

Таким образом, вы должны удалить * 1000 часть вашего кода, но проанализировать timestamp (который все еще является строкой) в число:

var date = new Date(parseInt(timestamp));

Кроме того, вы должны использовать альтернативные способы форматирования даты:

  • В настоящее время вы используете часовой пояс пользователя; непонятно, хотите вы этого или нет. (Вполне может быть, но вы должны подумать об этом.)
  • Просто используя конкатенацию строк, вы не получите никаких отступов, что приведет к строкам типа «22: 7: 46».

По сути, исследуйте альтернативные варианты форматирования - будь то часть стандартных библиотек Javascript или что-то вроде moment.js.

person Jon Skeet    schedule 30.08.2015
comment
Спасибо за информацию! Я пробовал без множителя при тестировании и просто сделал это снова, но он дает мне NaN: NaN: NaN. Что касается форматирования, я не понимал, что это будет показывать часовой пояс пользователя, но я обязательно учту это после того, как все заработает правильно. - person ; 30.08.2015
comment
@BrettPowell: Ах, это NaN, потому что в настоящее время у вас есть timestamp в виде строки. - person Jon Skeet; 30.08.2015
comment
Ах, спасибо, что исправили. Я собирался начать выдергивать волосы. Всегда самые мелкие проблемы, но теперь они имеют смысл. - person ; 30.08.2015
comment
@BrettPowell: Радости динамически типизированного языка ... :) - person Jon Skeet; 30.08.2015