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" ] ]}
3 Réponses :
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 ;
Merci! Je suis assez nouveau sur jq. Comment appliquer la fonction to24 ()
à mon json? jq 'def to24h: ...; .times | . [] | to24h ([0]) '
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é.
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 ) '
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"
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
.
AVERTISSEMENT: "12:00 AM", "12:00 PM" | strptime ("% H:% M% p") | strftime ("% H:% M")
renvoie "00:00" "12:00"