通过Python的ctypes使用gmtime()

时间:2017-10-27 19:53:51

标签: python datetime ctypes

我尝试从Python访问C&#39 {1}函数以避免gmtime(),因为当我尝试转换大列时似乎耗费了大量时间时间戳长值。这就是我所拥有的:

datetime.datetime. fromtimestamp()

无论我输入什么号码,我都会得到from ctypes import * libc = CDLL('msvcrt.dll') gmtime = libc.gmtime gmtime([any timestamp I try])

  

OSError:异常:访问冲突读取0x0098967F

我必须犯错误,但我无法弄明白。有人可以指出我的错误吗?

修改

将最后一行替换为:

17181872

没有解决问题 - 我得到gmtime(byref(c_int64([any timestamp I try]))) 以回应我输入的任何数字。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

gmtime的定义:

struct tm *gmtime(const time_t *clock);

所以你需要提供一个指针:

tm = ctype.c_int64(1505656543)
gmtime(ctypes.byref(tm))

gmtime的返回类型是指向结构的指针:

class TimeStruct(ctypes.Structure):
    _fields_ = [
        ("tm_sec", ctypes.c_int),
        ("tm_min", ctypes.c_int),
        ("tm_hour", ctypes.c_int),
        ("tm_mday", ctypes.c_int),
        ("tm_mon", ctypes.c_int),
        ("tm_year", ctypes.c_int),
        ("tm_wday", ctypes.c_int),
        ("tm_yday", ctypes.c_int),
        ("tm_isdst", ctypes.c_int),
    ]
gmtime.restype = ctypes.POINTER(TimeStruct)

time_data = gmtime(ctypes.byref(ctypes.c_int64(1505656543)))
print(time_data.contents.tm_hour)

但是没有必要自己做这一切。 time.gmtime是C函数gmtime周围非常薄的wapper。我怀疑你能比它更快地得到它。