在Bash/Python中转换CIM_DATETIME
我从wmic os获取了CIM_DATETIME时间get lastbootuptime: 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语言中使用它,那么已经有很多批量解决方案,因为我做计算机取证,但我
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说得好!时区和转换格式很快就会让人困惑。必须有一些错误检查依据。谢谢,但是对于计算机取证来说,时区确实更可取。谢谢,但是对于计算机取证来说,时区确实更可取。