如何在Postgres中存储社交媒体Unix时间戳,保留用户的当地时间

时间:2018-04-26 08:37:34

标签: postgresql unix-timestamp timezone-offset localtime social-media

我现在担心这个步骤已有几个月了,但我不可避免地想到了我们目前所处的时间问题。我知道有很多可用的信息,但是我仍然有问题将本地时间概念应用于我的问题:

基本上,我们有一个Postgres数据库,我们存储不同的社交媒体帖子(Foursquare,Flickr等)进行分析。 API通常会返回Unix时间戳,which are always UTC as far as I know

问题是:当我们分析这些数据时,我们并不关心UTC,我们需要知道用户在社交媒体上发布时的当地时间。例如,假设某人在悉尼当地时间下午4点(GMT + 10)拍摄了悉尼歌剧院的照片。我们如何在Postgres中存储此内容 - timestamp with timezonetimestamp without timezone?用户的本地时间是否可用 - 或者我们是否必须考虑Geocoordinates(如果可用)来计算用户的当地时间?

总结

  • 我们不关心分析师/调查员在Postgres中查看数据时的时间
  • 我们不关心UTC / GMT 的偏移量,拥有它(了解一般位置)会很好,但它并不重要
  • 我们只关心用户在发布/拍照时所感知的主观个人时间

在这些情况下,存储元数据的最佳方法是什么?

[编辑] 我询问了用户提到的位置" o' clock"在他们的帖子中,将其与post_publish_date(没有时区的时间戳)进行比较,从API返回)。令人惊讶的是,我看到的所有这些时间戳都是本地时间,而不是UTC:

"post_publish_date","post_body"
"2016-12-06 07:27:07","[...] at 8 o'clock a.m. [...]"
"2018-02-22 05:21:53","[...] main 6 o'clock road to [...]"
"2018-01-27 06:13:04","[...] get up early otherwise you miss [...] 6 o'clock [...]"
"2018-02-09 16:21:37","It's Friday [...] its gotta be 5 o'clock [...]"
"2018-02-02 15:44:21","It's Friday, [...] it's always 5 o'clock [...]"
"2015-11-21 02:37:53","[...] until 4 o'clock in the morning. [...]"
"2017-09-15 07:51:53","[...] 9 o'clock at night[...]"
"2017-12-18 19:52:40","[...]Date: ♨18.12.2017  [...] 20o'clock [...] Location: New York[...]"

This is a great post解释了这些差异,但据说一个Unix时间戳可以在任何时区 - UTC或本地时间,除非给出时区,否则永远不会知道。现在的问题是:我可以将具有时区的帖子与没有时区的帖子存储在同一列(格式为timestamp with timezone)中,作为那些指定了时区的帖子吗?

Here是另一篇文章,描述了如何在发推时从用户的相应坐标中检索推文的八进制时间。因此,Twitter返回的时间是UTC时间,而不是当地时间。

1 个答案:

答案 0 :(得分:0)

经过一些测试,我认为我得到了正确答案:

不同的社交媒体服务以不同方式处理时间戳和时区。时间的三个方面是相关的:

  • (1)用户的当地时间(创建或发布帖子时)
  • (2)绝对UTC / GMT时间(自UTC时间1970年1月1日以来经过的秒数,与GMT相同),这与全球比较次
  • (3)观看者的当地时间(例如,在线观看推文时,这可以避免看到将来出版的内容发生悖论)

示例:(1)推文于9:37在柏林(+2 CEST)发布,(2) Twitter将其存储为7:37 UTC( +00),以及(3)当在加利福尼亚(-7 PT)查看此推文时,用户看到的时间是上午12:37(转换为观看者的当地时间)。 / p>

虽然(3)与Web-Apps相关,但在数据分析中,人们通常对贡献用户的本地时间感兴趣,而不是UTC时间戳或观看者的本地时间。例如,对于Flickr和Instagram,此时间可直接从API获得。对于Twitter,必须根据sometimes available的其他条件计算当地时间。

这对于在Postgres中存储数据意味着什么?

在postgres中,有两种选择:将时间保存为timestamp without timezonetimestamp with timezone。但是,Postgres将never store timezone information in the timestamp,此处的'timezone'仅指显示 Postgres时间戳(3)时如何格式化时间戳。 因此,在存储要分析的数据时,不应处理时间戳。它们作为timestamp without timezone处理,因为贡献用户的时区最初是未知的(不考虑其他信息)。对于某些服务,例如Twitter,分析师的任务是在分析之前将此时间转换为用户的当地时间(例如,通过考虑utc_offset,帖子,语言或其他属性的位置)。