1 votes

Convertir une date dans un autre fuseau horaire + changement de format

J'ai un fichier journal avec des horodatages au format "22.09.2016 08:22:54" ("+%Y:%m:%d %H:%M:%S"). Cet horodatage est dans le fuseau horaire UTC.

Maintenant, je dois convertir cet horodatage en horodatage Europe/Helsinki en utilisant bash script.

J'ai ce script qui fait la conversion comme je le veux.

#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "2015-05-20 18:05:02")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"

Cela fonctionne bien mais le format de la date "entrée" ( -d "2015-05-20 18:05:02" ) est différent du format de l'horodatage de mon journal.

Je voudrais changer ce script en quelque chose comme ceci

#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "$1")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"

Où le $1 peut être dans le format de date original de mon fichier journal "22.09.2016 08:22:54" ("+%Y:%m:%d %H:%M:%S").

Je n'arrive pas à le faire fonctionner Quelqu'un peut-il m'aider sur ce point ? Merci.

EDIT :

J'ai essayé quelque chose comme ça et beaucoup d'autres combinaisons

#!/bin/sh 
sec=$(TZ="UTC" date +'%s' "+%Y:%m:%d %H:%M:%S" -d "$1") 
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S" 

mais le sien finit par l'erreur..

date: extra operand ‘+%Y:%m:%d %H:%M:%S’ 
Try 'date --help' for more information. 
date: invalid date ‘@’

1voto

Seth Points 8547

Il ne semble pas que date prend en charge une chaîne de format d'entrée. En tant que tel, vous ne pourrez pas simplement passer la chaîne à date. La page de manuel indique qu'il accepte les formats habituels, donc peut-être que vos paramètres régionaux peuvent influencer cela, mais je n'en suis pas sûr.

Pour aller plus loin, regardons votre script :

#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "$1")
$(TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S")

Ce qui se passe ici, c'est que vous convertissez le $1 en un horodatage Linux, puis le convertir à nouveau en une chaîne de caractères de votre choix. Une approche possible pour que cela fonctionne avec votre entrée serait de reformater le paramètre $1 paramètre de type chaîne de caractères.

Vous pouvez le faire, par exemple, en utilisant sed avec une expression rationnelle appropriée. Attention, vous devez vous assurer que vous avez une chaîne de caractères valide au préalable et que tout changement de format peut la casser.

#!/bin/bash
intputdate=$(echo $1 | sed -re 's/([0-9]{2})\.([0-9]{2})\.([0-9]{4})/\3-\2-\1/')
sec=$(TZ="UTC" date +'%s' -d "$intputdate")
echo $(TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S")

Edit : Ne pas avoir les mauvais noms de variables aide certainement.

0voto

user779370 Points 1234

Cela semble un peu plus joli, en convertissant l'heure de la Nouvelle-Zélande en heure de Monaco :

TZ="Europe/Monaco" date --date="TZ="Pacific/Auckland\" 2017-10-11 00:51" +%Y-%m-%d\ %H:%M:%S

2017-10-10 13:51:00

#!/bin/bash
new_zealand_time="2017-10-12 00:56"
monaco_time=$(TZ="Europe/Monaco" date --date="TZ=\"Pacific/Auckland\" $new_zealand_time" +%Y-%m-%d\ %H:%M:%S)
echo "Time in Monaco: $monaco_time"

Heure à Monaco : 2017-10-11 13:56:00

0voto

RAM237 Points 126

Sous MacOS (10.14.3), cela fonctionne très bien car vous pouvez fournir votre format exact via le lien suivant -f interrupteur :

$ d1="22.09.2016 08:22:54"
$ sec=$(TZ="UTC" date -j -f "%d.%m.%Y %H:%M:%S" "$d1" "+%s")
1474532574
$ TZ="Europe/Helsinki" date -j -f "%s" "$sec" "+%Y:%m:%d %H:%M:%S"
2016:09:22 11:22:54

et d'ailleurs, le format de votre journal est "+%d.%m.%Y %H:%M:%S" pas "+%Y:%m:%d %H:%M:%S" comme vous l'indiquez après le 2ème extrait de code, sinon la ligne où sec est définie dans mon code ci-dessus va probablement lancer illegal time format erreur ou quelque chose comme ça.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X