日期-fns |如何格式化为 UTC
date-fns | How do I format to 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
我建议使用内置的 Date
util:
const date = new Date("2019-10-25T08:10:00Z");
const isoDate = date.toISOString();
console.log(`${isoDate.substr(0, 10)} ${isoDate.substr(11, 8)}`);
输出:
2019-10-25 08:10:00
不是任何格式的通用解决方案,但不需要外部库。
我遇到了同样的问题。我所做的是从 ISO 字符串中删除时区,然后将该时间与 date-fns:
一起使用
let time = "2019-10-25T08:10:00Z".slice(0, -1)
以上是没有时区的时间,因为没有时区,date-fns 假定为本地时区,所以当你这样做时:
format(parseISO(time), 'h:mm a')
您将获得:8:10 AM,或您喜欢的任何格式。你只需要小心你正在切片的字符串。如果它总是相同的格式那么它应该工作。
备注
以下解决方案不适用于所有时区,因此如果时区准确性对您的应用程序至关重要,您可能想尝试类似 Beni 的答案。请参阅此 link 了解更多信息
我今天有完全相同的问题,并做了一些研究,看看自提出这个问题以来是否有人想出了更好的办法。我遇到了 this 符合我的需求和风格偏好的解决方案:
import { format, addMinutes } from 'date-fns';
function formatDate(date) {
return format(addMinutes(date, date.getTimezoneOffset()), 'yyyy-MM-dd HH:mm:ss');
}
说明
getTimezoneOffset
returns 将该日期转换为 UTC 所需的分钟数。在太平洋标准时间(-0800 小时)它会 return 480 而对于 CST(+0800 小时)的人来说它会 return -480.
你快到了。这对我有用:
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] 库坚持 built-in Date
数据类型 carries no TZ info.
有些函数将其视为 moment-in-time,但有些函数将其视为 format
更像是日历组件的结构 — 2019 年,...,第 25 天,第 08 小时,....
现在的麻烦是 Date
在内部只是暂时的。它的方法在本地时区.
中提供映射to/from日历组件
因此,为了表示不同的时区,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 了解有关此“转换”技术(以及激发他们的实际用例)的一些讨论...
这有点 low-level 和风险,但我在上面组合它们的具体方式 — formatInTimeZone()
— 我相信这是一个安全的方法。
尝试
const formatDate = new Date().toISOString().substr(0, 19).replace('T', ' ');
我使用 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')
}
这是我的做法
const now = new Date()
const date = format(
new Date(now.toISOString().slice(0, -1)),
'yyyy-MM-dd HH:mm:ss'
)
我刚刚从 ISO 字符串中删除了 Z。我不确定它是否解决了这个 issue 不过
我猜
在解析之前将日期构造为 UTC 会有所帮助。
import { parseISO, format } from "date-fns";
const time = "2019-10-25T08:10:00Z";
const parsedTime = parseISO(new Date(Date.UTC(time)));
const formattedTime = format(parsedTime, "yyyy-MM-dd kk:mm:ss");
像这样。
问题
貌似当我使用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
我建议使用内置的 Date
util:
const date = new Date("2019-10-25T08:10:00Z");
const isoDate = date.toISOString();
console.log(`${isoDate.substr(0, 10)} ${isoDate.substr(11, 8)}`);
输出:
2019-10-25 08:10:00
不是任何格式的通用解决方案,但不需要外部库。
我遇到了同样的问题。我所做的是从 ISO 字符串中删除时区,然后将该时间与 date-fns:
一起使用let time = "2019-10-25T08:10:00Z".slice(0, -1)
以上是没有时区的时间,因为没有时区,date-fns 假定为本地时区,所以当你这样做时:
format(parseISO(time), 'h:mm a')
您将获得:8:10 AM,或您喜欢的任何格式。你只需要小心你正在切片的字符串。如果它总是相同的格式那么它应该工作。
备注
以下解决方案不适用于所有时区,因此如果时区准确性对您的应用程序至关重要,您可能想尝试类似 Beni 的答案。请参阅此 link 了解更多信息
我今天有完全相同的问题,并做了一些研究,看看自提出这个问题以来是否有人想出了更好的办法。我遇到了 this 符合我的需求和风格偏好的解决方案:
import { format, addMinutes } from 'date-fns';
function formatDate(date) {
return format(addMinutes(date, date.getTimezoneOffset()), 'yyyy-MM-dd HH:mm:ss');
}
说明
getTimezoneOffset
returns 将该日期转换为 UTC 所需的分钟数。在太平洋标准时间(-0800 小时)它会 return 480 而对于 CST(+0800 小时)的人来说它会 return -480.
你快到了。这对我有用:
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] 库坚持 built-in Date
数据类型 carries no TZ info.
有些函数将其视为 moment-in-time,但有些函数将其视为 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 了解有关此“转换”技术(以及激发他们的实际用例)的一些讨论...
这有点 low-level 和风险,但我在上面组合它们的具体方式 — formatInTimeZone()
— 我相信这是一个安全的方法。
尝试
const formatDate = new Date().toISOString().substr(0, 19).replace('T', ' ');
我使用 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')
}
这是我的做法
const now = new Date()
const date = format(
new Date(now.toISOString().slice(0, -1)),
'yyyy-MM-dd HH:mm:ss'
)
我刚刚从 ISO 字符串中删除了 Z。我不确定它是否解决了这个 issue 不过
我猜
在解析之前将日期构造为 UTC 会有所帮助。
import { parseISO, format } from "date-fns";
const time = "2019-10-25T08:10:00Z";
const parsedTime = parseISO(new Date(Date.UTC(time)));
const formattedTime = format(parsedTime, "yyyy-MM-dd kk:mm:ss");
像这样。