1
votes

Convertir CIM_DATETIME en Bash / Python

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 commentaires

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.


4 Réponses :


1
votes

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.


1 commentaires

Merci, mais pour la criminalistique informatique, le fuseau horaire est vraiment préférable.



2
votes

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")

0 commentaires

2
votes

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.


0 commentaires

0
votes

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))


0 commentaires