[How To Convert a UNIX time_t to a Win32 FILETIME or SYSTEMTIME][kb]:
> Under Win32 platforms, file times are maintained primarily in the form of
> a 64-bit FILETIME structure, which represents the number of 100-nanosecond
> intervals since January 1, 1601 UTC (coordinate universal time).
***UPDATED* New version with fixes by Tim Williams for preserving microseconds. See [here for details][updated].**
It just so happens that [Microsoft Active Directory][msad] uses the same 64-bit value to store some time values. For example [the `accountExpires` attribute][expires] is in this format. Linked below is a module for Python with utility functions for converting between [Python’s datetime instances][datetime] and Microsoft’s FILETIME values.
Very handy if you enjoy querying Active Directory for login accounts that are due to expire. And who wouldn’t enjoy that? On a Monday.
[Download filetimes.py module for converting between FILETIME and `datetime` objects.][filetimes] This code is released under a 2-clause BSD license.
>>> from filetimes import filetime_to_dt, dt_to_filetime, utc
datetime.datetime(1970, 1, 1, 0, 0)
datetime.datetime(2009, 7, 25, 23, 0)
>>> “%.0f” % dt_to_filetime(datetime(2009, 7, 25, 23, 0))
>>> dt_to_filetime(datetime(1970, 1, 1, 0, 0, tzinfo=utc))
>>> dt_to_filetime(datetime(1970, 1, 1, 0, 0))
I even remembered to write tests for once!
Thanks for posting this. It was a lifesaver.
Pingback: Reliably Broken » Free software FTW! Updated filetimes.py
Thank you so much. This helped me a lot!
Very helpful indeed, I was looking around for quite a while until I finally found this. Exactly what I was needing.
Just one thing I noticed after using your code to convert user LastLogon values from AD. The function filetime_to_dt chokes on the line ‘dt = datetime.utcfromtimestamp(s)’ if ft is 0. Shouldn’t the result for that value be equivalent to datetime(1601,1,1,0,0,0,0)?
If you like me to explain how it comes that I’ve been running into using 0 as a parameter to this function, I’m willing to do it :-)