javascript - 日期-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
解决方案
你快到了。这对我有用:
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()
——我相信一个安全的食谱。
推荐阅读
- javascript - 在我让 Puppeteer 截取页面截图之前,有没有办法让 Puppeteer 执行页面操作(比如扩展维基百科条目)?
- aws-lambda - 部署到 AWS Lambda 时,Python 库文件不在文件夹内
- azure-logic-apps - 如何正确地将 JSON 数据提取/转换为对象?
- javascript - 使用 typeof 检查时,赋值的变量仍然未定义
- c# - 如何将当前日期插入到当前选定位置的richtextbox?
- javascript - 当两个 div 重叠时 - 第一个的颜色应该改变
- spring-websocket - Spring WebSocket ConvertAndSendToUser 不工作但 convertAndSend 工作
- for-loop - 这个 FOR 循环的时间和空间复杂度是多少?
- html - 如何将完成的网站发送给我的客户?
- python - Python:基于同一组的多个条目进入不同的列