Elasticsearch 中的日期时间 - 如何处理时区

Dav*_*idK 3 timezone datetime elasticsearch timezone-offset kibana

我尝试索引包含日期的字段。

如何索引来自不同时区的日期?

我已经像这样设置了我的 elasticsearch 字段: 'requested_dt': {"type": "date", "format": "date_time_no_millis"} 'local_dt': {"type": "date", "format": "date_time_no_millis" "}

我试图索引这些值 (local_dt) :(requested_dt 是法国的当前时间)

IT 2016-10-27T23:46:17Z
GB 2016-10-27T22:46:19Z
Run Code Online (Sandbox Code Playgroud)

我没有通过 Kibana 得到预期的结果:

[local_dt]
IT October 28th 2016, 01:46:17.000
GB October 28th 2016, 00:46:19.000

[requested_dt]
IT October 27th 2016, 23:46:17.000
GB October 27th 2016, 23:46:19.000
Run Code Online (Sandbox Code Playgroud)

所以,对于requested_dt,我得到了我的期望。

对于local_dt,我没有得到我想要的。

我试图用 UTC 偏移量替换 Z 值,但我无法获得正确的输出。

有没有人能够向我解释如何为我想要的每个时区获得正确的输出?

Wes*_*Gun 6

当我阅读(以及我自己的经验)时,Kibana 将索引@timestamp假设它们以 UTC格式出现,并且仅以2018-04-23T10:45:13.899Z. 请注意,我们只有毫秒和Tas 分隔符并Z指示 UTC。

https://discuss.elastic.co/t/kibana-timezone/29270/5

因此,如果您有一个本地datetime对象,请尝试将其转换为 UTC 时间,并按上述方式对其进行格式化。

  • 在的情况下now(),使用timezone.now()django.utils.timezone; 或者,没有 Django,你有datetime.datetime.utcnow()
  • 如果你已经有一个datetime()对象,你可以这样做:

这个:

import pytz, datetime
local = pytz.timezone ("Europe/Paris")
local_dt = local.localize(your_datetime_object, is_dst=None)
utc_dt = local_dt.astimezone(pytz.utc)
Run Code Online (Sandbox Code Playgroud)

(感谢这个答案

当你有对象时,格式如下:

timeStr = datetime.strftime(your_utc_time_object, "%Y-%m-%dT%H:%M:%S.%f") # %f: microseconds, 1/10^6 seconds.
timeStr = timeStr[:-3] # delete the trailing 3 digits, convert to milliseconds
toInsert["@timestamp"] = nowStr + "Z" # add 'Z' at last
Run Code Online (Sandbox Code Playgroud)