Правильный способ манипулировать строкой даты с неправильным годом, но с правильным временем - PullRequest
0 голосов
/ 25 апреля 2019

Мне нужно запустить API, у меня нет доступа к исправлению, и мне нужно запустить таймер, показывающий, как долго кто-то находится в очереди. Дата, которую я возвращаю, в этом формате 1556214336.316. Проблема в том, что год всегда отображается как 1970, но время - правильное время начала. Мне нужно рассчитать разницу между временем сейчас и временем, когда разговор был создан. Я пробовал это с небольшим успехом, и мне было интересно, есть ли элегантный способ получить разницу во времени, а не общее количество секунд.

 convertDateToTimerFormat = (time) => {
    const now = new Date();
    const diff = Math.round((now - parseInt(time.toString().replace('.', ''))) / 1000);
    const hours = new Date(diff).getHours();
    const minutes = new Date(diff).getMinutes();
    const seconds = new Date(diff).getSeconds();
    return `${hours}:${minutes}:${seconds}`;
}

Странный parseInt(time.toString().replace('.', ''))), похоже, решает проблему 1970 года, но я все еще не могу заставить данные манипулировать так, как мне нужно.

Я попробовал библиотеку моменталов, но их метод сравнения, по-видимому, допускает только дни и часы.

Любая помощь / руководство, будет высоко ценится.

Редактировать с рабочим кодом:

  convertDateToTimerFormat = (time) => {
    const now = new Date();
    // eslint-disable-next-line radix
    const diff = new Date(Number(now - parseInt(time.toString().replace(/\./g, ''))));
    const hours = diff.getHours();
    const minutes = diff.getMinutes();
    const seconds = diff.getSeconds();
    return `${hours}:${minutes}:${seconds}`;
  }

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Unix time значения представляют собой число секунд с начала эпохи и не будут иметь десятичной дроби, аналогичной вашей 1556214336.316
Если я возьму 1556214336 (без.316) и поместите его в конвертер Я получаю вывод 04/25/2019 @ 5:45pm (UTC), который не 1970 - кажется, точное время (я не проверял независимо)
Похоже, что ваш 1556214336.316 - это секунд. миллисекунд со времени эпохи.

Javascript использует ту же эпоху, но это число миллисекунды начиная с эпохи, а не секунды, поэтому, если я прав насчет времени, которое вы получаете, вы сможете просто удалить десятичное место и использовать полученную числовую строку.Действительно,

var d = new Date(1556214336316);
console.log('Date is: ' + d.toUTCString());

производит

Date is: Thu, 25 Apr 2019 17:45:36 GMT

, что точно соответствует времени преобразователя "5:45 pm"

var d = new Date(1556214336316);
console.log('Date is: ' + d.toUTCString());

Предполагая, что ваше значение 1556214336.316 является строкой, возвращаемой из веб-API, вы можете удалить десятичную дробь, и ваше преобразование может быть выполнено следующим образом (обратите внимание, что вы этого не делаетесоздавать новые Date объекты):

convertDateToTimerFormat = (time) => {
    const d = new Date( Number(time.replace(/\./g, '')) );
    return `${d.getHours()}:${d.getMinutes()}:${d.getSeconds()}`;
};

console.log( 'time: ' + convertDateToTimerFormat('1556214336.316') );

В зависимости от вашего использования, вы можете использовать getUTCHours() и т. Д.

0 голосов
/ 25 апреля 2019

Я не знаю об элегантном, но это вычисляет и отображает истекшее время в h:mm:ss формате:

console.log(convertDateToTimerFormat(1556215236.316)); 

function convertDateToTimerFormat(time){

  // Converts `time` to milliseconds to make a JS Date object, then back to seconds
  const expiredSeconds = Math.floor(new Date()/1000) - Math.floor(new Date(time * 1000)/1000);

  // Calculates component values
  const hours = Math.floor(expiredSeconds / 3600), //3600 seconds in an hour
        minutes = Math.floor(expiredSeconds % 3600 / 60),
        seconds = expiredSeconds % 3600 % 60;

  // Adds initial zeroes if needed
  if (minutes < 10) { minutes = "0" + minutes; }
  if (seconds < 10) { seconds = "0" + seconds; }

  // Returns a formatted string
  return `${hours}:${minutes}:${seconds}`;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...