Отформатируйте значения времени 12h в 24h в выводе - PullRequest
0 голосов
/ 02 января 2019

У меня есть значения формата "ч: мм AM" / "ч: мм PM" в моем json, которые я получаю из jq.Есть ли способ проанализировать эти 12-часовые форматированные значения и преобразовать их в 24-часовые?

Пример ввода:

{ "times": [ [ "8:16 AM", "EventA" ], [ "3:19 PM", "EventB" ] ]}

Требуемый вывод:

{ "times": [ [ "8:16", "EventA" ], [ "15:19", "EventB" ] ]}

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Можем ли мы использовать функции даты jq?

jq '(.times[] | .[])
    |= ( if test("^\\d{1,2}:\\d{1,2} [AP]M$"; "i")
         then ( strptime("%H:%M %p") | strftime("%k:%M") | sub("^ "; "") )
         else . end ) '
0 голосов
/ 03 января 2019

Используйте strptime и strftime для анализа и переформатирования каждый раз.

% jq -c '.times[][0] |= (strptime("%H:%M %p") | strftime("%H:%M"))'
{ "times": [ [ "8:16 AM", "EventA" ], [ "3:19 PM", "EventB" ] ]}
{"times":[["08:16","EventA"],["15:19","EventB"]]}
^C

strptime создает список, в котором час, соответствующий %H, устанавливается на 24-часовое время на основемодификатор соответствует %p;strftime затем просто выводит любой час, который он получает.

Сложная часть - не преобразование;он определяет, к каким значениям следует применить преобразование к .Здесь мы предполагаем, что каждый раз является первым элементом массивов в значении массива ключа times.

0 голосов
/ 02 января 2019

Следующее здесь более общее, чем на самом деле необходимо:

def to24h:
    (capture("(?<pre>.*)(?<h>[01][0-9])(?<m>:[0-5][0-9]) *(?<midi>[aApP])[mM](?<post>.*)") //
     capture("(?<pre>.*)(?<h>[0-9])(?<m>:[0-5][0-9]) *(?<midi>[aApP])[mM](?<post>.*)"))

  | (.midi|ascii_upcase) as $midi
  | .pre + (if $midi == "A" then .h else "\(12+(.h|tonumber))" end) + .m + .post ;

С помощью этого определения вы можете преобразовать заданный вход, используя фильтр:

.times |= map( map(to24h // .) )

или если вы хотите проверить все строки:

walk( if type=="string" then to24h // . else . end)
...