【问题标题】:GAE & JavaScript datetime syncGAE 和 JavaScript 日期时间同步
【发布时间】:2014-05-07 09:47:03
【问题描述】:

在客户端和服务器之间同步时间的最佳做法是什么?

我有这个查询数据存储的功能:

@classmethod
def read( cls, language=None, user=None, filters=None, **q_options ):
  assert not isinstance( cls, BaseModel )
  assert issubclass( cls, BaseModel )

  query = cls.query( cls.language == language )
  if filters:
    for name, value in cls.attributes( filters, [] ).iteritems():
      if name == 'updated':
        query = query.filter( getattr(cls, name) >= value )
      else:
        query = query.filter( getattr( cls, name ) == value )
    # logging.info( query )
    # Query(kind='Page', filters=AND(
    #   FilterNode('language', '=', 'en'),
    #   FilterNode('updated', '>=', datetime.datetime(2014, 5, 7, 9, 12, 51, 142000))))
    return query.fetch()
  data = query.fetch( **q_options )
  return cls.sort( data )

使用 ajax 调用执行时:

{method: 'GET', url: '/something.json?updated=' + (new Date().getTime() / 1000)}

它应该返回在调用中提供的时间之后更新的项目。 (我用它来同步浏览器的 localStorage 和真实数据)。好吧,它不起作用,但我发现这是因为服务器和客户端之间的时间差异。

我在 UTC/GMT +2 小时,CEST(中欧夏令时)时区(这是 javascript 发送的)和 GAE dev_appserver 在 GMT 工作。对此进行补偿:

updated=((new Date().getTime() - 1000*60*60*2) / 1000)

解决了这个问题,但硬编码并不是针对不同时区的解决方案。所以,几个问题:

1) 真正的 GAE 服务器的时区是什么?和dev_appserver的一样吗?

2) 我应该处理客户端或服务器上下文(javascript 或 python)的差异吗?

3) 还有什么我应该知道的吗? (:

谢谢

【问题讨论】:

  • 我建议尽可能在服务器端处理时区,因为您永远不知道您的消费者/客户在解释/转换日期时有多可靠。客户端的时间概念是相对于他所在的位置,而您的服务器的时间应该是参考。
  • new Date().getTime() 返回 unix 时间戳,它不应该依赖于时区。但是客户端只有在时钟正确的情况下才会返回正确的时间,所以我认为你不应该依赖它。
  • 是的,我同意服务器应该是参考...我将使用 var timestamp = (data ? hasOwnProperty.call( data, 'updated' ) : false) ? data.updated : new Date().UTC(); 内容日期,并回退到 UTC。谢谢你。

标签: javascript python google-app-engine


【解决方案1】:

这篇文章描述了一个解决方案:How to get current UK time in Google App Engine

Google App Engine 始终采用 UTC,因此您需要像 pytz 这样的库来调整您的偏好。

【讨论】:

  • 谢谢!我会调查 pytz
猜你喜欢
  • 2018-07-12
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
相关资源
最近更新 更多