專利名稱::用于儒略歷日和農歷日期之間轉換的計算裝置和方法
技術領域:
:本發明涉及一種在計算裝置中進行儒略日#丈(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日發明者肖恩·帕克林申請人:西姆畢恩軟件有限公司