datetime в Elasticsearch - Как обращаться с часовым поясом
Я пытаюсь проиндексировать поле, содержащее дату.
Как я могу проиндексировать дату из другого часового пояса?
Я установил мое поле asticsearch следующим образом: 'required_dt': {"type": "date", "format": "date_time_no_millis"} 'local_dt': {"type": "date", "format": "date_time_no_millis "}
Я попытался проиндексировать эти значения (local_dt): (required_dt - текущее время во Франции)
IT 2016-10-27T23:46:17Z
GB 2016-10-27T22:46:19Z
Я не получаю ожидаемый результат через 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
Итак, для требуемого_дня я получаю то, что ожидаю.
Для local_dt я не получаю то, что хочу.
Я попытался заменить значение Z смещением UTC, но я не смог получить правильный вывод.
Может ли кто-нибудь объяснить мне, как получить правильный результат для каждого часового пояса, который я хочу?
1 ответ
Когда я читаю (и мой собственный опыт), Кибана будет индексировать @timestamp
при условии, что они приходят в UTC, и только в таком формате, как 2018-04-23T10:45:13.899Z
, Обратите внимание, что у нас есть только миллисекунды и T
в качестве разделителя и Z
с указанием UTC.
https://discuss.elastic.co/t/kibana-timezone/29270/5
Итак, если у вас есть местный datetime
объект, попробуйте преобразовать в UTC время и отформатировать его, как указано выше.
- В случае
now()
использоватьtimezone.now()
изdjango.utils.timezone
; или без джанго у вас естьdatetime.datetime.utcnow()
Если у вас есть
datetime()
объект уже, вы можете сделать:импортировать pytz, datetime local = pytz.timezone ("Europe / Paris") local_dt = local.localize (your_datetime_object, is_dst = None) utc_dt = local_dt.astimezone (pytz.utc)
(благодаря этому ответу)
Когда у вас есть объект, отформатируйте как:
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
Для тех, кто приходит сюда через поиск Google, например, я, вы не можете добавить букву военного часового пояса в конец временной метки и заставить Elasticsearch ее распознать.
Я думал, что это будет так, поскольку он распознает и выводит "Z" в конце метки времени UTC, поэтому я добавил "R" к своим собственным меткам времени, чтобы обозначить, что они пришли из UTC-5. Вот как они будут выглядеть рядом друг с другом:
"2020-04-09T07:35:15.100Z" # parsed as UTC
"2020-04-09T07:35:15.100R" # illegal argument exception
Однако ни один из встроенных форматов не распознает эту дополнительную букву; вы должны либо указать смещение времени так
"2020-04-09T07:35:15.100-0500"
"2020-04-09T07:35:15.100-05:00"
или укажите часовой пояс в конвейере процессора
{
"pipeline": {
"processors": [
{
"date": {
"field": "raw_date",
"formats": ["ISO8601"],
"timezone": "America/New_York"
}
}]
}
}