问题
看起来当我使用 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
最佳答案
你快到了。这对我有用:
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] 库坚持内置的 Date
数据类型 carries no TZ info .
有些函数将其视为一个时刻,但有些函数(例如 format
)将其更像是日历组件的结构 — 2019 年,...,第 25 天,第 08 小时,...
现在的麻烦是 Date
在内部只是一个时刻。它的方法提供了到/从本地时区中的日历组件的映射。
因此,为了表示不同的时区,date-fns-tz/utcToZonedTime
临时生成 Date
实例,表示错误的时间 — 只是为了让它的本地时间日历组件成为我们想要的!
date-fns-tz/format
函数的时区输入仅影响打印时区的模板字符 (XX..X
, xx..x
, zz..z
, OO..O
).
参见 https://github.com/marnusw/date-fns-tz/issues/36对于这种“转移”技术(以及激发他们的实际用例)的一些讨论......
这有点低级且有风险,但我在上面组合它们的具体方式 — formatInTimeZone()
— 我相信是一个安全的方法。
关于javascript - 日期-fns |如何格式化为 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58561169/