Как добавить часовой пояс в определенный формат в momentjs?

Я пытаюсь получить определенный формат даты и времени с часовым поясом

я получаю строку формата времени, которая показана ниже

var dateTime = "2020-06-01T01:50:57.000Z CDT"

Мне нужно преобразовать формат в

 const offsetTime = moment(date).add("-0.00", 'hours')
 const formatedDate = moment(offsetTime, 'h:mm:ss A')
.utc()
.format('h:mm A')//(1:50 AM)

Требуемый результат

(1:50 AM CDT)

Мне нужно разбить строку и получить формат или у нас есть какой-либо способ преобразовать ее в этот формат в моментах?

Проще говоря

YYYY-MM-DDTHH:mm:ss.SSS[Z] z To hh:mm A z //format

и если строка содержит только 2 символа, например «CT», а не CDT, как это зафиксировать.


person user11159070    schedule 01.06.2020    source источник
comment
Используйте строку времени, которую вы должны создать объект Date, новую дату (ваша строка); затем из объекта даты у вас есть много дополнительных функций, которые позволят вам делать то, что вы хотите: w3schools.com/js/js_dates.asp   -  person SPlatten    schedule 01.06.2020
comment
есть ли что-нибудь с momentjs ??   -  person user11159070    schedule 01.06.2020
comment
Отвечает ли это на ваш вопрос? Отформатируйте дату и время с помощью moment.js, чтобы показать часовой пояс   -  person Heretic Monkey    schedule 03.06.2020


Ответы (3)


Ваша строка даты находится в формате ISO с буквой «Z» после секунд, указывающей, что это время UTC. Я предполагаю, что «CDT» помещается в строку, чтобы указать, в какой часовой пояс это должно быть преобразовано. Если у вас есть контроль над представлением этой строки, я рекомендую изменить ее так, чтобы вы указывали желаемый часовой пояс в другом месте и просто сохраняли дату в формате UTC. Таким образом, вы можете инициализировать объект даты или момента с помощью строки ISO следующим образом:

var date = moment("2020-06-01T01:50:57.000Z")

Это неудобно в том виде, в котором оно есть сейчас, поскольку вы не можете инициализировать его таким образом:

var date = moment("2020-06-01T01:50:57.000Z CDT")

Единственная возможность обработки даты в ее текущей форме — ее синтаксический анализ. Вы можете сделать это следующим образом:

var dateTime = "2020-06-01T01:50:57.000Z CDT"
var trimmed = dateTime.trim()  // remove leading and trailing whitespace
var isoString = trimmed.substr(0, trimmed.indexOf(' '))

Что создаст следующую строку

2020-06-01T01:50:57.000Z

Вы можете использовать эту строку, которую я назвал «isoString», для инициализации объекта даты или момента. Следующим препятствием является преобразование этой строки UTC в определенный часовой пояс (в данном случае CDT). Это просто, если вы хотите преобразовать дату UTC в часовой пояс текущего пользователя, поскольку это произойдет автоматически, когда вы инициализируете объект момента или даты строкой даты ISO. В противном случае вам нужен какой-то способ получить часовой пояс из «CDT» в нужный момент формата, который был показан @vjr12 («Америка/Чикаго»). Единственный способ сделать это - либо сохранить это со строкой даты, либо создать сопоставление. Гораздо проще преобразовать «Америка/Чикаго» в «CDT», чем преобразовать «CDT» в «Америка/Чикаго». Ваш единственный вариант с текущей формой - создать собственное сопоставление из "CDT" в "Америка/Чикаго". Вы можете сделать что-то вроде:

let tzMap = new Map()
tzMap.set('CDT','America/Chicago')
// Set the rest of your timezones

Вам нужно будет сделать это для всех часовых поясов, а затем вы можете использовать часовой пояс, проанализированный из вашей строки даты, следующим образом:

var tzAbbr = trimmed.substr(trimmed.indexOf(' ') + 1)

который захватит "CDT" или "CT" в этом отношении. Затем вы можете использовать свое сопоставление следующим образом:

var timezone = tzMap.get(tzAbbr)

часовой пояс в этом случае будет «Америка/Чикаго», а затем вы можете использовать решение @vjr12 отсюда, чтобы получить нужную форму.

Примечание

Я настоятельно рекомендую (если вы можете) изменить текущий формат строки даты, которую вы используете. Цель использования времени UTC состоит в том, чтобы не зависеть от часового пояса, поэтому нет смысла хранить часовой пояс в строке UTC. Если вы хотите сохранить часовой пояс, вам лучше использовать формат, который уже включает часовой пояс.

person Grant Singleton    schedule 03.06.2020

Вы можете zz получить часовой пояс на выходе. Например: moment()..format('h:mm A zz')

Дополнительная документация здесь momentJS

person Ninad    schedule 01.06.2020
comment
мне нужна строка, которую я получаю, с часовым поясом, поэтому после форматирования мне нужно, чтобы она была примерно такой (1:50 CDT) - person user11159070; 01.06.2020

Используйте moment-timezone для достижения этого. Используйте конструктор момента, чтобы указать формат ввода, а затем указать требуемый часовой пояс. Наконец, используйте момент format, чтобы получить требуемый формат.

var dateTime = "2020-06-01T01:50:57.000Z CDT";
var timezone = "America/Chicago";
console.log(
  moment(dateTime, "YYYY-MM-DD hh:mm:ss zz")
.tz(timezone)
.format("h:mm A zz")
);
<script src="https://momentjs.com/downloads/moment.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.23/moment-timezone-with-data-2012-2022.min.js"></script>

person VJR08    schedule 01.06.2020
comment
почему мы должны упоминать .tz()??как мы можем передавать его динамически? Я просто получаю строку2020-06-01T01:50:57.000Z CDT - person user11159070; 01.06.2020
comment
В основном выполняет синтаксический анализ в заданном часовом поясе.momentjs.com/timezone/docs - person VJR08; 01.06.2020
comment
Я согласен с вами, но я получаю только строку, как указано в комментарии выше. - person user11159070; 01.06.2020
comment
Запустите фрагмент , он показывает вывод, иначе проверьте эту песочницу: codesandbox.io/s/compassionate-bas-fg1c2?file=/src/index.js - person VJR08; 01.06.2020
comment
как пройти. tz(Америка/Чикаго) динамически??откуда мы должны получить это - person user11159070; 01.06.2020