如何将 python 日期时间转换为 delphi TDateTime?

How to convert a python datetime to a delphi TDateTime?

我需要在 Python 版本 < 3.2.

上将 datetime.datetime(2018, 4, 1, 16, 22, 9, 920000) 转换为 Delphi TDateTime 值 43191.68205925926

我试过了

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

Delphi 值是自特定纪元 1899-12-30 以来的天数。从作为 days 参数的值构造一个 timedelta,并添加从 Delphi 到 Python 的纪元,反之,在 days 之间产生一个增量=25=] 日期时间和纪元,并将结果除以 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

与 evalStr() 搭配使用效果也很好:

PyEngine_netA.ExecString(('from datetime import datetime, timedelta'));
PyEngine_netA.ExecString(UTF8Encode('DELPHI_EPOCH= datetime(1899,12,30)'));
PyEngine_netA.ExecString('def datetime_fromdelphi(dvalue):'+LF+
                         '  return DELPHI_EPOCH + timedelta(days=dvalue)');
println(PyEngine_netA.EvalStr(('datetime_fromdelphi(43191.68205925926)')));