Как Миллер может преобразовать местную дату и время в UTC?

Как Miller 5.6.2 преобразовать местную дату и время в UTC используя выражение более простое, чем следующее?

$ printf "time1\n2019-06-13 05:54 PM\n" | mlr --csv put '
  $time1=sec2gmt(
    localtime2sec(
      strftime(
        strptime($time1, "%Y-%m-%d %H:%M %p"),
        "%Y-%m-%d %H:%M:%S")));'
time1
2019-06-13T10:54:00Z

Обратите внимание, что мой местный часовой пояс в июне: EDT или -04:00:

$ date --date='2019-06-13 05:54 PM' '+%Y-%m-%dT%H:%M:%S %Z'
2019-06-13T17:54:00 EDT
$ date --date='2019-06-13 05:54 PM' '+%Y-%m-%dT%H:%M:%S%z'
2019-06-13T17:54:00-0400

1 ответ

Я нашел два похожих выражения, оба из которых используют strptime_local() вместо того strptime() для синтаксического анализа локальной строки даты и времени и преобразования ее в секунды с начала эпохи в формате UTC (GMT):

$ printf "time1\n2019-06-13 05:54 PM\n" | mlr --csv put '
  $time1=strftime(
    strptime_local($time1, "%Y-%m-%d %H:%M %p"),
    "%Y-%m-%dT%H:%M:%SZ");'
time1
2019-06-13T10:54:00Z
$ printf "time1\n2019-06-13 05:54 PM\n" | mlr --csv put '
  $time1=sec2gmt(strptime_local($time1, "%Y-%m-%d %H:%M %p"));'
time1
2019-06-13T10:54:00Z

И то и другое strftime() а также sec2gmt() принять аргумент в секундах с начала эпохи в формате UTC.

Функция strptime() принимает входную строку даты и времени в формате UTC и игнорирует часовой пояс во входной строке:

$ printf "time1\n2019-06-13 05:54 PM\n" | mlr --csv put '
  $time1=strptime($time1, "%Y-%m-%d %H:%M %p");'
time1
1560405240.000000
$ printf "time1\n2019-06-13 05:54 PM EDT\n" | mlr --csv put '
  $time1=strptime($time1, "%Y-%m-%d %H:%M %p %Z");'
time1
1560405240.000000

Функция strptime_local() также игнорирует часовой пояс во входной строке даты и времени, но предполагает, что строка находится в местном часовом поясе, и преобразует ее в UTC:

$ printf "time1\n2019-06-13 05:54 PM\n" | mlr --csv put '
  $time1=strptime_local($time1, "%Y-%m-%d %H:%M %p");'
time1
1560423240.000000
$ printf "time1\n2019-06-13 05:54 PM EDT\n" | mlr --csv put '
  $time1=strptime_local($time1, "%Y-%m-%d %H:%M %p %Z");'
time1
1560423240.000000
$ printf "time1\n2019-06-13 05:54 PM EST\n" | mlr --csv put '
  $time1=strptime_local($time1, "%Y-%m-%d %H:%M %p %Z");'
time1
1560423240.000000
$ printf "time1\n2019-06-13 05:54 PM AUT\n" | mlr --csv put '
  $time1=strptime_local($time1, "%Y-%m-%d %H:%M %p %Z");'
time1
1560423240.000000
Другие вопросы по тегам