IBM Support

IBM i简化闰年

Technical Blog Post


Abstract

IBM i简化闰年

Body

IBM i简化闰年

现在,你可能已经听说今年是闰年。你对闰年是什么和为什么有闰年也有很好的理解。但是,如果你没有听说2012年是闰年,或者手边没有一个日历,你知道如何确定哪些年的二月会多一天吗?如果你的答案是“这很简单!把年份除以4,如果没有余数,那么它是闰年”。大部分的时间,你是正确的......但是,闰年还有比这更多的东西。

我们需要闰年来保持我们的日历与地球绕太阳的公转一致。在公历中,一般年份由365天组成。但地球围绕太阳一圈所需的实际时间是365.2422天。对于两个闰年之间的年份,每年只有365天, 比实际时间短了大约6小时。因此,使用四年一次的366天的闰年来“赶上”这三年的不足时间。然而,每年的不足时间不是刚刚好6个小时。它每年约比6小时少11分钟。所以,最终,这个时间差也需要被考虑。

为了消除每4年中增加的额外部分,公历会跳过被100整除但不能被400整除的年,不把他们设为闰年。例如,1900年,2100年和2200不是闰年,但2000年和2400年是闰年。

IBM i操作系统使用同样的方法来为你确定哪些年有365天,哪些年有366天,所以你不必为记住这些规则而担心。这些都是自动处理的,而不必为闰年做任何设置。但你可能想知道“那么,为什么有闰年调整的系统值(QLEAPADJ)?这个值又有什么用呢?”

QLEAPADJ系统值是用来调整不同的日历系统中的关于闰年的系统日历算法。对于公历系统,闰年调整值为0(即不需要调整)。但是其他的日历系统可能需要进行调整。例如,泰国佛历的2555年是公历的2012年。2555年是闰年,但是2555除以4的余数是3。因此,需要为泰国佛历调整系统日历,QLEAPADJ系统值应设置为3。对于V5R4或更早的系统,这个系统值可以被修改为由上述计算确定的值。但是,在V6R1及以后的版本中,你不能再改变这个系统值。相反,系统会根据系统时区(QTIMZON)中定义的年偏移量(YEAROFS)来为你计算QLEAPADJ的值。

年偏移量是某个时区使用的日历系统的年份和当前的公历系统的年份之间的差值。例如,如果今年在公历是2012年,在泰国佛历是2555年,那么年偏移量(在理论上)将是5432555减去2012)。但2555年超出了IBM i操作系统支持的日期范围,所以泰国的系统将需要选择一个在支持范围的不同的基准年,如1955年。该系统将运行在当前公历年(2012年),也将设置QTIMZON时区对象的年偏移量为-571955减去2012)。年的最后2位数字仍然将会正确显示(55)。

         然后,操作系统使用年偏移量来计算各种日期时间相关的值,如格式化日期和星期几。为了确定一个特定时区的正确日期,系统需要一个存储在世界协调时(UTC)的日期时间值、时区偏移量(时区与UTC的时差,如果需要的话,为夏令时需要调整)和年偏移量。

V6R1中增加了年偏移量的支持。根据当前年和年偏移量,系统可以自动设定QLEAPADJ系统值。为了与公历闰的天数一致,可以使用公式((本年份+年偏移量)/ / 4 = QLEAPADJ)来计算闰的天数。现在,只要年偏移设置正确,星期几的计算也就会正确(例如,公历的2012215日是星期三,泰国佛历的1955215日应该也是星期三)。 V6R1之前,由于没有年偏移量,即使QLEAPADJ被设置为31955215日也会是星期二)。

日历系统处理起来是很复杂的。但是通过创建许多世界各地的最常用时区的时区对象,IBM i帮你简化了这项工作,它不需要你的任何输入就可以知道哪些年有闰日,哪些年没有。

原作者: Angela Newton
译 者:  Su Dong Dong 

[{"Business Unit":{"code":"BU009","label":"Systems - Cognitive"}, "Product":{"code":"SWG60","label":"IBM i"},"Component":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"","Edition":""}]

UID

ibm11145470