从 DBF 转换 stange 3 字节十六进制日期格式

发布于 2025-01-09 06:31:24 字数 1759 浏览 1 评论 0原文

我需要使用一个 DBF 文件(dBASE III PLUSE,带备忘录),其中包含格式奇怪的日期值。这些值保存为每天计数的十六进制数字。

现在出现了奇怪的部分,计数器每月跳跃一次(比较例如整数值),每年跳跃两个值。基本上,它计算 00 月和 00 日。

编辑:此外,它按每月 31 天计算,例如二月底。

编辑2:我之前没有看到的另一个奇怪的实现是,每个字节/十六进制值计数仅直到7F,然后下一个字节计数增加,例如2001 -02-15-> 2001-02-16...

HEX         Integer    Date       * not a valid date
====================================================
2E 22 30    3023408    1970-00-00 *
2E 22 31    3023409    1970-01-00 *
2E 22 32    3023410    1970-01-01
2E 22 33    3023411    1970-01-02
2E 22 34    3023412    1970-01-02
[...]
2E 22 50    3023440    1970-01-31
2E 22 51    3023441    1970-02-00 *
2E 22 52    3023442    1970-02-01
[...]
2E 22 6D    3023469    1970-02-28
2E 22 6E    3023470    1970-02-29 *
2E 22 6F    3023471    1970-02-30 *
2E 22 70    3023472    1970-02-31 *
2E 22 71    3023473    1970-03-00 *
2E 22 72    3023474    1970-03-01
[...]
2E 25 30    3024176    1970-12-31
2E 25 31    3024177    1971-00-00 *
2E 25 32    3024178    1971-01-00 *
2E 25 33    3024179    1971-01-01
[...]
2E 7F 7F    3047295    2001-02-15
2F 00 00    3080192    2001-02-16
[...]

有了这些知识,我可以生成从 1900-01-01 到 2038-01-18 的列表,请参阅 example.txt

这是一个已知的模式,我只是从未听说过吗?
有没有一种简单的方法可以前后转换日期?


正如 @js2010 指出的,它可能是 3 字节上次更新日期,在 YYMMDD 格式结构中,请参阅 dbase.com/Knowledgebase/INT/db7_file_fmt.htm 。虽然没有真正进一步的解释。

I need to work with a DBF file (dBASE III PLUSE, with memo) which contains weirdly formatted date values. The values are saved as HEX numbers counting up for each day.

Now comes the weird part, the counter jumps (compare e.g. integer value) every month one and every year two values. Basically, it counts a 00 month and a 00 day.

EDIT: Further it counts for every month 31 days, e.g. end of February.

EDIT 2: Another strange implementation I didn't see before is, that each byte/hex value count's only until 7F and then the next byte count's up e.g. 2001-02-15 -> 2001-02-16...

HEX         Integer    Date       * not a valid date
====================================================
2E 22 30    3023408    1970-00-00 *
2E 22 31    3023409    1970-01-00 *
2E 22 32    3023410    1970-01-01
2E 22 33    3023411    1970-01-02
2E 22 34    3023412    1970-01-02
[...]
2E 22 50    3023440    1970-01-31
2E 22 51    3023441    1970-02-00 *
2E 22 52    3023442    1970-02-01
[...]
2E 22 6D    3023469    1970-02-28
2E 22 6E    3023470    1970-02-29 *
2E 22 6F    3023471    1970-02-30 *
2E 22 70    3023472    1970-02-31 *
2E 22 71    3023473    1970-03-00 *
2E 22 72    3023474    1970-03-01
[...]
2E 25 30    3024176    1970-12-31
2E 25 31    3024177    1971-00-00 *
2E 25 32    3024178    1971-01-00 *
2E 25 33    3024179    1971-01-01
[...]
2E 7F 7F    3047295    2001-02-15
2F 00 00    3080192    2001-02-16
[...]

With this knowledge, I could generate a list from 1900-01-01 until 2038-01-18, see example.txt.

Is this a known pattern, I just never heard about it?
Is there a simple way to convert date back and forward?


As @js2010 pointed out it's probably the 3 byte Date of last update, in YYMMDD format structure, see dbase.com/Knowledgebase/INT/db7_file_fmt.htm . Though there isn't really a further explanation.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文