Для заданного времени и смещения;конвертировать в UTC в JavaScript - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь преобразовать время заданного формата "2019-06-17 10:35:18" и значение смещения "8" в формат строки ISO "2019-06-07T02: 35: 18.000Z"

Когда я пытаюсь использовать новый Date () формата, он конвертируется в местный часовой пояс «Mon Jun 17 2019 10:35:18 GMT-0400 (Eastern Daylight Time)». Но без использования new Date (), если я использую функцию .toISOString (), она выдаст ошибку. Ошибка типа: "2019-06-17 10:35:18" .toISOString не является функцией

Ниже приведен код, который я пробовал

function formatDate(date,offset){
  const year = date.getFullYear ();
  const month = date.getMonth () + 1 < 10
    ? `0${date.getMonth () + 1}`
    : date.getMonth () + 1;
  const day = date.getDate () < 10 ? `0${date.getDate ()}` : date.getDate ();
  const hour = date.getHours ().toString ().length === 1
    ? `0${date.getHours ()}`
    : date.getHours ();
  const minutes = date.getMinutes ().toString ().length === 1
    ? `0${date.getMinutes ()}`
    : date.getMinutes ();
  const seconds = date.getSeconds ().toString ().length === 1
    ? `0${date.getSeconds ()}`
    : date.getSeconds ();

  const time = `${year}/${month}/${day}T${hour-offset}:${minutes}:${seconds}.00Z`;
  return time;
}

Фактически - новая дата ("2019-06-17 10:35:18"). ToISOString () "2019-06-17T14: 35: 18.000Z"

Я хочу - для заданного времени и смещения «8» и ожидаемый результат будет «2019-06-17T02: 35: 18.000Z»

1 Ответ

0 голосов
/ 17 июня 2019

Вы должны просто преобразовать входные данные в стандартный формат, а затем использовать функцию toISOString объекта Date для преобразования в UTC.

function formatDate(date, offset) {
    // Convert the offset number to ISO format (+/-HH:mm)
    const pad = (n) => ((n < 10 ? '0' : '') + n);
    const sign = offset < 0 ? '-' : '+';
    const offsetHours = pad(Math.abs(offset) | 0);
    const offsetMinutes = pad(Math.abs(offset) * 60 % 60);
    const offsetString = `${sign}${offsetHours}:${offsetMinutes}`;

    // build an ISO local time string with date and offset
    const local = `${date.slice(0,10)}T${date.slice(11)}${offsetString}`;

    // convert to a UTC based string and return
    return new Date(local).toISOString();
}

Пример использования с вашими входами:

formatDate('2019-06-17 10:35:18', 8)
//=> "2019-06-17T02:35:18.000Z"

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

...