用于儒略历日和农历日期之间转换的计算装置和方法

文档序号:6553636阅读:1056来源:国知局

专利名称::用于儒略历日和农历日期之间转换的计算装置和方法
技术领域
:本发明涉及一种在计算装置中进行儒略日#丈(Juliandaynumber)禾口农历日其月(Chinesecalendardate)之间的4争4灸的方';去,还涉及一种用于实施这样的转换的计算装置。
背景技术
:如本文所使用的,术语计算装置应广义地解释为涵盖任何形式的用电计算装置,并且包括数据记录装置、任何形式或类型的计算机(包括诸如个人数字助手(PDA)的手持和个人计算才几)、和任何形式的通讯装置(包4舌移动电话,智能电话,集通信、图像记录和/或重放、以及计算功能于一体的通信装置)、以及其它形式的无线和有线信息装置(包括数码相机、MP3和其它音乐播放器、以及数字无线电通信)。农历是高度复杂的。其并非是纯粹的阳历,如标准的长期实行的公历。阳历是基于太阳的每年循环,并保证季节在每年的相同日期附近出现。纯阳历的不利方面在于月亮的盈亏通过月^f分改变(运转),而并不依赖于月份中的特定日子。农历决不是纯阴历,如穆斯林历。阴历是基于月亮的每月循环,并保证其盈亏与每月中的相同日期一致。纯阴历的不利方面在于季节通过年份变化,而并不依赖于任何月寸分。农历是阴阳历。这些与阴历的相似之处在于它们的月份是基于月亮循环的,使得其盈亏与每月的相同日子保持一致。但是,它们还与阳历有关,在于它们要求年度和季节性现象在每年的相同月份附近出现。该要求是通过每两年或每三年插入闰月以确保阴历和阳历组元〗呆持基本同步来满足的。农历并非是这类型仅有的历法;在以色列和犹太人用于传统目的4吏用的希伯来历(Hebrewcalendar)也是一种阴阳历。^f旦是,与复杂的农历不同,希伯来历对于计算装置来说相对容易进行处理。这是因为,它是一种超过1000年的基于独立^见则的历法,并不需要任何外部天文数据的-验证。例如,月4分长度是固定的,并且如果需要一个闰月,则将总是出现在该年的第一月之前。因此,想知道某个时期之后是什么日期,或进行犹太历日期(Jewishdate)和格里日期(Gregoriandate)之间的转4灸,是直4妻的过,呈。农历是极不相同的。正如IBM指出的(http:〃www-306.ibm.com/software/globalization/topics/locales/calendar—chinese.jsp),"与希伯来^不一,,希俗,^的/^半##^"能##錄卓,而/上7刀,惑^在该半初/^財柯A现,但,尹濕f^t^J/^半和/々刀^€差于天X观蔡^复杂的#而#的。([/"/,'feAe//e&ewca/e"(iaA;w/zeref/eye"rs1c,ca/cw/"fedvery57.wp/_ycwdf/zez'"fercot/arjwowf/2"/w""op/eoT51Ae"weq/"f/ze_year,C7n'wese/eopwow^arecom/wfec/Z)asec/owastra"ow/ca/在处理农历时要面对的基本问题是,其规则不是独立的、真实的天文数据(而不是任何简化的近似)是最重要的,而所有的失见则描述的是当出现特定天文现象时发生的事情。所论及的关键天文现象是太阳和月亮之间会合(称为暗月(darkmoon))的准确时间,也是太阳经度^争过从春分(称为仲期(zhongqi))开始测量的30°的精确倍数的天数。这听起来相对比较直接,但是很容易低估历法运算对实际天文现象的依赖性的难度。数据实际上是极其复杂的;大多数人并未意识到太阳和月亮的运动实际上是十分不井见则的,并且每天的长度和每月的长度在全年中是变化的(并且从一年到下一年也是如此)。在进4亍历法运算时,农历一直〗吏用这样的时间间隔的真实值(而不是平均l直,^口在西历(WesternGregoriancalendar)中4吏用的24小时/天,或在希伯来历中大多数年交替为29天和30天的月份)。真实太阳和真实月亮的这种应用,-使得预先计算日历所需的运算高度复杂。其结果是没有一个月具有固定的长度,这就意味着闰月可能出现在年中的任何点。由于没有知晓当前月份的长度或下一月^^的名称的简单方法,如果不查询和参照预先计算的历法表,西历使用者想当然的做法(如找出从现在起哪一天是6周)将是十分困难的。这同样适用于进行农历日期和其它日期、特別是格里历日期之间的转换。而且,每25,800年的二分点的岁差、每110,000年的地^求4九道的旋转、以及每天2毫秒的地球旋转减慢都意味着这种天文数据总是唯一的,并且与其它的、非天文的历法相比,农历永远不会重复本身。总之,如果进行任意的农历日期的处理,就无法避免采用复杂的运算。自乂人1949年以来,南京紫金山天文台(PurpleMountainObservationinNanjing)就负责确定农历中的日期。然而,期望利用农历的计算装置能够利用由EdwardM.Reingold和NachumDershowitz开发的实际正则方程,该方程在他们的书《历法计算》("CalendricalCalculations",MilleniumeditionpublishedAugust2001byCambridgeUniversityPress,ISBN:0521777526)的各种片反本中都能找到。进4亍农历日期的历法运算的标准方法是利用相等的儒略曰(JulianDay)作为中介。不要与前格里儒略日混淆,儒略日是从BCE(公元前)4713年1月1日起对天数进行连续编号,其,皮广泛<吏用,尤其是天文学家。它是在1582年引入格里历后不久在法国由J.J.Scaliger发明的,并提供了一种唯一参照与历法无关的任何历史日期而且无需^f吏用负^:的方法。Reingold和Dershowitz方程-使得能够在儒略日凄t与任4可历法的任何日期进行相互转换。因此,当应用于农历时,农历日期能够与其它任4可历法系统进行相互转换。而且它们还能够对农历曰期(Chinesedate)执行算术运算;例如,为了找到两个任意农历日期之间的日期数,要作的所有工作是把它们转换成儒略日数并执行算术比较。对于农历的复杂度的更多信息,清查阅新加i皮国立大学凌t学系的HelmerAslaksen的才示题为"TheMathematicsoftheChineseCalendar"的i仑文,连同该作者的多篇其它i仑文在网址http:〃www.math.nus.edu.sg/aslaksen/calendar/chinese.shtml中者卩負fe查到。已知现代计算装置都包括日历信息和数据。最重要的是,这在个人信息管理器(PIM)型软件(如Agenda和Scheduling软件)中是常见的。尽管这样的计算装置的许多使用者从不需要在不同曰历系统之间进行转换,但是这对于在多种文化环境中操作的使用者来说并非如此。根据IBM,"斜作全球众^的成功軟伴,需要夬S乂乂0源和好柯到数字格式的她区细<formula>formulaseeoriginaldocumentpage8</formula>本发明是特别关注其所有者需要执行以下任务的计算装置的常见情形.-执行农历日期的算术运算,如找出在30天时间内是什么曰期在农历和才各里历4各式中保持一致的历法lt据在农历和任何其它历法中保持一致的历法#:据在近几年,已经扩展了这样的计算装置的分类,并且现在包括诸如移动电话和个人凄t字助理(称为PDA)以及台式计算才几的装置。此外,随着技术汇集,诸如游戏机和音乐插-放器的装置也日渐可能包括PIM功能。在这些装置的4吏用者在农历是主要历法或者净皮广泛使用(例如,在中国大陆以及香港、台湾、新加i皮)的地方进行操作的情况下,对农历日期的算术运算和快速且容易地与西历进行转换对于充分使用PIM功能来说都是需要的。然而,已知由于上面所3是到的Reingold和Dershowitz方程必需对地J求、月J求和太阳建才莫而使得计算昂贵。而且,不Y又要花4艮长时间完成计算,而且还需要持续参照庞大的天文数据表。实现农历和其它历法之间的转换算法的任何计算装置都会受到CPU加载和存储(记忆)条件的限制。另外,还知道即4吏是与移动电话和PDA相比具有專交大计算资源的桌面系统的软件,这也会产生问题,参见,侈'H口,DenisA.Elliott的i仑文"CalendarSystemFacts",i亥i仑文可以在以下网i止查到http:〃homepage.mac.com/rabbel/.cv/rabbel/Public/PDF'syo20andM20DElliot是一皮详尔为"Intercal"的AppleMacintosh禾呈序的4乍者,该程序能执行许多不同历法系统之间的转换的计算,而Elliot十分清楚,"需要大量的浮点计算"。Elliot还特别谈到他的设计限制之一是方程的巨大CPU开销。与诸如台式和膝上型PC的更大的"固定"计算装置相比,诸如智能电话和PDA的移动装置通常受到资源的限制,这是因为它们具有受限的内存、有限的储存容量、较慢的处理器、以及有限的电池电量。然而,它们的所有者和使用者却期望大多数操作能够是'决速的)欠秒、纟及响应(sub-secondresponse),类似、于只于无资源卩艮制的台式PC的期望。与固定装置相比,如果这些资源受限的移动装置利用如Reingold和Dershowitz方禾呈的标准方法进4亍涉及农历日期的运算才喿作,就会导致更为严重的问题。因此导致低性能的高强度计算、对大量列表数据的需求是对于在资源受限装置上使用方便和双曰历能力的PIM系统^皮普遍采用的两个主要障碍。因此,需要一种处理涉及农历日期(和数据)运算操作(需要)较小CPU强度的方法。
发明内容因此,本发明的一个目的是才是供一种改进的处理涉及农历曰期(和数据)运算操作(需要)较小CPU强度的方法,这种方法不涉及浮点运算,并且也不需要大量的内存。因此,本发明对于资源受限的移动装置是理想且特别适合的,并且在用于这样的装置中时可提供显著的技术效果。然而,如从以下的详细描述将会更加明显的,这种方法对于较少受到资源限制的"固定"计算装置也会带来:忮术效果;除此之外,还包括在任何计算装置中都没有过度CPU开销的方法4吏用的功率明显降低、运算更快,因而更加环境友好。才艮据本发明的第一方面,4是供了一种才乘作用于在农历日期和儒略日数之间进行转换的计算装置的方法,该方法包括在计算装置的存储器中存储表示以下内容的信息a.包含在每一中国(农历)年的范围内的的月份长度;b.如果有闰月,则包含在每一中国年的范围内的的哪些月份是闰月;以及c.用于在该范围内的普通日的至少一对儒略日数和农历日期数据;并且^吏计算装置的中央处理单元(CPU)利用存储的信息进行农历日期和儒略日数之间的转换。根据本发明的第二方面,提供了一种计算装置,被设置用于根据第一方面的方法进行操作。根据本发明的第三方面,提供了一种操作系统,用于使计算装置才艮据第一方面的方法进行操作。现在将参照附图,进一步仅通过实施方式来描述本发明的实施方式,附图中图1示出了用于确定在任何农历年中出现的29天和30天月份的过禾呈;以及图2示出了根据本发明的用于在儒略日数和农历日期之间进行转换的过程。具体实施例方式首先,为了理解本发明,有必要解释为什么查找表格还未被广泛用于解决上述问题。这对本领域的技术人员可能遇见过,可以合理地指定对装置有意义的时间^:,冲丸行Reingold和Dershowitz方程进行计算的选项是预先进行运算的,并在保存于该装置中的按序排列的列表中排列所获得的每个农历日的数据。这就能使用直接查找表格而找到涉及农历日期的任何历法运算的答案。这类型的查找表格不是解决这类问题的可行方案的原因是因为数据量过大。农历日期至少由以下五种独立日期单4立组成*循环(每个循环为60年)*循环中的年度*年度中的月份*月份是否是闰月*月4分中的曰在传统的数据结构中存储这些需要5个整数;因为大多数计算装置利用32位的整数,所以对于标准查找表格的条件将会是20字节(5x32=160个整^:)/天,或超过7K字节/年。资源开销迅速增加。例如,4叚i殳需要该装置应该至少能够处理19802100(4各里历)年度范围内的日期。这个120年的范围包括43,830天,这就产生了约856K字节的数据转换开销。在智能电话或PDA装置中ROM(只读内存)的大小为8兆字节;4艮显然,这种有价值的关^t资源-故单个日历表格占据10%以上的资源是既不实用也是不可接受的。事实上,这种表才各化凄t据可以进行一些优化。可以将数据结构打包并去除冗余信息(如当在任何给定的120年时期内至多存在3个循环时就储存完整的循环)。这能够(在进行H据查询时属于无效成本)将完整的农历日期存^f诸在单个32^立整凄t中,因此将减少80%的开销(消耗)。这对于用于以上给出的120年时期的样本的约171K字节的ROM开销1氐4艮多。尽管这是一个相当大的改进,但是事实上,在移动装置的只读存储器(ROM)中空间是非常宝贵的。假定非农历的固定历法的同等开销有效地为零,采用表才各驱动方法就会不可避免地意口未着激活具有农历功能的装置的版本就会需要更大的ROM(导致产品成本增加以及使用NANDflash技术的装置的引导时间更长)或降低的功能性(导致使用者体验变差)。由于这些原因,迄今还未在资源受限的移动装置中实现有效表格驱动的方法。然而,本发明能够降低预编i奪的农历信息开销,由最初20字节/天的基本上"优化的"开销减少到微不足道的仅6字节/年,提供了显著的技术效果。因此,在以上给出的120年时期的情况下,获得了由最初的856K字节的存储需求降低到只有0.7K字节的存储需求。在表格开销中的超过99.9%的这种减少显然远远优于先前的数据打包的优化方法(其仅能够减少80%的数据开销),并且提供的附加技术效果是能够使基于Reingold和Dershowitz方程执行计算代价较高的快速(on-the-fly)计算而无需在装置中包括巨大且难处理的数据表格。因此该装置的技术性能得到显著改进。在本发明之后的关键领悟之处在于,理解农历中什么是确定的和什么是不确定的。或者,换一种方式,要问的问题是如果起始点是对应于特定儒略日的固定农历日期,则试图计算对应于该曰的农历日期的每个下一日,在什么点运算结果将会变得不确定,以及需要什么信息才能使序列可靠地进行下去?如果序列以任何已知的儒略日及其对应的农历日期(即,对于该日期的以上所列5个独立tt据单元是已知的)开始,则由此可以得知,当第一次接近包含该农历日期的农历月结束时就会遇到第一个问题。在该点上需要的信息有两条;第一条是在该月中有多少天(必须是29天或30天),而第二条是下一月是否为闰月(是或者不是)。一旦可以得到该信息,就可以继续该序列;当前月何时结束是已知的,而下一个月序号也是已知的。值得注意的是,即使是在农历年末这也保持这样;当到达任意第12月末时,如果下一个月不是闰月,则农历新年就已经到来。因此,下一个(新)月^f分就可以^皮重置为1,可以重置闰月指示符,可以增加年份,而最后可以进行检查以确定年份是否超过60(循环持续时间),在这种情况下增加循环(周期)并将年份重置为1。图1示出了用于确定包含在该范围内的每一农历年中的月^分长度以及如果有闰月的情况下包含在该范围内的每一农历年中的月份为闰月的过程。这种信息在计算装置中被储存为表格。存在多种以有效列表方式对该信息进行编码以在计算装置上沣皮i文i十用于SymbianSoftwareLtd生产的移动电^舌中的SymbianOSTM操作系统。下面将阐述用于实现本发明的样本编码的实施例。编写SymbianOStm操作系统的那些本领域技术人员在结合现在提供的本发明描述进行阅读时将会易于理解其目的和意图。然而,应该J里豸罕,以下描述的实i见,以及所示的实施例,4又用于举例说明的目的。应该强调,本发明并不旨在4又限于SymbianOStm操作系统或以下描述的特定实现。在不背离本发明的范围的情况下,本发明可以以多种方式在多种不同才喿作系统和多个不同装置(包括其它类型的计算装置)上实现。现在描述的本发明实施方式对关于年4分中哪一个月是29天和哪一个月是30天,在每年所用的单一位映射的16—立整凄史中进ft编码。注意,在通常的年份中有12个月,或者在闰年中有13个月(每个太阳年(solaryear)只可能有一个闰月)。本实施方式指定了用于才各里年(Gregorianyear)中的计算装置的范围;示出了用于19802100年的实现,因为这能够很容易地与资源缺乏的上述现有技术解决方案相关。样本码显示了一皮称为TCalconData::iCalConDataMonth的文件CALCONDATA.CPP中的这样的整教:凄t组。乂人该凄t组中可以看出,在所考虑的日期范围内,对于所述120年中的每一年各具有一个16-位整凄t。格里年1980的开始位于这120年时期中的农历第一个循环的年55中;这就解释了附于H组中第一个整H的055注释,并使得这一改进易于被理解。很重要地,认识到格里年1980的起始是农历年55的末尾,而农历年55不是4各里年1980的开始后^艮快开始的年。由于农历新年总是在一月或二月,格里年1980的开始就将是农历年55的最后一月或者是倒数第二个月。还有必要了解农历年55是否是闰年、当前月是否是闰月、以及在这年中其余的月份此,附于格里年1980的信息还必须参考起始于一各里年1979的那个农历年。在TCalconData::iCalConDataMonth中的第一个整凄t是38608,其对应于16位的二进制数组1001011011010000,并且这包含农历年55的信息。在本发明的该实施例中,该序列中的二进制'r位型用于指示30天的月份,而二进制'0'位型用于指示29天的月份。在TCalconData::iCalConDataMonth中的第二个整数是38320,其包含农历年56(其开始于才各里年1980)的信息;该整凄i:^"应于二进制教j且1001010110110000。因此,该整凄t指示乂人农历年56开始的第一、四、六、/v、九、十一和十二月^f分具有30天;该年中其余月4分具有29天。文件CALCONDATA.CPP中的第二个彰组称为TCalconData::iCalConDataYear,其由32-位整数的数组构成。同样,每一年对应有一个整数;该数组所示的注释很清楚地表明,这些匹配前一数组的数据。每一整数」提供了各个年份更多的信息。每一整数也提供关于各个年什么时候开始、该年中是否有闰月、以及如果有是哪一个月的信息。在该数组中第一个整数是1881492094,这为我们提供了当前在格里年1980开始的农历年55的信息。这个32位整数的28个最低有效位包含了对应于农历年55开始的儒略日。18814920947于应于二进制It纟且0111000000100101010010100U1U10,因此,二进制数0000010010101001010011111104是供了这种信息。这些27个最低有效位对应于儒略日2443902。由儒略日向格里日期的转换是十分直4妄的,并且在运算上不是昂贵的。这样的转换表明儒略日2443902只于应于才各里日期1979年1月28日,因此,该日期是农历年55的新年的日期。对应于1881492094的32位整^t的四个最高有效位是0111,其对应于7。这种编码是在开始于1979年1月28日的农历新年中哪些月份是闰月(如果存在)的信息。在农历年中只出现一个闰月。因此,在这种情况下,可以看出,农历年55是闰年,而该年中的第7个月是闰月。应该注意的是,这意味着该年的第7个月实际上闰月6月,而非闰月7月实际上是该年中的第8个月。在该数组中第二个整It是2444286;这对应于二进制序列位是OOOO,其对应于零。这意味着农历年56并不包含闰月,因而该年也不是闰年;28个最^氐有效位对应于儒略日2444286,其对应于1980年2月29日,因此这是农历年56的新年。文件CALCONDATA.H提供了解释所讨论的时期的农历数据所需的所有其它数据;其冲是供了关注的日期范围的边界(从1980年1月1日,即^需略日2444240,到2100年2月31日,即4需略日2488434);其也乡合出了在所考虑的120年时期内第一个农历新年是农历年56,而在120年时期内的最后一个农历新年是农历年57,这个120年时期开始于循环79,而该数据总共涵盖了122个农历年的信息。预先产生i殳置在CALCONDATA.CPP和CALCONDATA.H中的数据,并且这些数据能够用于构建移动计算装置的只读存储器(ROM)。如何产生这些数据并不是本发明的内容。这些数据可以通过Reingold和Dershowitz方程计算4寻到。可选i也,由南京紫金山天文台的数据或者其它出版的日历也是足够的。以上提供的关于数据构建的公开内容及其实施之后^是供的理论,一皮i人为是对这些文件如何能^皮有效用于计算装置PIM型应用程序中提供了充分的解释。因此,本
技术领域
的技术人员能够很容易地实现本发明,以提供Reingold和Dershowitz方程的在技术上的优异替代,由此能够实现儒略日与农历日期的快速且高效转换,既能够根据计算装置的资源实施转换,也能根据时间实施转换。对于表格中所表示的日期范围内的任何农历日期,可以直接跳到用于正确农历年的文件表才各的条目,直4妄确定该农历年新年的儒略曰及其所有月份的天数长度和任何相关的闰月数据。从而,确定对应于任何农历日期的儒略日以及由此确定格里日期,就需要相对较小量的相对简单的算术运算,这可以在计算装置中很容易地快速实现。对于在日期范围内的任何儒略日,可以在该儒略日之前直4姿跳转到包含农历新年的表格中的记载条目,并且一旦查找到月份长度和J壬何相关闰月的信息,计算出正确的农历日期又是一种相对直^妾的算术运算,这能够一皮毫无困难地快速实现。对于完全性而言,下面阐述的本发明实施例也提供了部分样本禾呈序文fKCHINESEUSINGTABLE.CPP包含了4离自为SymbianOSTM才乘作系统所写的工作程序的^C码片断,其包括处理表4各凄丈据的子程序,用于作为解释可以如何使用它们的样本。本领域的技术人员很容易观察到,可替换的实现以及进一步的优化是可能的,尤其是,对于每一农历新年匹配儒略日期的前体条件并不是绝对必需的,这是因为仅假定农历日期和儒略日都已知的一个单一同步日期,则根据月份长度和闰月数据可以从算术上将它们计算出来。结合进一步的凄t组打包,这种可选的优化将Y吏得日期范围内的每一附加农历年的开销从上述实施方式中使用的6字节/年(或48位/年)降低到17位/年的最低值,这在存储方面提供了进一步的资源节省。然而,在打开这种类型的位^:组中存在一定的附加计算代价,并且这种类型的实现也会导致远离所提供的同步点的关于曰期的运算要花更长的时间来完成更靠近同步点的日期运算。很明显还可能出现具有比每年出现频率更少的多个同步点的混杂类型。对于使用本发明制造的任何装置的折衷选择可留给设计师;然而,在所附权利要求中限定的本发明旨在应用于所有这样的实3见,而不^5U又是应用于上述i羊细描述的^尤选实施方式。以下实施例提供了用于格里年19802100的主要参照表格。该表格包含指示月份长度的位映射数组,其后是指示任何闰月和农历新年的儒略日的位映射^:组。〃//CALCONDATA.CPP〃constTUintl6TCalconData::iCalConDat:aMonth[]-{38608U,〃0-5538320U,〃0-56〃0-5742168U,〃0-5842160U,〃0-5945656U,〃1-027216U,〃1-127968U,〃1-244448U,〃1343872U,〃1—438256U,〃1-S18ft08U,〃1-6188(JOU,〃1-72577SU,〃1-827216U,〃1-959984U,〃1-1027432U,〃1-1123232U,〃1-1243872U,〃1-1337736U,〃1-1437600U,〃1■-1551552U,〃1-1654440U,〃1-1754432U,〃1-1_855888U,〃1--1923208U,〃2-202217SU,〃,-2143736U,〃-22〃1-2337584U,〃1-241-2543344U,〃1—2646240U,〃1-2746416U,〃1-2844368U,〃1-2921928U,1-3019360U,〃1-3142416U,〃1-3221176U,〃1—3321168U,〃1-3443312U,〃1一3529864U,1-3627296U,〃1—3744368U,〃1-3819880U,1—3919296U,〃1—4042352U,〃-4142208U,〃14253856U,〃143〃14454576U,〃14523200U,〃1-4627472U,//147〃1—4819176U,〃.14919152U,1-5042192U,〃1一51〃1一5253840U,//1—5354560U,/./1—5455968U,//1—5546496U,//1-5622224U,〃1-5719160U,〃1-5818864U,〃1-5942168U,〃2-042160U,〃2143600U,〃222-327936U,〃2-444448U,〃2-521936U,〃2-637744U,〃2-718808U,〃2—818800U,〃2-925776U,〃2—1027216U,〃2-11//2—1227296U,〃2-1321176U,〃1—3321168U,〃1—3443312U,〃1-3529864U,〃1-36202"7296U,〃1--3744368U,〃1--3819B80U,〃1--39〃1'-4042352U,〃1--4142208U,〃1--4253856U,〃1--43〃1--4454576U,〃1--4523200U,〃1--4627472U,〃1--4738608U,〃1--4819176U,〃1-网4919152U,〃1--50〃1--51〃1--5253840U,〃1--5354560U,〃1--5455968U,〃1--55〃1--5622224U,〃1--57〃1--5818864U,〃1--59〃2--0":i60u,〃2--143600U,〃2--246376U,〃2--327936LT,〃2--444448U,〃2--521936U,〃2--637744U,〃2--7L8808U,〃2--8丄8800U,〃2-925776U,〃2'-1027216U,〃2--1159984U,〃2-1227296U,〃2-1343872U,〃21443744U,〃2-1537600U,〃2-1651568U,〃2-1751552U,〃2-18〃2-1954432U,〃2-2055888U,〃2-2123208U,〃2-2222176U,〃2-2342704U,〃2.-2421224U,〃2.-2S21200U,〃2-2643352U,〃2-27433"U,〃2--2846240U,〃2.-2946416U,〃2--30〃2--312i920U,〃2.-3242448U,〃2--33〃2-3421168U,〃2.-3543320U,〃2■-3S26928U,〃2--3729336U,〃2--3827296U,〃2--3944368U,//2'-4019880U,〃2--4119296U,2--4242352U,〃2--4321104U,〃2-4453600U,〃2--45〃2--4654560U,〃2--4755968U,〃2--4827472U,〃2--4922224U,〃2-50〃2--5142216U,〃2--52416證1,〃2--53〃2--5455592'J,〃2--55constTUint32TCalconData::iCalConDataYear[]=〃0-552444286U,//0--562444641U,//0--57-1344622275U,〃0-582445379U,//0--592955235749U,〃1-02446117U,//1--12446471U,//1--21881495017U,〃1-32447209U,//1--42447564U,//1--51613060655U,〃1-2448303U,//1--72448657U,//1--8107619083—〕U,〃1-92449394U,//1--102418368853U,〃1-112450133U,//1-.122450487U,//1-.131613063578U,〃1-142451226U,//1-'i52451580U,//1-.161344629214U,〃1-172452318U,//1-.182452672U,//1-19〃1.-202453411U,//1-'212149937413U,〃1-222454150U,//1-232454504U,//1-241613067594U,〃1_2524S5242U,//1-262455596U,//1_271344633230U,〃1-28//1-292686811249U,〃1-302457073U,//1-3124574271),//1-321881505974U,〃1-332458166U,/〉1_342458520U,//1_351344536154U,〃1_362459258U,//1-372459612U,//1_388077SS335U,,〃1-39:246U35丄U,//1-401881508897U,〃1-412461089U,//1-422461443U,//1-43丄613074533U,〃1-442462181U,//1-452462536U,//1-461076204714U,〃1-472463274U,//1_483223689101U,〃1-492464013U,//1_502464367U,//1_511881512913U,〃1-522465105U,//1-532465459U,//1-541"3078549U,〃1-552466197U,/〉1-56246S552U,//1-57807773275U,,〃1582467291U,〃1-592149951293U,〃2-02468029U,//2-12468383U,//2-21613081473U,〃2-32469121U,/〉2-.42469475U,〃2-51076211S54U,〃2_62470214U,//2-72418389S73U,〃2-82470953U,//2-.92471307U,//2-101881519853U,〃2-112472044TJ,//2-■122472399U,//2-131344650033U,〃2-142473137U,//2-152473492U,//2-161076215S70U,〃2-172474230U,//2-18〃2_192474968U,//2_202475322U,//2-21丄613088413U,〃2-222476061U,//2_232476415U,//2-241344654050U,〃2_252477154U,//2-262418396612U,〃2-272477892U,//2_282478246U,//2-291881526792U,〃2-302478984U,//2-31247"39U,//2-32〃2-33248G077U,//2-342480432U,//2-351076222610U,〃2-362481丄70U,//2_372149965172U,〃2-382481908U,//2-3924822S2U,//2-401613095353U,〃2-412483001U,/〉2-422483355U,//2-431344660990U,〃2-442484093U,//2-452418403551U,〃2-462484831U,//2-472485185U,//2_481881533732U,〃2_492485924U,//2-502486279U,//2-511344SS3913U,〃2-522487017U,//2-532487371U,//2-54807794093U,〃2-552488109U,//2-56Oxffffffff以下表才各示出了用于才各里年19802100的附加历法4言息,〃//ca:lcondata.h〃constTintKPirstCycle-77;//1..nconstTint:KFirstJulianDat:e=2444240,constTintKLast.JulianDate=2488434,constTintKFirstYear=56;//1..60const丁工n[KLas[Cycle=79;〃1..nconstTintKLastYear二57;〃1..60constTintKNumberOfYears=122;这些是表示表才各如何用于构建一系列有用历法类的代码片段(//CHINESEUSINGTABLjE.cpp〃//Class:TChineseCalendar//Function:ChineseToDateTime//Arguments:TDateTime&〃//Comments:Thisfunctionconvertsthedateheldwithin//theTChineseCalendarclasstoaTDateTimeformatand//placesitintheTDateTimeclassprovided.〃//Return:void,,____——___________<____________________________________voidTChineseCalendar::ChineseToDateTime(TDateTime&aDT)TArithmeticalDa[egregDate;TGregorianCalendargreg(iJulianDay);<formula>formulaseeoriginaldocumentpage26</formula><formula>formulaseeoriginaldocumentpage27</formula><formula>formulaseeoriginaldocumentpage28</formula>//Checkthatifd3ys-=30,therequestedmonthactuallyhas30daysTintcheckMonth=aDate,iMonth;if《leap》checkMonth++;//thisisthemonthrequestedbytheuserTUintdaysFlag=iData■GetData(cycle,year,checkMor丄th-1);if((aDat'e.iDay30)((daysFlag--K29DayMont:h)||(daysFlag^':K29DayLieapMonth)))returnEFalse;days+-aDateiDay-1;days+=iData,GetNewYear(cycle,year);//addtheNewYearaJu〗,ianDay=days;returnETrue,'TChineseCalendarChineseFromFixedTChineseDate&,TReal〃-------—.…//Class://Function://Arguments:////Comments:thisfunctionconvertsaJuliandayvaluetoaChinesedateintheformTChiiieseDate〃//Re'二urn:助neT工r化TChir丄eseCalendar::ChinesePromFixed(TCh丄rieseDat:e&aDate,constTReal&aJulianDay)constif((aJulianDay<KFirstJulianDate)II(aJulianDay>KLast:JuliariDat:e))returnKErrArgumen仁;Tintcyclelndex=0;while((cyclelndex<KLast:Cycle—KFirs仁Cycle)(aJulianDayiDatauGetNewYear(cycleIndex+1,0)))cyclelndex++;aDate.iCycle^cyclelndex+KFirstCycle/TintchineseNewYearjTintyearCount-0;if{eyel6lnde:x==0)yearCount攻KFirstYear-1;while(yearCount<60aJulianDay>豕iData■GetNewYear(cycleIndex,yearCount))yearCount++;aDate,iYear-yearCount;chineseN"ewYeariDa仁a,GetNewYear(cyclelndex,—yearCovint〉;TintaddedNumberOfDays=0;TintpreviousAddedWumbe:rOfDays=0;TintmonthCount:=1aDate,iMcmth^Q;Tint:monthNumber;//0=Womonthexis仁s,1-29cidtymonth,2=30daymonth,3-29dayleapmonth,4=30dsyleapmonthwhile(aJulianDay>=(chinese!SfewYear+addedNumberOfDays))/previousAddedMumberQfDays=addedNumberOfDays,'monthNunnber=iData.GetData(cycleIndex,yearCount,monthCount:-1);sw:it:ch(mont,hNumber〉caseKMonth工nvalid:—ASSERT—DEBUG(0,User::Panic(—L("Calcon"),ECalconChineseFromFixedMont:h工nvalid";—breaks-caseK29DayMon仁h:addedNumberOfDays十=29,-aDate.iM〇nt:h++aDate,iLeapMonth=EFalse;caseK3DDayMonth:addedNumberOfDays+-30;aDateiMon仁h十十;aDate.iLeapMonth=EFalse〖ca〇eK29DayXjeapMonth:addedNumberOfDays+=29aDate.iLeapMon仁hSTrue;break,'esseK30Dayl/eapMonth:addedNumberOfDays30'.aDate.i!LeapMonth=STrue/break,'monthCount++;aDate,iDay=(Tint)aJulianDay-chineseNewYear-previousAddedNumberOfDays;aDate,iDay++;returnKErrNone,.constTUint:KMon仁hMas]ol"15;constTUintKLeapMonthShift=28,'TUintTCalconData::GetData《T工nta'Cycle,TintaYear,Tint:aMonth〉const一ASSERT—DEBUG((aYear"OaYear<-59),User::PaniG(—L("Calcon"〉,ElCalconGe亡DataYearOutOfRange));//yearrangeis0..59—ASSERT—DEBUG((aMonth"OaMon匕h〈-12〉,User::Panic(一L("Calcon"),ECalconGetDat:aMont:hOut:.OfRange));//monthrangeis0.-12Tinty=(aCycle*KNoOfYearsInCycle)+aYea;r7y-=〈KP丄:r;9仁Year-l);//thereareKFirstYear-1entriesmissingfromtheheadofthetableTUint:16x-iCalCoriDataMonth[y]7TUiri匕mask=KMonthMask〉>aMont:h/Tint£lag=K29DayM。nth;if(x&mask)f1-K30DayMont:h;TUintleapMonth"CalConDataYear〔y〗"KLeapMonthShift;leapMonth--/丄f((TUir丄)aMonth^leapMonth)fla_g+=2;//--:>K29/3ODayLeapMorithif((aMonth==12)(leapMonth==0〉》flag-KMon仁hIrival丄dz//monthdoesn'texistreturnflag/TUintTCalccmData::GetNewYear(TintaCycle,T工n仁aYear)const—ASSENT—DEBUG(UYear>=0&&aYear<=59),User::Panic(—L("Calcon"),ECa丄conGetNewYearYearOutOfRange)〉;Tinty={aCyc1e*KNoOfYearsInCyc1e)+aYear;'/-=(KFirstYear-1);return(iCalConDataYear〖y〗&0x0fffffff);〃—-----------//Class://Function://Arguments:〃//Comment:s:givendateis〃//Return://------------3TChineseCalendarValidDateTChineseDa仁e&ThisfunctionDetermineswhetherthevalidChinesedate丁BoolETruedateisvalid,elseTBoolTChineseCalendar:&aDate)const:ValidDate(const丁ChineseDat:e//dosometrivialcheckstoensurethatthedat:eisintherangeofthelookupt:ableif(aD政e*iYear二-O||aDate.iYear>KNoOfYe<arsInCycle〉returnEFalse'.if(aDa匕e.iCycle<KFir.stCycie)returnEFalse;if(aDate.iCycle==KFirstCycleaDate.iYearKFirstYear)returnEFalse,.if(aDa仁e,iCycle〉KLastCycle)returnEF3lserif((aDate.iCycle==KLastCycleOreturnEFalse;if(aDate.iDay=-0j|aDate,iDay>30〉returnEFalse;returnETrue;TRealTChineseCalendar:JulianDate()returniJulianDay;图2示出了概括用于实施儒略日数和农历日期之间的转换过程的流程图。根据上述内容和具体的实施例应该理解,本发明对当前提供农历功能的过程带来了显著的技术效果,包括*在指定数量的年份中访问全部农历功能,即-使在资源受限的计算装置上也能快速运算。*高效利用诸如存储器和CPU用途的计算资源。*不涉及代价高昂的长浮点数学计算。*减少了存储器的使用低于可比较的当前表格查询法的0.01%。*更容易地向普遍使用农历的国家中的工作人员提供具有全部PIM功能的计算装置。*对于实现该功能的装置,才及大地节省了功率;这导致自然资源方面的环境效益,对于实现该功能的装置来说电池寿命更长。尽管参照具体实施方式描述了本发明,^旦应该理解,可以对其进行修改,但仍保持在如所附权利要求限定的本发明范围内。权利要求1.一种操作用于在农历日期范围和儒略日数之间进行转换的计算装置的方法,所述方法包括在所述计算装置的存储器中存储表示以下内容的信息d.包含在所述范围内的每一个农历年的月份长度;e.如果有闰月,则包含在所述范围内的每一个农历年的月份中哪些月份是闰月;以及f.用于所述范围内的普通日子的至少一对儒略日数和农历日期数据;以及使所述计算装置的中央处理器单元(CPU),利用所述存储信息进行所述农历日期和所述儒略日数之间的转换。2.根据权利要求1所述的方法,其中,提供包括位映射数组的表^^各,用于识别包括在所述范围内的每一个农历年中的月份长度。3.根据权利要求2所述的方法,其中,每一位映射数组都包含16位二进制数组,并且其中,所述数组的位型之一以及所述凄t组中的所述一个4立型的有效4立用于识别各个农历年中的30天的月份,所述数组中的其它所述位型以及所述数组中的其它所述位型的有效位用于识别所述农历年中的29天的月4分。4.根据权利要求2所述的方法,其中,二进制1位型用于识别30天的月^f分,而二进制的0位型用于识别29天的月4分。5.根据前述4又利要求任一项所述的方法,其中,l是供单个数字的表才各用于指示在所述范围内的每个所述农历年中的任何闰月的序号,而零用于指示在一个农历年中不存在闰月。6.根据权利要求5所述的方法,其中,所述单个数字还分别用于识别所述范围内的年的儒略凄t。7.根据权利要求6所述的方法,其中,以32位二进制数组的形式才是供每一个单个数字,并且其中,每一数组的28位最低有效位用于识别所述儒略lt,而所迷每一^t组的4位最高位用于在存在闰月的情况下识别农历年中的哪一个月是闰月。8.才艮据前述冲又利要求4壬一项所述的方法,其中,为所述范围内的年冲是供一对以上的农历日期和儒略日J旦是为所述范围内的每一年提供少于一对的农历日期和儒略曰。9.才艮据权利要求1~8中任一项所述的方法,其中,为所述范围内的年才是供每年多于一对的农历日期和儒略曰。10.—种被i殳置用于4艮据权利要求1~9中任一项所述的方法进行操作的计算装置。11.一种用于4吏一种计算装置根据权利要求19中任一项所述的方法进行操作的操作系统。全文摘要本发明提供了用于在任何指定日期范围内进行农历日期和儒略日数之间的转换的方法和计算装置,其中利用储存在计算装置的存储器中的表格并连同一个或多个儒略日数和农历日期的参照对,所述表格中包括各个月的长度以及(如果有)哪些月份是闰月。文档编号G06Q10/00GK101111831SQ200580047646公开日2008年1月23日申请日期2005年12月21日优先权日2004年12月22日发明者肖恩·帕克林申请人:西姆毕恩软件有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1