如何将 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 和更新版本)或者只是将 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
与 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)')));
我需要在 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 和更新版本)或者只是将 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
与 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)')));