Javascript: нужна помощь в переводе из Америки по центральному времени (без перехода на летнее время) в Америку / New_York с переходом на летнее время - PullRequest
2 голосов
/ 03 октября 2019

Я получаю метку времени от своего поставщика, который находится в Центральном времени Америки, но без перехода на летнее время. Мне нужно преобразовать это в America / New_York с помощью DST (когда это применимо).

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

Ниже приведены три из множества подходов, которые я пробовал.

Фрагмент кода:

console.log(sendTimeString);
let d = moment(sendTimeString, "MM/DD/YYYY h:mm:ss A"); 
console.log("formatted " + d.clone().tz("America/New_York").format('MM/DD/YYYY h:mm:ss A'));

Производит:

6/12/2019 6:35:36

отформатировано 12.06.2009 6:35:36

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

Фрагмент кода:

console.log(sendTimeString);
let d = moment(sendTimeString, "MM/DD/YYYY h:mm:ss A");
console.log("formatted " + d.clone().utcOffset(-2).format('MM/DD/YYYY h:mm:ss A'));

Производит:

6/12/2019 6:35:36 AM

отформатировано 12/12/2019 8: 35: 36 AM

Мне кажется, способ сделать это - установить время в UTC с жестко заданным смещением, -6. Тогда я бы остановился на часовом поясе Америка / Нью-Йорк, и все было бы идеально. Но ясно, что я не устанавливаю это правильно:

Фрагмент кода:

console.log(sendTimeString);
let d = moment(sendTimeString, "MM/DD/YYYY h:mm:ss A").utcOffset(-6);
console.log("formatted " + d.clone().tz("America/New_York").format('MM/DD/YYYY h:mm:ss A'));

Производит:

6/12/2019 6:35:36 AM

отформатировано 12.06.2009 6:35:36

1 Ответ

0 голосов
/ 03 октября 2019

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

// Take the input from the client, specify the format and their timezone
const input = moment.tz('6/12/2019 6:35:36 AM', 'MM/DD/YYYY h:mm:ss A', 'US/Central')

console.log(input.tz())
console.log(input.format('MM/DD/YYYY h:mm:ss A'))

// Convert to your timezone
const output = input.clone().tz('America/New_York')

console.log(output.tz())
console.log(output.format('MM/DD/YYYY h:mm:ss A'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.26/moment-timezone-with-data.min.js"></script>

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

...