如何将python datetime转换为delphi TDateTime?

时间:2018-04-01 14:21:38

标签: python datetime python-datetime

我需要将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午夜以来计算天数的双浮点值。

1 个答案:

答案 0 :(得分:1)

德尔福值是自特定时代1899-12-30以来的天数。从值构造一个timedelta作为days参数,并添加从Delphi到Python的epoch,然后以另一种方式,在Python datetime和epoch之间生成一个delta,并划分由timedelta(days=1)值(Python 3.2 / Python 2.7及更新版本)得出结果,或者只是将secondsmicroseconds组件加起来除以旧版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