Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python将1970年之前的日期的filetime转换为datetime_Python_Datetime_Filetime - Fatal编程技术网

python将1970年之前的日期的filetime转换为datetime

python将1970年之前的日期的filetime转换为datetime,python,datetime,filetime,Python,Datetime,Filetime,我需要将filetime转换为datetime。我正在使用这段代码,正如本文中提到的 在代码中 EPOCH_AS_FILETIME = 116444736000000000 # January 1, 1970 as MS file time HUNDREDS_OF_NANOSECONDS = 10000000 def filetime_to_dt(ft): """Converts a Microsoft filetime number to a Python datetime. Th

我需要将filetime转换为datetime。我正在使用这段代码,正如本文中提到的

在代码中

EPOCH_AS_FILETIME = 116444736000000000  # January 1, 1970 as MS file time
HUNDREDS_OF_NANOSECONDS = 10000000

def filetime_to_dt(ft):
    """Converts a Microsoft filetime number to a Python datetime. The new datetime object is time zone-naive but is equivalent to tzinfo=utc.

    >>> filetime_to_dt(116444736000000000)
    datetime.datetime(1970, 1, 1, 0, 0)
    """
    # Get seconds and remainder in terms of Unix epoch
    (s, ns100) = divmod(ft - EPOCH_AS_FILETIME, HUNDREDS_OF_NANOSECONDS)
    # Convert to datetime object
    dt = datetime.utcfromtimestamp(s)
    # Add remainder in as microseconds. Python 3.2 requires an integer
    dt = dt.replace(microsecond=(ns100 // 10))
    return dt
datetime.utcfromtimestamp
在windows系统上不接受负值,因此我无法在1970年1月1日之前转换文件时间。但我可以在Mac上使用完全相同的代码转换1970年之前的日期(原因)。windows有什么解决办法吗

,您必须使用:

dt = datetime.fromtimestamp(s, datetime.timezone.utc)
而不是:

dt = datetime.utcfromtimestamp(s)

通过向参考日期添加
timedelta
,您可以使用任何您想要的日期公式<代码>时间增量允许为正或负

def filetime_to_dt(ft):
    us = (ft - EPOCH_AS_FILETIME) // 10
    return datetime(1970, 1, 1) + timedelta(microseconds = us)

首先,您需要将其转换为可识别的文件时格式,如下所示:

>>> dwLowDateTime = 0x0F7297A80
>>> dwHighDateTime = 0x1C3F10F << 32
>>> ft = (dwLowDateTime & 0xFFFFFFFF) | dwHighDateTime
127210265370000000

使用
timedelta
s在时间帧之间加/减/除:

FILE\u TIME\u EPOCH=datetime.datetime(1601,1,1)
FILE_TIME_MICROSECOND=10#FILETIME计数为100纳秒间隔=0.1微秒,因此其中10个为1微秒
def从文件转换时间(文件时间):
微秒\u自\u文件\u时间\u历元=文件\u时间//文件\u时间\u微秒
返回文件\u TIME\u EPOCH+datetime.timedelta(微秒=自\u FILE\u TIME\u EPOCH起的微秒)
另一方面是:

def转换为文件时间(日期时间):
微秒\u自\u文件\u时间\u历元=(日期\u时间-文件\u时间\u历元)//datetime.timedelta(微秒=1)
返回微秒\u自\u文件\u时间\u历元*文件\u时间\u微秒

那么您的意思是想在正常日期时间中转换一些历元时间,对吗?对不起,我使用的是
导入datetime datetime.timezone.utc
给出错误“AttributeError:'module'对象没有属性'timezone'。为什么?@Echo:也许你没有使用python3?我使用的是python2
>>> filetime_to_dt(ft)
2004-02-12 02:28:57