【问题标题】:moment().fromNow() depends on user's PC timemoment().fromNow() 取决于用户的 PC 时间
【发布时间】:2020-01-31 23:32:40
【问题描述】:

我在使用用户时区的时刻 js 中的 fromNow 函数存在问题。

只有在用户 PC 上的时钟设置绝对正确时才能正常工作。

例如,如果我将时钟设置为距实际时间 -15 分钟并在网站上发布新评论,它将显示“15 分钟内发布的评论”而不是“几秒钟前发布的评论”。

我试过了

moment(dateInUTCFromServer).local().fromNow() // in 15 minutes.

moment.utc(dateInUTCFromServer).fromNow() // in 15 minutes.

它们现在可以正常工作。 dateInUTCFromServer 是数据库中的常规时间戳日期对象。我想以“从现在开始”的格式向用户显示此日期。 console.log(dateInUTCFromServer) // 2020-01-29 12:25:48

在很多情况下,即使我尝试在我的 PC 上设置正确的时间,它也会给我 “在一秒钟内” 而不是 “几秒钟前”。 在某些情况下,这些问题可能很关键。例如,显示截止日期。

是否可以使用“从现在开始”格式忽略用户的 PC 时间设置?

【问题讨论】:

  • 具体是什么nowFromServer。它是一个字符串吗?一个号码? Date 对象?别的东西?还请显示您实际使用的示例值。谢谢。
  • 顺便说一句,您不能保证用户的时钟准确度,但时区通常不应考虑到此类比较。
  • 亲爱的@MattJohnson-Pint,我刚刚更新了我的问题。 nowFromServer(更改为 dateInUTCFromServer)是数据库中 UTC 格式的时间戳日期对象(2020-01-29 12:25:48)。我想将此数据显示为“...分钟前”给用户。

标签: javascript momentjs


【解决方案1】:

既然你说你的日期是 UTC 和 ISO 格式,但不包括 Z 或其他偏移量指示符,那么正确的代码是你的第二个例子:

moment.utc(dateInUTCFromServer).fromNow()

最终用户 PC 上的时钟不是您可以控制的,但假设最终用户正在同步时间通常是可以接受的。尤其是在使用第三方身份验证(例如 Google 或 Facebook 登录)和/或使用 SSL 证书的应用程序中 - 两者都需要准确的时间戳验证。

如果您发现忽略客户端上的时间很重要,那么您需要将服务器的当前时间传递给您的应用程序。

moment.utc(dateInUTCFromServer).from(currentTimeInUTCFromServer)

或者,如果您的后端是 Node.js,您可以只在服务器上运行原始代码并将字符串结果传递给客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多