将18位LDAP / FILETIME时间戳转换为人类可读的日期

时间:2018-07-26 20:29:12

标签: python datetime

我已经从AD中导出了AD用户列表,需要验证其登录时间。

powershell脚本的输出将lastlogin作为LDAP / FILE时间显示

示例130305048577611542

我无法将其转换为熊猫可读的时间

我使用以下代码:

df ['登录日期'] = pd.to_datetime(df ['FileTime'],unit ='ns')

FileTime列包含的时间格式类似于上面的示例。

我在登录的新列日期中得到以下输出

示例1974-02-17 03:50:48.577611542

我知道这是错误地解析的,因为当我在在线转换器上输入此日期时间时,会得到此输出

示例:

Epoch / Unix时间:1386031258 GMT:2013年12月3日,星期二,12:40:58 AM 您的时区:2013年12月2日,星期一,格林尼治标准时间-08:00,下午4:40:58

任何人都知道这里发生了什么,为什么我所有的约会都在1970'

3 个答案:

答案 0 :(得分:1)

我知道这个答案对这个聚会来说很晚了,但是对于将来有其他希望的人来说。

18位Active Directory时间戳(LDAP),也称为“ Windows NT时间格式”,“ Win32 FILETIME或SYSTEMTIME”或NTFS文件时间。这些在Microsoft Active Directory中用于pwdLastSet,accountExpires,LastLogon,LastLogonTimestamp和LastPwdSet。时间戳记是自1601年UTC以来的100纳秒间隔(1纳秒=十亿分之一秒)的数量。

因此,130305048577611542确实与2013年12月3日有关。

在Python中通过日期时间函数将此值放入时,会将其截断为9位数字。因此,时间戳记变为130305048,并且从1970年1月1日开始,这确实导致1974年的日期!

为了获得正确的Unix时间戳,您需要执行以下操作:

(130305048577611542/10000000)-11644473600

答案 1 :(得分:0)

这是我在Python中所做的一个对我来说很好的解决方案:

import datetime

def ad_timestamp(timestamp):
    if timestamp != 0:
        return datetime.datetime(1601, 1, 1) + datetime.timedelta(seconds=timestamp/10000000)
    return np.nan

因此,如果您需要转换Pandas列:

df.lastLogonTimestamp = df.lastLogonTimestamp.fillna(0).apply(ad_timestamp)

注意:我需要先使用fillna,然后再使用apply。另外,由于我填充了0,因此我在转换函数if timestamp != 0中进行了检查。希望有道理。这是多余的东西,但您可能需要用它来转换有关的列。

答案 2 :(得分:0)

我已经坚持了几天。但是现在我准备以更易于使用的形式共享真正有效的解决方案:

import datetime
timestamp = 132375402928051110
value = datetime.datetime (1601, 1, 1) +   
datetime.timedelta(seconds=timestamp/10000000) ### combine str 3 and 4  
print(value.strftime('%Y-%m-%d %H:%M:%S'))