Используйте момент. js, чтобы изменить часовой пояс на отметке даты и времени, не меняя время - PullRequest
3 голосов
/ 23 февраля 2020

Я переносу данные о событиях из старой базы данных SQL в новую базу данных Mon go, используя NodeJS. Однако, кто бы ни настраивал базу данных SQL, создал все даты для событий, сделал время в PST / PDT, но база данных полагает, что они в UT C время.

Например: дата из базы данных SQL может быть: 23-APR-10, который Момент JS показывает как: 2010-04-23T21:00:00Z, когда 21:00:00 - время PST.

Is можно использовать чистый JavaScript / MomentJS / NodeJS или другой модуль npm для изменения часового пояса в строке DateTime без изменения времени (т. е. 2010-04-23T21:00:00Z станет 2010-04-23T21:00:00-8:00)?

PS , Хотя база данных SQL показывает только DD-MMM-YY, но возвращает строку DateTime, когда я ее запрашиваю.

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Следуя строке запроса в комментариях к вопросу, кажется, что ваша проблема заключается в том, что из-за смещения часового пояса временные метки, сохраненные в БД, сохраняются без смещения часового пояса, и так как ваш желаемый часовой пояс PST (UT C -8 часов), временные метки на 8 часов вперед, например, то, что должно было быть 2010-04-23T13:00:00Z, стало 2010-04-23T21:00:00Z.

Так что здесь нужно сделать, это смещение ut c для вашего Нужный часовой пояс необходимо получить и добавить к дате.

Смещение в вашем случае известно (-8 часов). Однако мы можем получить правильное смещение любого желаемого часового пояса из библиотеки moment-timezone.

const moment_timezone = require('moment-timezone');

//a sample timestamp you're getting from your db
const myDateObj = new Date("2010-04-23T21:00:00Z");

//timezone for PST as understood by moment-timezone
const myMomentTimezone = "America/Los_Angeles";

//offset for your timezone in milliseconds
const myTimezoneOffset = moment_timezone.tz(myMomentTimezone).utcOffset()*60000;

//perfom the correction
const getCorrectedDateObj = (givenDateObj) => new Date(givenDateObj.valueOf() + myTimezoneOffset);

console.log(getCorrectedDateObj(myDateObj));

Вы можете заметить, что мы на самом деле меняем отметку времени, поскольку данная отметка времени и требуемые временные метки, в силу природы ошибки, по существу отличаются временных меток. Момент-часовой пояс используется здесь только для получения смещения, он не используется для «преобразования» чего-либо.

0 голосов
/ 23 февраля 2020

Однако ответ Анудж Панчоли верен; старая база данных SQL, которую я использую, кажется, имеет много причуд, поэтому мне пришлось изменить его ответ, чтобы заставить мой код работать.

Мое решение:

function getCorrectedDateObj(myDateObj){
  const timezoneOffset = momentTimeZone.tz(timezone).utcOffset() * 60000;
  const dt = new Date(myDateObj.valueOf() + timezoneOffset / 2);
  dt.setHours(dt.getHours() + 12);
}
...