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"
        }
      }]
  }
}
Другие вопросы по тегам