我需要将datetime.datetime(2018, 4, 1, 16, 22, 9, 920000)
转换为Delphi TDateTime值43191.68205925926
,在Python版本< 3.2。
我试过
def pdt2ddt(pydt): # py datetime into delphi time
start = datetime.datetime(1899, 12, 30)
delta = pydt - start
seconds = (delta - datetime.timedelta(days=delta.days)).total_seconds()
return seconds / 3600 / 24
但timedelta.total_seconds()
仅在python版本为3.2及以上时才有效。
Delphi TDateTime
值表示为自1899-12-30午夜以来计算天数的双浮点值。
答案 0 :(得分:1)
德尔福值是自特定时代1899-12-30以来的天数。从值构造一个timedelta
作为days
参数,并添加从Delphi到Python的epoch,然后以另一种方式,在Python datetime和epoch之间生成一个delta,并划分由timedelta(days=1)
值(Python 3.2 / Python 2.7及更新版本)得出结果,或者只是将seconds
和microseconds
组件加起来除以旧版Python版本中一天的秒数:
from datetime import datetime, timedelta
# A delphi datetime value is the (fractional) number of days since the epoch
# e.g. 42 minutes past the the UNIX epoch is 25569.029166666667 in Delphi terms.
DELPHI_EPOCH = datetime(1899, 12, 30)
def datetime_fromdelphi(dvalue):
return DELPHI_EPOCH + timedelta(days=dvalue)
def datetime_todelphi(dt):
try:
return (dt - DELPHI_EPOCH) / timedelta(days=1)
except TypeError:
# Python 2.7 / Python 3.1 or older don't support division
delta = dt - DELPHI_EPOCH
return delta.days + (delta.seconds + delta.microseconds / 1000000.0) / 24 / 3600
这只是使用调整后的equivalency documented for timedelta.total_seconds()
版本来获取浮点数的确切天数。
演示:
>>> datetime_fromdelphi(43191.68205925926)
datetime.datetime(2018, 4, 1, 16, 22, 9, 920000)
>>> datetime_todelphi(datetime(2018, 4, 1, 16, 22, 9, 920000))
43191.682059259256