在Bash/Python中转换CIM_DATETIME

在Bash/Python中转换CIM_DATETIME,python,bash,timestamp,Python,Bash,Timestamp,我从wmic os获取了CIM_DATETIME时间get lastbootuptime: CIM_DATETIME的格式如下: yyyymmddHHMMSS.mmmmmmsUUU 如何在Bash或Python中将其转换为更人性化的东西 最可设计的格式是: Sunday, March 10th, 2019 @ 16:01:30 UTC 或者我可以把它转换成普通的东西,比如Unix时间戳。如果你想知道我是否需要在非Windows语言中使用它,那么已经有很多批量解决方案,因为我做计算机取证,但我

我从wmic os获取了CIM_DATETIME时间get lastbootuptime:

CIM_DATETIME的格式如下:

yyyymmddHHMMSS.mmmmmmsUUU
如何在Bash或Python中将其转换为更人性化的东西

最可设计的格式是:

Sunday, March 10th, 2019 @ 16:01:30 UTC
或者我可以把它转换成普通的东西,比如Unix时间戳。如果你想知道我是否需要在非Windows语言中使用它,那么已经有很多批量解决方案,因为我做计算机取证,但我运行Linux作为我的主要操作系统,所以我希望能够轻松地将从WMI获取的日期解释为我可以轻松解释的内容。这是如此的利基,我甚至无法在网上找到一个工具来做这件事/


谢谢。

您可以通过以下方式获得不带时区的时间戳:

from datetime import datetime
datetime.strptime(CIM_DATETIME.split('-')[0], '%Y%m%d%H%M%S.%f')
[请注意,这假设一个负时区偏移来分割字符串。]
时区的捕获是以分钟表示的,所以你必须除以60。但是你需要读时区吗?如果始终相同,则您可以将其单独带入。

您可以通过以下方式获得不带时区的时间戳:

from datetime import datetime
datetime.strptime(CIM_DATETIME.split('-')[0], '%Y%m%d%H%M%S.%f')
[请注意,这假设一个负时区偏移来分割字符串。] 时区的捕获是以分钟表示的,所以你必须除以60。但是你需要读时区吗?如果它总是一样的,那么你就可以把它单独带进来

但对于计算机取证来说,时区确实更可取

组合学家的答案已经完成了一半的工作。它可以很容易地扩展以考虑时区偏移:

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")
但对于计算机取证来说,时区确实更可取

组合学家的答案已经完成了一半的工作。它可以很容易地扩展以考虑时区偏移:

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

下面是我在Bash中提出的解决方案。输出似乎是正确的,与几天前我启动Windows box的时间一致——就在午夜之前。我还删除了@,因为它几乎没有让时间看起来更好,所以我不得不在下面使用CIM_DATETIME的脚本中删除它,因为date命令无法解析它

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"
输出示例:2019年3月9日星期六美国东部夏令时晚上11:38:35


感谢您提供的所有解决方案。

这是我在Bash中提出的解决方案。输出似乎是正确的,与几天前我启动Windows box的时间一致——就在午夜之前。我还删除了@,因为它几乎没有让时间看起来更好,所以我不得不在下面使用CIM_DATETIME的脚本中删除它,因为date命令无法解析它

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"
输出示例:2019年3月9日星期六美国东部夏令时晚上11:38:35


感谢您提供的所有解决方案。

以下是我对Armali答案的改进版本,它处理负/空/正时区,并允许使用UTC或本地表示法:

[编辑] 免责声明:本文中的代码已经过时。 我已将该代码作为python包发布。 使用pip安装windows\u tools.installed\u软件

用法:

from windows_tools.wmi_queries import cim_timestamp_to_datetime_utc

print(cim_timestamp_to_datetime_utc('20201103225935.123456+0'))
[/编辑]

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

以下是我对Armali答案的改进版本,它处理负/零/正时区,并允许使用UTC或本地表示法:

[编辑] 免责声明:本文中的代码已经过时。 我已将该代码作为python包发布。 使用pip安装windows\u tools.installed\u软件

用法:

from windows_tools.wmi_queries import cim_timestamp_to_datetime_utc

print(cim_timestamp_to_datetime_utc('20201103225935.123456+0'))
[/编辑]

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

请将该示例输入的所需输出添加到您的问题中。@Cyrus完成交易!如果期望的输出与给定的输入相对应,那就太好了。@Armali说得好!时区和转换格式很快就会让人困惑。必须有错误检查依据。请将该示例输入的所需输出添加到您的问题中。@Cyrus完成交易!如果期望的输出与给定的输入相对应,那就太好了。@Armali说得好!时区和转换格式很快就会让人困惑。必须有一些错误检查依据。谢谢,但是对于计算机取证来说,时区确实更可取。谢谢,但是对于计算机取证来说,时区确实更可取。