如何在我的webapp中显示正确的创建和修改时间?

时间:2010-02-02 23:30:30

标签: ruby-on-rails ruby web-applications timezone

我正在开发一个类似博客的Rails应用程序。用户创建条目。我正在尝试解决如何处理时间存储和显示问题。我已阅读有关Rails时区支持的this writeup

这很棒,但它不包括我的应用程序需要做的事情。它仅查看您要将存储时间转换为当前登录用户时区的情况。相反,我想要的效果是......

  • 用户于上午10点在加利福尼亚州创建一个条目

  • 几年后,他搬到纽约,然后在某个时候看着他的旧条目。 “创建”日期应该说“上午10点”。他不关心时区。他只是想知道他在写这篇文章时的感觉是什么时候。

  • 如果他然后编辑纽约的条目,显示的“修改”日期再次是他进行编辑时的主观时间。 (我们假设他去了“偏好”并在他搬家时改变了他的时区设置。)

  • 此外,为了彻底起见,应用程序应该能够在创建或更新条目时报告“实际”绝对时间。

(注意 - 我的想象用户是一个男人,但对于女性来说,它的工作方式大致相同。)

我正在考虑实施它的方式是......

  • 除了标准User#time_zoneEntry#created_at_utc之外,还有Entry#updated_at_utccreated_atupdated_at属性。

  • 用户在注册时从菜单中选择他们的时区。 (如果他们愿意,他们可以在以后更改。)

  • 该应用使用User#time_zonecreated_atupdated_at存储在用户的主观本地时间中。如果是上午10点,那么该应用会写上“上午10点”。到DB。

  • 该应用还会将当前UTC时间保存在上述_utc字段中,以处理上述最后一项要求。

这是一个很好的方法吗?还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您可以采取的两条道路是:

  1. 在用户帐户以及每个帖子中存储时区(UTC) - 每当用户更改帖子时(如果他或她更改了时区),都会更新帖子的时区以及updated_at字段。
  2. 仅将时区存储在用户帐户中。当用户更改时区时,更新属于该用户的每个帖子并添加/减去created_at / updated_at日期。
  3. 第一个选项似乎是最干净的选择。为此,您只需在帖子记录中创建一个新方法:

    def locational_updated_at
      updated_at + timezone.seconds
    end
    

    其中timezone是一个整数,包含自UTC以来的秒数。

答案 1 :(得分:1)

如果可以,您应该避免存储两组不同的时间戳,并且应该避免存储任何非UTC日期。这两件事都会导致混乱。我不完全确定我理解你在做什么(虽然我喜欢你对主观时间的看法),但仅仅为每个帖子附上一个时区并且总是使用该区域显示时间是不够的?它将默认为作者帐户中设置的时区,因此他可以在跨国移动时更改它,而不会影响以前的帖子。

我认为这就是你所需要的 - 为每个帖子附上一个时区。那够了吗?或者我错过了一部分内容?