如何用date-fns校正时区?

问题描述

(在线查看此示例:https://stackblitz.com/edit/date-fns-playground-zeitzonen?file=index.ts->控制台输出

以下情况是上午11:54:

// Setup
const dateString = "2020-08-30T11:54:48.200Z";    // <---- 11:54 AM
const tz = "Europe/Berlin";
const dateFormat = "d. MMM yyyy,E HH:mm";
const dateOptions = { locale: de }; 

据我格式化日期,它会更改其时区并增加2个小时:

const parsedDate = parseISO(dateString);

const formattedDate = format(parsedDate,dateFormat,dateOptions);
// outputs: 30. Aug 2020,So. 13:54

const zonedDate = utcToZonedTime(dateString,tz);
// outputs: 2020-08-30T11:54:48.200Z

const formattedZonedDate =  format(zonedDate,So. 13:54

所需的(正确的)输出30. Aug 2020,So. 11:54

我的错误在哪里?最初的dateString是否具有正确的时区?

解决方法

初始dateString是否具有正确的时区?

不是,如果您希望它在柏林时间,不。末尾的“ Z”表示“ UTC”-您的字符串代表11:54 UTC,实际上在柏林为13:54。格式化在我看来是对的。

坦白说,utcToZonedDateTime为何仍在报告UTC值而不是分区版本,对我来说还不是很清楚。

如果您希望dateString代表当地时间,则应该为“ 2020-08-30T11:54:48.200”。另一方面,如果您希望它代表柏林的11:54是 的UTC时间,则应该是“ 2020-08-30T09:54:48.200Z”-注意更改小时到09。