1
votes

Formater les valeurs de temps de 12 h à 24 h dans la sortie jq

J'ai des valeurs du format "h: mm AM" / "h: mm PM" dans mon json que j'obtiens de jq. Existe-t-il un moyen d'analyser ces valeurs formatées 12h et de les convertir en valeurs 24h?

Exemple d'entrée:

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

Sortie souhaitée:

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


0 commentaires

3 Réponses :


1
votes

Ce qui suit est plus générique que nécessaire ici:

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

Avec cette définition, vous pouvez transformer l'entrée donnée en utilisant le filtre:

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

ou si vous souhaitez que toutes les chaînes soient vérifiées:

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 ;


6 commentaires

Merci! Je suis assez nouveau sur jq. Comment appliquer la fonction to24 () à mon json? jq 'def to24h: ...; .times | . [] | to24h ([0]) ' ne semble pas fonctionner


Veuillez consulter la mise à jour. Avez-vous parcouru le didacticiel sur stedolan.github.io/jq/tutorial ?


Merci! Je pense que c'est ce que je vais faire ensuite. C'est un outil puissant.


Si l'heure est "12:00 PM", la fonction la convertit en "114: 00". J'ai donc pensé que dans l'instruction if, il devrait également y avoir une vérification du cas si $ pre == 12 et $ h == "2" . Mais je n'arrive pas à comprendre la bonne syntaxe


Je l'ai corrigé pour qu'il affiche correctement "12:00 PM": def to24h: capture ("(?


Le bogue a été corrigé.



0
votes

Pouvons-nous utiliser les fonctions de date de 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 ) '


4 commentaires

Merci! Je l'ai essayé, mais tout ce qui se passe est que AM / PM est supprimé et un espace est ajouté à l'avant "3:19"


Si vous souhaitez poursuivre dans ce sens, vous pouvez consulter la page de manuel de strftime sur votre système. Sous mac OS,% k est remplacé par l'heure (horloge sur 24 heures) sous forme de nombre décimal (0-23); les chiffres uniques sont précédés d'un espace.


J'ai modifié ma réponse pour montrer comment me débarrasser du blanc. Bonne chance!


AVERTISSEMENT: "12:00 AM", "12:00 PM" | strptime ("% H:% M% p") | strftime ("% H:% M") renvoie "00:00" "12:00"



0
votes

Utilisez strptime et strftime pour analyser et reformater à chaque fois.

% 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 produit une liste où l'heure correspondant à % H est ajustée à 24 heures en fonction du modificateur correspondant à % p ; strftime affiche alors simplement l'heure qu'il obtient.

Le plus dur n'est pas la conversion; il détermine à quelles valeurs la conversion doit être appliquée à . Ici, nous supposons que chaque fois est le premier élément des tableaux dans la valeur du tableau de la clé times .


1 commentaires

AVERTISSEMENT: "12:00 AM", "12:00 PM" | strptime ("% H:% M% p") | strftime ("% H:% M") renvoie "00:00" "12:00"