Получение одинаковой метки времени Unix для двух разных времен в JavaScript - PullRequest
0 голосов
/ 04 июня 2018

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

Вот эта функция, которую я использовал для преобразования метки времени в unix:

var normal_to_unix = function (date_string) {
    var date = new Date(date_string);
    return date.getTime() / 1000;
}

Эта функция в порядке, поскольку дата уже в UTC, и мне не нужно выполнять какие-либо преобразования.

Теперь эта функция используется для преобразования времени в unix.Реальное время в моем случае выглядит как "20180603T150000Z".

var ics_to_unix = function (ics_string) {
    var year = ics_string.slice(0, 4);
    var month = ics_string.slice(4, 6);
    var date = ics_string.slice(6, 8);
    var hours = ics_string.slice(9, 11);
    var minutes = ics_string.slice(11, 13);
    var seconds = ics_string.slice(13, 15);
    var milliseconds = 0;
    console.log(year, month, date, hours, minutes, seconds, milliseconds); // This is example output 2018 06 03 15 00 00 0 
    return normal_to_unix((new Date(year, month, date, hours, minutes, seconds, milliseconds)).toDateString())
}

Теперь проблема в том, что я получаю одинаковое время Unix для "20180603T150000Z" и "20180603T160000Z", которые должны давать разные метки времени, и оно1530576000 для них обоих.

Есть ли что-то, что я пропускаю?Заранее спасибо.

Пожалуйста, посмотрите на this для живого примера

1 Ответ

0 голосов
/ 04 июня 2018

Несколько точек здесь:

Метод toDateString () возвращает часть даты объекта Date в удобочитаемой форме на американском английском языке.Для вашего примера это `Tue Jul 03 2018 ', возможно, это не то, что вы хотите.

new Date создает дату в вашем местном часовом поясе, которая может хорошо играть, если вы используете ее вместе с toString(),который также вернет строку даты в вашем местном часовом поясе.Но он будет подвержен изменениям в летнее время, поэтому я бы не стал использовать этот метод.

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

Я бы предложил использовать следующее:

var ics_to_unix = function (ics_string) {
  var year = parseInt(ics_string.slice(0, 4));
  var month = parseInt(ics_string.slice(4, 6)) - 1; // Jan is 0
  var date = parseInt(ics_string.slice(6, 8));
  var hours = parseInt(ics_string.slice(9, 11));
  var minutes = parseInt(ics_string.slice(11, 13));
  var seconds = parseInt(ics_string.slice(13, 15));

  return Date.UTC(year, month, date, hours, minutes, seconds) / 1000;
}

Я добавил явное преобразование строк в числа, скорректировал месяц, чтобы он соответствовал тому, что используется в javascript, а также удалил лишние.звоните.

...