момент js отображение в часовом поясе - PullRequest
0 голосов
/ 08 апреля 2020

Я в отчаянии. Я нахожусь в Германии.

Я получаю объект Date из листа js. В Excel я вижу дату как 05. март 2020. Мне просто нужна строка как 2020-03-05.

Эта дата дает мне:

console.log(maximalesBelegdatumJS);
console.log(moment(maximalesBelegdatumJS));
console.log(moment(maximalesBelegdatumJS).format('YYYY-MM-DD'));

Вывод:

Wed Mar 04 2020 23:00:00 GMT+0100 (Mitteleuropäische Normalzeit)
Moment {_isAMomentObject: true, _i: Wed Mar 04 2020 23:00:00 GMT+0100 (Mitteleuropäische Normalzeit), _isUTC: true, _offset: -0, _pf: {…}, …}_isAMomentObject: true_i: Wed Mar 04 2020 23:00:00 GMT+0100 (Mitteleuropäische Normalzeit) {}_isUTC: true_offset: -0_pf: {empty: false, unusedTokens: Array(0), unusedInput: Array(0), overflow: -2, charsLeftOver: 0, …}_locale: Locale {_calendar: {…}, _longDateFormat: {…}, _invalidDate: "Invalid date", _ordinal: "%d.", _dayOfMonthOrdinalParse: /\d{1,2}\./, …}_z: Zone {name: "UTC", abbrs: Array(1), untils: Array(1), offsets: Array(1), population: 0}_d: Wed Mar 04 2020 23:00:00 GMT+0100 (Mitteleuropäische Normalzeit) {}_isValid: true__proto__: Object
2020-03-04

Я перепробовал множество модификаторов, таких как .utc(), .local(), но я просто не понимаю.

Одно решение, которое я нашел (но Я думаю, что это хак ) это добавить utcOffset:

console.log(moment(maximalesBelegdatumJS).add(moment(maximalesBelegdatumJS).utcOffset(), "minute"));

, дающий

Moment
_isAMomentObject: true
_i: Wed Mar 04 2020 23:00:00 GMT+0100 (Mitteleuropäische Normalzeit) {}
_isUTC: false
_pf: {empty: false, unusedTokens: Array(0), unusedInput: Array(0), overflow: -2, charsLeftOver: 0, …}
_locale: Locale {_calendar: {…}, _longDateFormat: {…}, _invalidDate: "Invalid date", _ordinal: "%d.", _dayOfMonthOrdinalParse: /\d{1,2}\./, …}
_d: Thu Mar 05 2020 00:00:00 GMT+0100 (Mitteleuropäische Normalzeit) {}
_isValid: true

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Ваши исходные данные соответствуют центральноевропейскому стандартному времени? Предполагая, что у вас установлен момент-часовой пояс:

https://momentjs.com/timezone/docs/.

console.log(moment.tz(maximalesBelegdatumJS, 'CET').format('YYYY-MM-DD'));

Или замените 'CET' на исходный часовой пояс, в котором находятся данные. Я думаю, что Происходило то, что даты не были инициализированы с правильным часовым поясом, и это вызывает проблемы с конвертацией.

Если это не работает, вы можете опубликовать строку ISO исходной переменной "maximalesBelegdatum JS"? Может быть, есть проблема не с моментом.

Интересно, по какой-то причине исходное время даты инициализируется в UT C, затем атрибут tz изменяется на CET без фактического преобразования даты и времени. Я никогда не использовал Sheet Js, но там что-то происходит.

Вы уже ссылались на ответ с помощью utcOffset ():

console.log(moment(maximalesBelegdatumJS).utcOffset(2).format('YYYY-MM-DD'));

Это будет более простая версия.

0 голосов
/ 09 апреля 2020

Проблема в том, что дата, построенная на листе JS, обрабатывает ввод как UT C, но вы создавали свои строки на основе эквивалента по местному времени.

Вы можете просто сохранить его в UT C при генерации строки:

moment.utc(maximalesBelegdatumJS).format('YYYY-MM-DD')
  • moment.utc(dateObject) создает Moment из той же временной метки, что и Date object и устанавливает объект Moment в режим UT C.
  • .format('YYYY-MM-DD') создает вывод строки в требуемом формате.

Я также укажу на другой как вы могли бы справиться с этим, который вообще не требует Момента.

maximalesBelegdatumJS.toISOString().substring(0, 10)
  • .toISOString() создает строку даты и времени ISO 8601 в UT C - что соответствует пути Date объект был создан.
  • .substring(0, 10) дает вам только часть даты в формате YYYY-MM-DD.
0 голосов
/ 09 апреля 2020

Единственное решение, которое я нашел, это:

var solution = moment(maximalesBelegdatumJS);
solution.add(solution.utcOffset(), "minute")
console.log(solution);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...