Pat*_*Mao 46 javascript datetime date date-fns
看起来当我使用该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!!
Run Code Online (Sandbox Code Playgroud)
我试过使用这个包data-fns-tz并使用类似的东西
format(parsedTime, "yyyy-MM-dd kk:mm:ss", {timeZone: "UTC"});
Run Code Online (Sandbox Code Playgroud)
仍然没有运气。
请帮忙!
2019-10-25 08:10:00
2019-10-25 16:10:00
Ben*_*kin 29
你快到了。这对我有用:
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
Run Code Online (Sandbox Code Playgroud)
date-fns[-tz] 库坚持不携带 TZ info的内置Date数据类型。
有些函数将其视为一个时刻,但有些函数更喜欢将其视为日历组件的结构——2019 年,...,第 25 天,08 小时,....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()——我相信是一个安全的食谱。
She*_*n F 22
注意
以下解决方案不适用于所有时区,因此如果时区准确性对您的应用程序至关重要,您可能需要尝试类似 Beni 的答案。查看此链接了解更多信息
我今天遇到了完全相同的问题,并做了一些研究,看看自从提出这个问题后是否有人提出了更好的方法。我遇到了这个适合我的需求和风格偏好的解决方案:
import { format, addMinutes } from 'date-fns';
function formatDate(date) {
return format(addMinutes(date, date.getTimezoneOffset()), 'yyyy-MM-dd HH:mm:ss');
}
Run Code Online (Sandbox Code Playgroud)
getTimezoneOffset返回将该日期转换为 UTC 所需的分钟数。在 PST(-0800 小时)中,它会返回 480,而对于 CST(+0800 小时)的人,它会返回 -480。
小智 15
我建议使用内置的Dateutil:
const date = new Date("2019-10-25T08:10:00Z");
const isoDate = date.toISOString();
console.log(`${isoDate.substr(0, 10)} ${isoDate.substr(11, 8)}`);
Run Code Online (Sandbox Code Playgroud)
输出:
2019-10-25 08:10:00
不是任何格式的通用解决方案,但不需要外部库。
Lok*_*kii 10
我使用 date/fns 和本机日期方法做了类似的事情
import format from 'date-fns/format';
import parseISO from 'date-fns/parseISO';
export const adjustForUTCOffset = date => {
return new Date(
date.getUTCFullYear(),
date.getUTCMonth(),
date.getUTCDate(),
date.getUTCHours(),
date.getUTCMinutes(),
date.getUTCSeconds(),
);
};
const formatDate = (dateString) = > {
const date = parseISO(dateString);
const dateWithOffset = adjustForUTCOffset(date)
return format(dateWithOffset, 'LLL dd, yyyy HH:mm')
}Run Code Online (Sandbox Code Playgroud)
我有同样的问题。我所做的是从 ISO 字符串中删除时区,然后将该时间与 date-fns 一起使用:
let time = "2019-10-25T08:10:00Z".slice(0, -1)
上面是一个没有时区的时间,因为没有时区 date-fns 假设本地时区,所以当你这样做时:
format(parseISO(time), 'h:mm a')
你会得到:8:10 AM,或者你喜欢的任何格式。你只需要小心你正在切片的字符串。如果它总是相同的格式,那么它应该可以工作。
| 归档时间: |
|
| 查看次数: |
38988 次 |
| 最近记录: |