我想创建NT格式的网络时间戳。在
我已经能够用这个函数将它们转换为可读时间:
NetworkStamp = "\xc0\x65\x31\x50\xde\x09\xd2\x01"
def GetTime(NetworkStamp):
Ftime = int(struct.unpack('<Q',NetworkStamp)[0])
Epoch = divmod(Ftime - 116444736000000000, 10000000)
Actualtime = datetime.datetime.fromtimestamp(Epoch[0])
return Actualtime, Actualtime.strftime('%Y-%m-%d %H:%M:%S')
print GetTime(NetworkStamp)
输出:
^{pr2}$现在我要做相反的操作,将'2016/09/08 11:35:57'
秒转换为以下格式:
"\xc0\x65\x31\x50\xde\x09\xd2\x01"
{{s}可能会忽略{cd2}的余数,因为它可能会忽略^ cd2>的余数。这在代码创建的可读字符串中并不明显,因为它只显示整秒钟。
即使包含分数秒,也不能完全按照您的意愿进行操作,因为Windows
FILETIME
结构的值间隔为100纳秒(.1微秒),但是Python的datetime
只支持精确到整微秒。因此,最好的办法是,由于信息的丢失,即使是最精确的转换,也要近似原始值。在下面是python2和Python 3的代码,使用问题中的
NetworkStamp
测试值来演示这一点:输出:
^{pr2}$如果你了解如何在一个方向上执行转换,那么反向操作基本上就是以相反的顺序使用每个方法的逆操作。只需查看您正在使用的模块/类的文档:
strftime
有{a1}fromtimestamp
is matched by ^{timestamp
不存在,但是您可以在函数之外定义FILETIME_epoch = datetime.datetime(1601, 1, 1) - datetime.timedelta(seconds=time.altzone if time.daylight else time.timezone)
来预计算一个datetime
表示时区的FILETIME
epoch,然后使用int((mydatetime - FILETIME_epoch).total_seconds())
直接获得{FILETIME
和Unix epoches之间的差异)divmod
(这不是你真正需要的,因为你只使用商,而不是余数,你可以只做Epoch = (Ftime - 116444736000000000) // 10000000
并避免以后索引)是微不足道的可逆的(只要乘法和加法,如果你使用我的技巧直接从#2转换为FILETIME
epoch seconds,那么加法就不必要了)struct.unpack
is matched by ^{我没有提供确切的代码,因为你真的应该学会自己使用这些东西(必要时还可以阅读文档);我猜你的前向代码是在不理解它在做什么的情况下编写的,因为如果你理解了它,反过来应该很明显;每一步都在同一页上有一个相反的文档。在
相关问题 更多 >
编程相关推荐