0

生无可恋。我位于德国。

我从 Sheetjs 得到一个 Date 对象。在 Excel 中,我看到一个日期,例如 2020 年 3 月 5 日。我只需要一个像 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()但我就是不明白。

我发现的一个解决方案(但我认为是 hack)是添加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

先感谢您!

4

3 回答 3

1

您的原始数据是中欧标准时间吗?假设您安装了时刻时区:

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

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

或者用数据所在的原始时区替换“CET”。我认为发生的事情是日期没有用正确的时区初始化,这导致了转换问题。

如果这不起作用,您可以发布原始变量“maximalesBelegdatumJS”的 ISO 字符串吗?也许有一个问题不是时刻。

有趣的是,由于某种原因,原始日期时间在 UTC 中初始化,然后将 tz 属性更改为 CET 而不实际转换日期时间。我从未使用过 SheetJs,但那里发生了一些事情。

您已经用 utcOffset() 暗示了答案:

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

这将是一个更简单的版本。

于 2020-04-08T17:50:38.040 回答
0

我找到的唯一解决方案是:

var solution = moment(maximalesBelegdatumJS);
solution.add(solution.utcOffset(), "minute")
console.log(solution);
于 2020-04-09T09:59:58.427 回答
0

问题是 SheetJS 构造的日期将输入视为 UTC,但您是根据本地时间等价物创建字符串。

生成字符串时,您可以简单地将其保留为 UTC:

moment.utc(maximalesBelegdatumJS).format('YYYY-MM-DD')
  • moment.utc(dateObject)Moment从与对象相同的时间戳创建一个Date,并将 Moment 对象设置为 UTC 模式。
  • .format('YYYY-MM-DD')以您要求的格式创建字符串输出。

我还会指出另一种你可以处理这个问题的方法,它根本不需要 Moment。

maximalesBelegdatumJS.toISOString().substring(0, 10)
  • .toISOString()以 UTC 格式创建 ISO 8601 日期和时间字符串 - 与Date创建对象的方式相匹配。
  • .substring(0, 10)YYYY-MM-DD以格式为您提供日期部分。
于 2020-04-09T18:42:12.833 回答