我正在做一个带有调查组件的React应用程序。如果用户单击跳过调查按钮,则在n天(或小时)后,调查应再次出现。被拒绝的时间是在UTC格式来自后端时,应用程序正在加载。
我想做一个函数,比较UTC中的拒绝日期和本地日期(用户可以来自世界各地),如果它返回true,则呈现调查组件。
问题是将UTC日期转换为UNIX(毫秒?)与locale日期进行比较。我该怎么做?
const shouldShowSurvey = (rejectedDateUTC, repeatIntervalMs) => {
// rejectedDateMs is a UTC unix time
const rejectedDateMs = new Date(rejectedDateUTC).getTime();
const now = new Date().getTime();
return rejectedDateMs + repeatIntervalMs < now;
};
shouldShowSurvey("2023-05-03T13:02:08.107402", 5000);
2条答案
按热度按时间qojgxg4l1#
您应该添加
Z
作为UTC日期的ISOString的后缀,以便属于正确的UTC格式。这是Phuzi的功劳。
wpcxdonn2#
你可能误解了Javascript Date对象的工作原理。
Date对象本质上是一个 Package 器,其中包含一些关于毫秒UTC整数时间戳的启示,这就是
Date.prototype.getTime
返回给您的内容。总是这样。有没有这样的事情作为一个“本地日期”与。“utc日期”,它们都是 * 所有 * UTC日期,但其中一些方便的方法(例如,
toString
,toLocaleString
)将返回转换为用户本地时区的UTC日期的 * 字符串表示 *,因为本地/字符串表示是 * 用户 * 关心的,而不是 * 程序员 *。唯一的区别(以及你遇到的问题)是走另一条路:即从字符串表示到Date对象。如果你,程序员,不提供一个字符串的时区,它将不得不猜测,并根据字符串的格式,它有时会被解释为一个字符串的本地时间(例如。
new Date('2023-05-02T00:00:00');
),有时被解释为UTC的字符串(例如new Date('2023-05-02');
)。您可以记住所有晦涩难懂的、可能是实现定义的关于日期字符串解析的规则…或者,您可以在解析字符串时提供显式的时区,然后得到的Date对象将明确无误。一旦你正确地解析了它,所有标准的数学比较(比如
>
和<
)都将在Date对象上起作用。