【问题标题】:how to handle timezone in my app when user publishes something当用户发布内容时如何在我的应用程序中处理时区
【发布时间】:2017-03-25 20:01:18
【问题描述】:

我正在制作一个用户可以发布文章的应用。如果日本有人在 2017 年 3 月 25 日 09:00 发表文章,我应该将文章发表的日期和时间设置为该时间还是将其设置为服务器时间?

另外,如果有人在美国进入网站并准备阅读文章,文章应该说它是什么日期发表的?

如果我说 2017 年 3 月 25 日 09:00 对美国的用户来说时间还没有发生,而对他来说将是未来,我应该向世界另一端的人展示什么时间?

【问题讨论】:

  • 保存UTC时区的时间,并根据用户时区与UTC的偏移量显示给用户
  • 您好,我计划在保存到数据库时使用 UTC 时区,但我想知道世界其他地方的人在尚未发布时间时会看到什么?
  • 所以如果它们是 UTC+2 而你是 UTC-5,你会看到时间减去 7 小时(或者我错过了什么?)
  • 谢谢我现在知道了
  • 一个后续问题,如果用户没有登录我的应用程序,并且我在第一次访问时向访问者展示文章列表,我应该向访问者显示我不知道时区的访问者?我不能使用具有提取时区功能的javascript,因为这是他的第一次访问,并且javascript第一次执行并将有关时区的数据发送到服务器将在第二次访问时工作,只要会话持续,然后在会话丢失时出现同样的问题。怎么办?

标签: php laravel timezone usability


【解决方案1】:

在我看来,处理时间的更一致的方法是在内部仅使用UTC time(实际上与 GMT 非常相似,此外,php gmt* 函数实际上使用的是 UTC 时间),例如存储的日期/时间在持久存储(数据库等)中并使用用户时区向每个用户显示时间。

这样,您可以保持年表,简化设计和思考,并始终显示对用户有意义的时间,例如,他/这里时区的时间。

在您的示例中,显示什么时间并不重要,因为您将显示唯一相关的时间,例如,实际创建 UTC 的时间,只是转换为每个用户的时区。 而且不用担心,时间总是流动的,只要时间参考一致,没有人能看到没有发生的事情。如果有人在他的时钟上看到不同的时间并不重要,它仍然可以是同一个时刻。

如果您在哪里与客人打交道,您可以使用地理位置和/或浏览器首选项对正确的时区进行有根据的猜测。您仍然可以在视图中允许时区切换。

这也是一种简化模型的方法,因为使用单一时间参考可以简化对象间基于时间的比较,并降低错误配置的风险(在任何地方进行单一时间设置)。

Carbon 易于与 laravel 一起使用,并且是处理日期/时间的便捷方式。

【讨论】:

  • 谢谢我计划使用 UTC,因为 laravel 已经预先配置好了,我只是对访问博客的用户显示的内容感到困惑,所以你建议我将 UTC 时间显示为发布时间而不是时间例如,在帖子创建者所在的日本,这让我很困惑。即使我显示 UTC 时间,落后于 UTC 时间的人应该看到什么,对他们来说这将是未来的时间,还是我想错了?
  • 不,我建议您只在内部使用 UTC,然后在您看来,显示转换为用户时区的确切时间。这与说纽约早上 6 点和巴黎中午是一样的。这两个发生在同一实际时间,即使时钟没有显示相同的数字。您向用户显示的是时钟,时间是存储在您的数据库中的。在 php 中有一些功能可以做到这一点,例如在另一个时区显示这个时区的时间,所以它很简单。
  • 一个后续问题,如果用户没有登录我的应用程序并且我在访问者第一次访问时向他展示文章列表,我应该向访问者显示我不知道时区的访问者?我不能使用具有提取时区功能的javascript,因为这是他的第一次访问,并且javascript第一次执行并将有关时区的数据发送到服务器将在第二次访问时工作,只要会话持续,然后在会话丢失时出现同样的问题。怎么办?
  • 您可以按照我在回答中提到的做两件事:使用基于 ip 的地理定位和/或浏览器语言检测来猜测要使用的最相关时区,并在您的视图中显示用于生成日期的时区.理想情况下,您可以为未注册用户添加一个按钮,以在猜测不够且对他们很重要的情况下切换时区。浏览器 prop 检测在 javascript 中很容易,geoloc 需要一些 ajax 往返,但可以缓存在 locastorage 或 cookie 中。
  • 感谢您的建议,我找到了一个 jquery 库,如果我将 UTC 时间输出到我的 html 中并将其放在日期标签中,它可以将其转换为本地时间,所以如果用户未登录,我会使用它,对我来说最简单的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
相关资源
最近更新 更多