Ваша строка даты находится в формате 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