处理存储时区?(Handling timezones in storage?)

2019-06-27 02:07发布

存储在GMT一切吗?

存储一切它与嵌入式偏移进入的方式吗?

做数学每次你呈现?

显示相对时报“1分钟前”?

Answer 1:

你必须在UTC存储 - 如果你不这样做,在东西像夏令去...有趣的历史报告和行为。 格林尼治标准时间是本地时间,受相对于UTC夏令时(这是不是)。

呈现在不同的时区的用户可以是一个真正的混蛋,如果你存储本地时间。 这很容易适应当地的,如果你的原始数据是UTC - 只需添加你的用户的偏移,你就大功告成了!

乔尔在播客的人谈论这个(以迂回的方式) -他说要存储你的数据在尽可能高的分辨率 (搜索“保真”),因为当它再次熄灭你可以随时Munge时间了。 这就是为什么我说它存储为UTC,本地时间,你需要调整的人谁在时区不是,这是一个许多艰苦的工作。 而你需要存储是否,例如,夏令时有效,你存储的时间。 育。

通常,在过去的数据库,我储存了两个 - UTC的分类,本地时间显示。 这样,无论是用户还是电脑感到困惑。

现在,以显示:当然,你可以做到“3分钟前”的事情,但是只有当你存储UTC - 否则,在不同的时区中输入的数据会做这样的事情显示为“-4个小时前”,这将吓唬人的。 如果你要显示的实际时间,人们都喜欢有它在当地的时间 - 如果在多个时区所输入的数据的,你只能做到这一点很容易,如果你存储UTC。



Answer 2:

答案一如既往,是“依赖”。

这要看你用的时间来描述什么,以及如何将数据给你提供了依据。 关键要决定如何来存储时间值,如果你是下降的时区,以及并不奇怪你的用户信息丢失的决定。

有在一个UTC time_t的数据存储一定的好处 - 这是一个单个int,允许快速分拣和便于储存。

我认为问题被分解成具体领域:

  1. 历史数据
  2. 未来,短期数据
  3. 未来,长期数据

在每个以下子类:

  1. 系统提供的
  2. 用户提供的

让我们来看看他们一次一个。

系统提供的 :我会建议运行系统UTC,那么你就避免了时区的问题,并再次,没有信息丢失看到(它总是UTC)。

历史数据 :这些都是一样的系统日志文件,进程统计,跟踪,评论日期/时间等数据是不会改变的,而时区描述符是不会去修改。 对于这种类型的数据,也没有通过,无论它是在提供的时区的存储UTC中的信息丢失的信息。因此,删除时区。

未来,长期数据 :这些是在未来获得足够远或将继续发生的事件。 如果他们保持足够长的时间,时区描述符保证的变化。 这种类型的数据的一个很好的例子是,“周刊管理会议”。 这是输入一次,并预计将继续工作到永远的数据。 对于这些值,重要的是要确定它是否提供的系统或用户。 对于用户提供的数据,时间应存放与创作者的时区,在信息丢失别的结果。 当定义时区变化和时间被显示给创建者为具有一个完全不同的值,此信息损失变得明显!

如Bwooce已表明,存在一些混淆,其中创作者和观众都在不同的时区。 在这种情况下,我希望应用程序来指示时间值已经转移,由于从它们以前的位置时区的转变。

未来,短期数据 :这是一个快速将成为历史数据,或只适用于很短的时间周期。 例子可以是间隔定时器,等级转换,等等。对于这个数据,因为可能性较低,这一定义将创造价值,并成为历史的时间之间的变化,有可能与下降的时区脱身。 然而,我发现,这些值都成为“未来,长期数据”坏习惯。

一旦你决定来存储时区,必须注意它的存储方式。

  • 不要储存为偏移时区,或完整描述。

如果保存一个时区作为补偿,你是什么,如果时区的变化呢? 你去通过该系统,做好对现有数据的毯子变化? 如果你这样做,你现在所做的任何历史值不正确。 这种故障的最好的例子就是甲骨文和iCal。 甲骨文店时区为UTC的偏移量的信息,和iCal包括创作时区的完整描述。

  • 难道它存储为一个名字。

这使得时区的定义改变,而不必修改你的现有值。 它确实使排序更困难的,因为所产生的任何索引可以是如果所述时区数据的变化无效。

如果开发商继续一切存储在UTC,不论时区,我们将继续看到,我们已经看到了最后一批的时区变化的问题。

在一个组织中,秘书必须打印出的日历夏令日期前自己的团队,然后更改后再次打印出来。 最后,他们比较了两种并重新创建所有已转移的约会。 当然,他们错过了几次,直到老日光节约时间达到和时代再次成为正确的有几个星期的痛苦。



Answer 3:

约什是完全正确的上面,但我有一个微妙的警告说明。 这是有关未来事件和时区没有正确答案的情况。

考虑重复预约的情况下。 它发生在格林尼治标准时间0000(为简单起见),这是1200 NZST(新西兰标准时间)和1000 AEST在澳大利亚悉尼。

当夏令时生效在一个区域,应该发生什么约会? 应该是:

1A。 如果TZ的变化是在约会的“主人”的区(谁订的话),然后试图保持在同一台钟的时间(如上午10点)?
1B。 如果TZ的变化是在其他会议参加者的区域之一,那么没有变化

后果:它移到其他人,出乎意料的是,由于业主TZ的变化,但它保持“的上午10点开会”,只要车主关注。

“2。 如上所述,而是相反。

后果:它移动的会议所有者(上午10点会议变成上午09时的会议,或v / v),其可以被预期,但不便。 它停留在同一台钟时间,其他与会者,直到他们通过自己的TZ过渡。

也不是完美的。 考虑两个约会的情况下,一个人一个预订发生在上午10点本地时间,其他由个人B与某甲预订如发生在上午9点出席者。 如果用户A和用户B在不同的TZ的那么DST变化,易引起他们成为双预订。

如果你的心是有点弯曲,在这一点上,然后我很理解。

后面这个例子的一点是,做任何这类行为的正确,你需要知道的不只是本地时间UTC的版本,但TZ(而不是偏移)主人在时,他们预订了。 否则,你别无选择,只能采取选项2,悄无声息,甚至没有通知任何人,事情已经改变,因为GMT时间不会改变,只是表述方式的变化,对吧? (不,这是陷阱,演示文稿事宜时,通过自身的上午10点的会议移动)

我有我的功劳同事和朋友贾森·波洛克这一见解。 阅读在这里他的观点 ,以及后续的讨论iCal和VTIMEZONE这里。



Answer 4:

存储GMT一切/ UTC似乎是最合乎逻辑的我。 然后,您可以显示你希望每个时区的日期和时间。

一些ceveats:

  1. 如果时间仅指定为挂钟时间,并且是全球领先的表现,那么它是不是一个绝对的规定时间。 你应该(也不能)将它转换在任何GMT表示。 每天早上EG上午9:00。 换句话说:这是没有(日期)时间。
  2. 如果保存未来约会的日期和时间,你应该使用的偏移量在时间本身的输入时区和时刻指定GMT。 所以,如果是在冬季如西欧的。夏天的约会,这是+2:00,allthough正常(冬令时间)偏移量为+1:00。 这将解决Bwooce提到压延问题。
  3. 当然,在任何特定的时区转换回一个日期和时间,适用于使用权,同时转换为格林尼治标准时间偏移同样适用。

幸运的是,正确使用时,(.NET)DateTime类型需要照顾保持日历等,为你和所有的这应该是很容易的所有血淋淋的细节,当你知道它是如何工作的。



Answer 5:

就个人而言,我看不到任何理由不存储在GMT一切,然后使用用户的本地时区,因为它涉及到他们来显示时间。

如果你想显示相对时间,你显然还需要时间和做翻译,但是如果你想要做翻译,我认为GMT依然是你最好的选择。



Answer 6:

所以,我跑了一个小实验与MSSQL服务器。

我创建了一个表,并添加了一行,与当前的局部时区(澳大利亚)。 然后,我改变了我的日期时间为GMT,并添加另一行。

即使寿那些行是10秒左右分开加入,它们出现在SQL服务器寿他们10小时分开。

如果不出意外,它至少告诉我,我应该是存储在conisitent方式,这对我来说,增加了重量的说法为他们存储为GMT日期。



Answer 7:

MS动态存储GMT,然后在用户级别知道你的时间区相对于GMT。 然后,它显示在您的时区的项目给你。

只是想我会扔东西在那里因为这是在MS一个相当大的群体,这是他们决定如何处理它。



Answer 8:

我宁愿存储与时区的一切。 客户可以决定,哪些事情应该在稍后提交。 我最喜欢的转换库是PostgreSQL相关的数据库 。



Answer 9:

这里一看,W3C已经做得很好回答的问题。

看看用例。

http://www.w3.org/TR/timezone/

请注意,他们建议存储日期时间为UTC不GMT,格林尼治标准时间受到日光节约时间。



Answer 10:

我喜欢GMT存储和只示出了相(“约10秒前”,“5个月前”)。 用户并不需要看到实际的时间戳大多数使用情况。

当然,还有例外,和一个单独的应用程序可能有很多人,所以它不可能是一个“真路”的答案。 需要强大的审计能力(如投票)的事情,时间就是话语(天文,科研)可能需要真正的时间戳的域的一部分,系统将显示给用户。

大多数的应用程序,不过,更容易理解一个简单的相对时间。



Answer 11:

我通常只使用Unix时间。 不一定是未来的安全,但它工作得很好。



Answer 12:

在GMT(或UTC)始终存放。 从那里,很容易转换为任何地方的时区值。



Answer 13:

除非是用户提供的数据日期应被存储为UTC,你无法知道用户想要什么时区的数据是在有时候(非常非常罕见),你只是需要存储时,分,秒,日,月,年没有任何时区的组件,因此您可以吐出来返回给用户。 现在,新的开发者,或者如果你不确定,存储UTC,你将99%的正确。

但是不要被相信所有的时间这个工程的100%的时间用于所有的情况下被愚弄。 它不是。



文章来源: Handling timezones in storage?