【问题标题】:Convert 18-digit LDAP/FILETIME timestamps to human readable date将 18 位 LDAP/FILETIME 时间戳转换为人类可读的日期
【发布时间】:2020-07-04 05:27:37
【问题描述】:

我已经从 AD 中导出了一个 AD 用户列表,需要验证他们的登录时间。

powershell 脚本的输出给出 lastlogin 作为 LDAP/FILE 时间

示例 130305048577611542

我无法将其转换为 pandas 中的可读时间

我使用以下代码:

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

FileTime 列包含格式与上述示例类似的时间。

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

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

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

示例:

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

任何人都知道这里发生了什么,为什么我的所有日​​期都在 1970 年'

【问题讨论】:

标签: python datetime


【解决方案1】:

我知道这个答案对聚会来说已经很晚了,但对于其他展望未来的人来说。

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

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

当通过 Python 中的日期时间函数输入这个值时,它会将值截断为九位数字。因此时间戳变为 130305048 并从 1.1.1970 开始,这确实导致了 1974 年的日期!

为了得到正确的 Unix 时间戳,你需要做:

(130305048577611542 / 10000000) - 11644473600

【讨论】:

    【解决方案2】:

    这是我在 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。希望这是有道理的。这是额外的东西,但您可能需要它来转换有问题的列。

    【讨论】:

      【解决方案3】:

      这几天我一直在纠结这个问题。但现在我准备以更易于使用的形式分享真正有效的解决方案:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-18
        • 2012-11-12
        • 2012-05-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-03
        • 1970-01-01
        相关资源
        最近更新 更多