我不认为 AS/400 日期在内部存储为从纪元日期1开始的某些天数(这是您所谓的“零日期”的更常见术语)。正如 Tracy Probst 所说,这绝对不是本机 AS/400 物理文件中的日期字段的样子。2
但是,如果您用于提取数据的任何方法都将其作为自一个纪元以来的天数提供给您,那么这并不重要。理想情况下,您应该通过直接查看 AS/400 或询问有能力的人来了解预期的日期。如果 AS/400 上的日期是 2009-07-30,而你得到的是 40022,那么你可以非常确定纪元日期是 1900 年 1 月 1 日。如果你得到 40024,那么纪元是 12 月 30 日, 1899. (当然最好比较一堆日期,最好是不同年份的日期,以防止可能使用朱利安日期。)
此外,正如特雷西对他自己的回答所评论的那样,将日期存储在通用数字字段中是非常常见的(如果您的检索方法报告 Decimal 作为数据类型,我会猜到这一点),在这种情况下,它真的没有什么可做的无论如何都要使用 DB2 的内部日期格式。您应该知道,到目前为止,存储在 AS/400 数字字段中的最常见的日期格式如下或其变体:
- yyyymmdd(公历,ISO 4 位数年份)
- mmddyy(公历,美国 2 位数年份)
- yyyyddd(所谓的儒略,4 位数的年份)
- yyddd(所谓的儒略,2 位数的年份)
- 年月日
- cyymmdd(IBM 带有世纪标志的疯狂发明)
Julian 日期中的 ddd 是从年初开始的天数。IBM 疯狂日期中的 c 是 0 表示 19yy 或 1 表示 20yy。我还没有听说有人在“四百人”上存储自时代以来的日子,但也许您遇到了来自另一个平台的转换者。AS/400 的大型机传统强烈支持人类可读的日期。
1 AS/400(现在称为 IBM i)确实有自己的日期数据类型,而且这种数据类型实际上在内部确实包含一个纪元的天数。但那个时代已经过去了数千年,距离 20 世纪之交还很远,甚至还没有接近共同时代的开始。IBM 喜欢将这个天数称为Scaliger 数字,但对于大多数研究这个东西的人来说,它被称为Julian Day Number。您可能已经从我的回答的主要部分注意到,IBM 使用“儒略”一词来表示完全不同的东西(甚至与儒略历无关)。也就是说,IBM 所谓的“朱利安日期”真的是来自 ISO 8601 的序号日期。
2日期数据类型的内部格式非常低级,并且对用户(包括大多数程序员)大多是隐藏的。表面上显示文件“实际内容”的 DSPPFM 命令至少“为时已晚”一步:它报告的值已经从内部的 4 字节“Scaliger 编号”转换为人类可读的形式。