【问题标题】:js string to datetime add 2 hoursjs字符串到日期时间加2小时
【发布时间】:2021-09-27 11:22:14
【问题描述】:

我正在使用 PHP Api 女巫给我这个 json:

{
"title": "hemen",
"category": "time",
"start": "2021-09-27T09:22:00+00:00",
"end": "2021-09-27T13:22:00+00:00",
"isAllDay": false,
"calendar": [{"id": 1}],
"body": null
}

问题在于,在我的前端 (Vue) 中,我将开始日期和结束日期转换为日期时间,但它增加了 2 小时,我不知道为什么或修复它的最佳选择。

axios.get('/api/schedules.json').then(function (response) {
    let dataOri = response.data;
    
    // convert
    dataOri.forEach(element => {
        element.start = moment(element.start, "YYYY-MM-DDTHH:mm:ssZ").format("YYYY-MM-DD HH:mm:ss");
        console.log(element.start); // prints '2021-09-27 11:22:00' instead of '2021-09-27 09:22:00'

        element.end = moment(element.end, "YYYY-MM-DDTHH:mm:ssZ").format("YYYY-MM-DD HH:mm:ss");
        console.log(element.end); // prints '2021-09-27 15:22:00' instead of '2021-09-27 13:22:00'
    });
    self.filterSchedules = dataOri;
});

【问题讨论】:

  • 这很可能是因为时区。如果您查看YYYY-MM-DDTHH:mm:ssZ 的格式,您将在最后添加“Z”。这指定时间为 UTC,例如 mentioned here,并且您将其格式化为本地(不带“Z”)。
  • @Tatranskymedved — 初始时间 UTC。解析格式中的“Z”标记表示“偏移为 +HH:mm”,并不表示 UTC(参见 moment.js display section)。偏移量是 +00:00,实际上是 UTC。
  • 啊,对不起,你是对的,我说错了。无法编辑评论,将更新答案以反映这一点。

标签: javascript datetime momentjs


【解决方案1】:

您正在使用“原始时间在指定时区内”(+00:00)的信息解析时间,然后以当地时间打印。

有两种方法可以处理这种情况,您可以:

  • 完全忽略这些时区(不好的方法)
  • 包含/解析此时区信息并以原始 UTC 时间 输出(好方法)

var dateAsStr = "2021-09-27T09:22:00+00:00";

var resultWrong = moment(dateAsStr, "YYYY-MM-DDTHH:mm:ssZ").format("YYYY-MM-DD HH:mm:ss");
var resultBadApproach = moment(dateAsStr, "YYYY-MM-DDTHH:mm:ss").format("YYYY-MM-DD HH:mm:ss");
var resultGoodAproach = moment(dateAsStr, "YYYY-MM-DDTHH:mm:ssZ").utc().format("YYYY-MM-DD HH:mm:ss");

console.log("wrong: " + resultWrong);
console.log("correct (bad approach): " + resultBadApproach);
console.log("correct (good approach): " + resultGoodAproach);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

【讨论】:

  • woooooooo 令人兴奋!问题是我添加了 Z.... grgrggrggrgr
  • 但是如果你知道源日期是 UTC 的话,把它放在那里真的很有用。如果有人从英国和中国打开您的网页,您可以正确显示他们的当地时间,直到他们所在的地区。这取决于使用情况。
  • 不! “2021-09-27T09:22:00+00:00”实际上是UTC,它应该用偏移量来解析!如果 OP 想要查看相同的日期和时间,那么也将其格式化为 UTC。
  • @RobG 感谢您的评论!我已经更新了答案,请随时编辑/建议更好的描述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多