首页 > 解决方案 > 日期-fns | 如何格式化为 UTC

问题描述

问题

看起来当我使用该format()功能时,它会自动将原始 UTC 时间转换为我的时区(UTC+8)。我一直在研究他们的文档几个小时,似乎找不到将其默认为 UTC 时间的方法。

import { parseISO, format } from "date-fns";

const time = "2019-10-25T08:10:00Z";

const parsedTime = parseISO(time);
console.log(parsedTime); // 2019-10-25T08:10:00.000Z

const formattedTime = format(parsedTime, "yyyy-MM-dd kk:mm:ss");
console.log(formattedTime); // 2019-10-25 16:10:00 <-- 8 HOURS OFF!!

我试图使用这个包data-fns-tz并使用类似的东西

format(parsedTime, "yyyy-MM-dd kk:mm:ss", {timeZone: "UTC"});

仍然没有运气。

请帮忙!

预期产出

2019-10-25 08:10:00

实际输出

2019-10-25 16:10:00

标签: javascriptdatedatetimedate-fns

解决方案


你快到了。这对我有用:

import { parseISO } from "date-fns";
import { format, utcToZonedTime } from "date-fns-tz";

const time = "2019-10-25T08:10:00Z";

const parsedTime = parseISO(time);
console.log(parsedTime); // 2019-10-25T08:10:00.000Z

const formatInTimeZone = (date, fmt, tz) =>
  format(utcToZonedTime(date, tz), 
         fmt, 
         { timeZone: tz });

const formattedTime = formatInTimeZone(parsedTime, "yyyy-MM-dd kk:mm:ss xxx", "UTC");
console.log(formattedTime); // 2019-10-25 08:10:00 +00:00

在幕后

date-fns[-tz] 库坚持不携带 TZ info的内置Date数据类型。 有些函数将其视为一个时刻,但有些函数则将其视为日历组件的结构——2019 年,...,第 25 天,第 8 小时,...。
format

现在的麻烦是在Date内部只是一个瞬间。它的方法在本地时区提供到/来自日历组件的映射。

因此,为了表示不同的时区,date-fns-tz/utcToZonedTime临时生成Date代表错误时刻的实例——只是为了让它在本地时间的日历组件成为我们想要的!

并且该date-fns-tz/format函数的 timeZone 输入XX..X影响打印时区 ( , xx..x, zz..z, )的模板字符OO..O

请参阅https://github.com/marnusw/date-fns-tz/issues/36以了解有关这种“转移”技术(以及激发它们的实际用例)的一些讨论......
这有点低级和风险,但我在上面编写它们的具体方式formatInTimeZone()——我相信一个安全的食谱。


推荐阅读