Delphi tclientdataset .cds datetime binary timeformat unpack

时间:2015-04-23 22:14:07

标签: delphi parsing datetime tclientdataset

我正在尝试解析.cds delphi数据库文件。简单的int值和字符串很容易解析。但唯一一个我无法理解的是DateTime格式。 我找到了影响DateTime值的6个字节

我正在使用python和以下代码:

data = '\x00\x00' + '\xBC\xCE\x6F\xEC\xE7\xCC'
data_long = struct.unpack('Q', data)[0]

但是struct.unpack没有6个字节的类型值,所以我添加了\ x00 \ x00来生成8个字节的长值(' Q'选项)

这是一个小样本.cds文件,其中一行https://yadi.sk/d/PkZKy50YgCmqE

  

DateTimeIssl value =" 16.04.2015 9:25:47"

我发现了6个十六进制值,但无法正确解压缩。 任何人都可以告诉我如何阅读它,或者可能给我一些关于.cds文件结构的文档的链接?

更新 好!感谢Deltics指导我如何阅读TDateTime。我在互联网上找到了一些测试值,我编写了解码函数,将其转换为Python日期时间对象。

data = '\x2E\xD8\x82\x2D\xCE\x47\xE3\x40'

data_double = struct.unpack('d', data)[0]
double_split = str(data_double).split('.')

SECONDS_IN_DAY = 60*60*24
time_from_starting_date = timedelta(days=int(double_split[0]), seconds=int(SECONDS_IN_DAY * (float(double_split[1]) * pow(0.1, len(double_split[1])))))

starting_date = datetime(1899, 12, 30)
result_date = starting_date + time_from_starting_date

print time_from_starting_date
print result_date
  

对于 2E D8 82 2D CE 47 E3 40 08.02.2008 10:38:00 。   工作正常。

但我仍然无法在上面链接的文件中找到有效的8字节字段 DateTimeIssl 。也许有不同的日期时间格式?

2 个答案:

答案 0 :(得分:5)

Delphi日期/时间(TDateTime)是双精度浮点数。这是一个8字节的值。您不需要添加任何打包或空字节。如果您不得不这样做,那么您还没有在文件中正确识别双重值。

查看您链接到的示例CDS,每个可以理解为日期/时间的值(例如DateRoshd,DateTimeIssl)后跟8个字节的数据。

读取双倍值后,该值的整数部分表示日期为1899年12月30日以来的天数。小数部分是该日期的时间。

e.g。

1.0 = 31 Dec 1899, 00:00 (midnight)
2.5 =  1 Jan 1900, 12:00 (midday)

More information on the Delphi TDateTime data type can be found here

答案 1 :(得分:0)

回应自己。也许对某人来说它会很有用。 在二进制格式中,TClientDataSet DateTime包含自02.01.0001以来的 INTEGER 值毫秒,但存储为8字节 DOUBLE 所以你必须读取8个字节,将其解压缩为double,然后将值转换为整数。这是适用于我的Python代码:

data = '\x00\xBC\xCE\x6F\xEC\xE7\xCC\x42'  # Time: 2015-04-16 09:25:47
data_double = struct.unpack('d', data)[0]

time_from_starting_date = timedelta(days=-2, milliseconds=long(data_double))
starting_date = datetime(0001, 01, 02)
result_date = starting_date + time_from_starting_date

print "Time:", result_date