Как разобрать строку даты, содержащую часовой пояс? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть дата в строке:

let day = "12/07/1998 12:30 GMT+4"

Как конвертировать его в мгновение? Я пытался

let d = moment(day, 'DD/MM/YYYY HH:mm')

Но я не знаю, как разобрать часовой пояс. Я не смог найти его в документации

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Moment.js не обязательно анализирует часовой пояс, если строка не соответствует формату ISO 8601 или RFC 2822. Ожидается, что часовой пояс будет в формате ± ЧЧмм, поэтому GMT+4 игнорируется.

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

Если вы не можете исправить формат ввода в источнике, вы можете исправить его на своем конце (при условии, что вы знаете формат), а затем указать «Z» в токенах разбора, например ::

/* Fix offset like GMT+4 to +0400
 * If offset is 1 digit, pad to 0d00      -8 -> -0800 
 * If offset is 2 digits, pad to dd00    +10 -> +1000
 * If offset is 3 digits, padd to 0ddd  +530 -> +0530
 * If offset is 4 digits, leave as is  +1030 -> +1030
 */
function fixOffset(s) {
  var tz = s.match(/(GMT)([+-])(\d+)$/);
  // If not required format, do nothing
  if (tz.length != 4) return;
  var h = tz[3];
  var offset = h.length == 1? '0' + h + '00' :
               h.length == 2?       h + '00' :
               h.length == 3? '0' + h        : h;
  return s.replace(/GMT[+-]\d+$/, tz[2] + offset);
}

var s = "12/07/1998 12:30 GMT+4";
s = fixOffset(s);

console.log('Fixed format: ' + s);

console.log( moment(s,'DD/MM/YYYY HH:mm Z').format('LLLL') );
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
0 голосов
/ 07 ноября 2018

Лучший способ проанализировать строку часовых поясов, это использовать часовой пояс момента. Вы должны сделать это moment.tz(day)

0 голосов
/ 06 ноября 2018

Обновлено 2018/11/6:

Более новые версии момента ожидают, что вы передадите формат часового пояса как один из следующих двух вариантов:

ZZ => -07:00 -06:00 ... +06:00 +07:00

Или

Z => -0700 -0600 ... +0600 +0700

Подробнее здесь ..

Таким образом, нам нужно восстановить наш заданный формат GMT + 4 , чтобы он соответствовал регистру ввода, мы будем использовать некоторые регулярные выражения и es6, чтобы переформатировать нашу указанную дату следующим образом: DD/MM/YYYY hh:mm ZZ обратите внимание на 'ZZ' в конце:

Демо-версия:

let date = "12/07/1998 12:30 GMT+4"
let justDayAndTime = date.split(/(GMT(\+|\-)\d+)/)[0].trim()
let zone = date.match(/\d+$/)[0]
let mark = date.match(/(\+|\-)/)[0]
let parsed = `${justDayAndTime} ${mark}${moment(zone,"k").format("HH:mm")}`

let result = moment(parsed,"DD/MM/YYYY hh:mm ZZ")

console.log(result.format('LLLL'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

Ответ:

Вы можете использовать формат метод

moment("12/07/1998 12:30 GMT+4").format('DD/MM/YYYY HH:mm')
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

Для большего контроля часового пояса:

https://momentjs.com/timezone/

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