J'ai un CIM_DATETIME
temps acquis à partir de wmic os get lastbootuptime
:
Sunday, March 10th, 2019 @ 16:01:30 UTC
CIM_DATETIME
est formaté comme suit:
yyyymmddHHMMSS.mmmmmmsUUU
Comment puis-je convertir cela en quelque chose de plus convivial dans Bash ou Python?
Le format qui serait le plus souhaitable est:
20190309221835.234400-480
Cela ou si je pouvais le convertir en quelque chose de normal comme un horodatage Unix. Si vous vous demandez mon besoin de cela dans des langues non Windows (il existe déjà de nombreuses solutions dans Batch), c'est parce que je fais de l'informatique légale mais que j'utilise Linux comme système d'exploitation principal, je veux donc pouvoir interpréter facilement les dates que j'obtiens. WMI en quelque chose que je peux interpréter facilement. C'est tellement de niche que je n'arrive même pas à trouver un outil en ligne pour le faire. : /
Merci.
4 Réponses :
Vous pouvez obtenir l'horodatage sans le fuseau horaire avec ceci:
from datetime import datetime datetime.strptime(CIM_DATETIME.split('-')[0], '%Y%m%d%H%M%S.%f')
[Remarque, cela suppose un décalage de fuseau horaire négatif pour diviser la chaîne.] Le hic avec le fuseau horaire est qu'il est exprimé en minutes donc vous devez diviser par 60. Mais avez-vous besoin de lire le fuseau horaire? Si ce sera toujours le même, vous pourrez le faire séparément.
Merci, mais pour la criminalistique informatique, le fuseau horaire est vraiment préférable.
mais pour la criminalistique informatique, le fuseau horaire est vraiment préférable.
La réponse du combinatoriste fait déjà la moitié du travail. Il peut facilement être étendu pour prendre en compte le décalage du fuseau horaire:
import datetime CIM_DATETIME ='20190309221835.234400-480' dt = datetime.datetime.strptime(CIM_DATETIME[:-4], '%Y%m%d%H%M%S.%f') # dt is now datetime.datetime(2019, 3, 9, 22, 18, 35, 234400) dt -= datetime.timedelta(minutes=int(CIM_DATETIME[-4:])) # dt is now datetime.datetime(2019, 3, 10, 6, 18, 35, 234400) dt.strftime("%A, %B %d., %Y @ %X UTC")
Voici la solution dans Bash que j'ai trouvée. La sortie semble être correcte et s'aligner sur l'heure d'il y a quelques jours, j'ai démarré la boîte Windows - juste avant minuit. J'ai également supprimé le "@" car il rendait à peine le temps plus agréable à regarder et je l'ai donc supprimé dans les scripts suivants en utilisant CIM_DATETIME
en raison de la commande date
ne pas pouvoir analyser cela.
CIM_DATETIME="20190309221835.234400-480" date="${CIM_DATETIME:0:8}" date="$(date -d "$date" '+%A, %B%e, %Y')" time="${CIM_DATETIME:8:6}" time="$(echo "$time" | sed 's/../&:/g;s/:$//')" # Adds : between hours, minutes and seconds of time so it can be parsed correctly timezone="${CIM_DATETIME:21}" time="$time $timezone" time="$(date -d "$time" '+%r %Z')" echo "$date $time"
Exemple de sortie: samedi 9 mars 2019 23:38:35 HAE
Merci pour toutes les solutions.
Voici ma version améliorée de la réponse d'Armali qui traite des fuseaux horaires négatifs / nuls / positifs, et permet d'utiliser la notation UTC ou locale:
from datetime import datetime, timedelta import re def convert_cim_timestamp(cim_timestamp: str, utc_result: bool = True) -> str: """ Convert WMI timestamp to python datetime object """ cim_time, cim_tz = re.split('[+-]', cim_timestamp) dt = datetime.strptime(cim_time, '%Y%m%d%H%M%S.%f') if not utc_result: dt -= timedelta(minutes=int(cim_tz)) return dt.strftime('%A, %B %d., %Y @ %X') else: utc_sign = '+' if '+' in cim_timestamp else '-' utc_offset = int(int(cim_tz)/60) return dt.strftime("%A, %B %d., %Y @ %X UTC{}{}".format(utc_sign, utc_offset)) # Example cim_tz = '20201103225935.123456-240' print(convert_cim_timestamp(cim_tz)) cim_tz = '20201103225935.123456+120' print(convert_cim_timestamp(cim_tz))
Veuillez ajouter la sortie souhaitée pour cet exemple d'entrée à votre question.
@Cyrus Done deal!
Cela aurait été bien si la sortie souhaitée correspondait à l'entrée donnée.
@Armali Bon point! Les fuseaux horaires et les formats de conversion deviennent très vite déroutants. Il faut avoir quelque chose pour vérifier les erreurs.