【问题标题】:momentjs display in timezonemomentjs 在时区显示
【发布时间】:2020-04-08 17:01:22
【问题描述】:

我很绝望。我在德国。

我从 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

提前谢谢你!

【问题讨论】:

    标签: javascript momentjs moment-timezone sheetjs


    【解决方案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'));
    

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

    【讨论】:

    • 这是js日期的控制台日志:Wed Mar 04 2020 23:00:00 GMT+0100。不幸的是,您的 tz 解决方案不起作用。
    • 我猜输入日期是错误的。但这是我必须影响的出口......
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      我还会指出另一种处理方式,根本不需要 Moment。

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

      【讨论】:

        猜你喜欢
        • 2019-05-20
        • 2023-03-27
        • 1970-01-01
        • 2019-02-23
        • 1970-01-01
        • 2016-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多