農曆轉換公曆演算法?

General 更新 2024年11月23日

農曆轉換成公曆的計算公式?

因為公曆(現在用的是格里曆,以前還曾用儒列歷)和中國農曆都不是嚴格按一個公式計算得到的,所以兩個曆法沒有直接的公式。

試圖用一個簡單的公式,而不利用許多像萬年曆一樣的資料(儘管可以簡化),就達到公農曆轉換的目的,這是不可能的。我們能見到的所有公農曆轉換的軟體,都存有多少不等的一些年份的歷法資料。

這些資料之中,最重要的是農曆的每月天數。因為農曆是陰陽曆,陰曆部分(按月相編的部分)決定月日,陽曆部分(按太陽高度編的部分)就是節氣。節氣基本上是與公曆直接對應的,可以較容易的推算;但月相週期與地球公轉的關係相對複雜,一般都需要天文觀測資料授時,所以農曆每月是大月還是小月沒有簡單的公式。

贊助廣告

至於公曆和農曆的置閏,倒都有一定的方式推算,並不困難。

如果只是天文資料,其實都還是可以算的——因為天文週期十分穩定,我們只要嚴格地按天文週期推算就可以了。可是還有更為麻煩的一點,就是公曆和農曆這些曆法,並不是完全嚴格地按照天文上的實際週期進行的,還有許多人為的因素。最著名的就是羅馬皇帝幾次修改2、8等月份長短,以及儒列歷中因計算不準確而人為地去掉了十天等事。中國農曆也有因為古代天文觀測不準確造成的政府頒佈的歷法與天象不吻合的(我們不能苛求古人觀測的精度)。所以這兩部曆法都是與一個時期社會有關的東西,也就沒有一定的規律可循了。

贊助廣告

求農曆公曆轉換演算法

程式設計不太懂

傳下來 口訣

乘五除四九加日

雙月間隔三十天。

一二自加整少一,

三五七八十尾前。

具體的演算法你可網上找下資料 百度上很多的 我就不多累贅了的

excel如何農曆轉換陽曆公式

比如今天是2010年9月2日,用以下公式就可以得出農曆七月二十四:

雖然在遇到閏月時,顯示結果有點差強人意,如下圖中,2010年2月9日的農曆應是十二月二十六,但因為那年有個閏五月,就無辜多出來一個月了。不過總比編程式碼要快捷多了吧,而且閏月也不是天天有。

假如把公式改成:=MID("甲乙丙丁戊己庚辛壬癸",MOD(TEXT(A2,"[$-130000]e")-4,10)+1,1)&MID("子醜寅卯辰巳午未申酉戌亥",MOD(TEXT(A2,"[$-130000]e")-4,12)+1,1)&"年"&TEXT(A2,"[$-130000][DBNum1]m月")&TEXT(A2,IF(--TEXT(A2,"[$-130000]d")=10,"初十",IF(--TEXT(A2,"[$-130000]d")>10,"[$-130000][DBNum1]d","初[$-130000][DBNum1]d"))),那就更像農曆表示法了,不過因為農曆每年開始日期都不一樣,所以函式很難達到十分精確的結果,只能是將就著用。

實現陽曆轉陰曆演算法

下面是一個關於VB的農曆演算法

'日期資料定義方法如下

'前12個位元組代表1-12月為大月或是小月,1為大月30天,0為小月29天;

'第13位為閏月的情況,1為大月30天,0為小月29天;

'第14位為閏月的月份,如果不是閏月為0,否則給出月份,10、11、12分別用A、B、C來表示,即使用16進位制;

'最後4位為當年家農曆新年-即農曆1月1日所在公曆的日期,如0131代表1月31日。

Function GetChgDate(ByVal vDate As String, ByVal ChgType As 轉換方式) As String

Dim vvdate() As String = Split(vDate, "-")

If vvdate(0) > 2011 Or vvdate(0) < 1900 Then

Throw New NotSupportedException("本函式只提供1900年至2011年的日曆轉換!")

End If

Dim AddMonth, AddDay, AddYear, getDay, i As Integer

Dim RunYue As Boolean

Dim conDate As DateTime

Dim daList(2011) As String

daList(1900) = "010010110110180131"

daList(1901) = "010010101110000219"

daList(1902) = "101001010111000208"

daList(1903) = "010100100110150129"

daList(1904) = "110100100110000216"

daList(1905) = "110110010101000204"

daList(1906) = "011010101010140125"

daList(1907) = "010101101010000213"

daList(1908) = "100110101101000202"

daList(1909) = "010010101110120122"

daList(1910) = "010010101110000210"

daList(1911) = "101001001101160130"

daList(1912) = "101001001101000218"

daList(1913) = "110100100101000206"

daList(1914) = "110101010100150126"

daList(1915) = "101101010101000214"

daList(1916) = "010101101010000204"

daList(1917) = "100101101101020123"

daList(1918) = "100101011011......餘下全文>>

農曆和陽曆轉換有什麼規律啊?

沒有。陽曆是以地球圍繞太陽公轉一週的時間(即:365天5小時48分46秒,也就是365.2422天)為一年,為曆法方便定為365天(稱為平年),捨去0.2骸22天,捨去的0.2422天,每4年累加為0.9688天,將近一天。因此,每四年加一天,既加在能被4整除的年份上,這一年為366天(稱為閏年,即:2月份為29天),每四百年少3.12天,也就是少三個閏年,所以逢百年時,既要被4整除也要被400整除才為閏年。也就是我們通常所說的: 四年一閏,百年不閏,四百年再閏。

農曆則是以月亮圍繞地球公轉一週的時間(即:平均29天12小時44分)為一個月,12個月算一年,為354天。每三年有一個閏月年,閏月年是383天或384天。19年7個閏月年。一般情況19年陽曆和陰曆(19被數年)能碰到一起或只差一天。

c++中怎樣將陽曆轉化成農曆

一、 原理篇

1. 公曆轉換農曆的演算法

公曆(Gregorian Calendar)與農曆(Chinese Lunar Calendar)的轉換關係不是一個簡單的公式就可以完成,其中的轉換比較複雜,原因是農曆的制定相當複雜,是根據天文觀測進行指定的。

比較常用並且比較簡單的公曆轉換農曆演算法就是查表方法。首先要儲存公曆農曆的轉換資訊:以任何一年作為起點,把從這一年起若干年的農曆資訊儲存起來(在我的C++類中,是從1900年作為起點的。選擇一個起始點的思想十分重要,在下面的干支紀法和二十四節氣中也體現到了)。回想一下,我們平時是怎樣來轉換公曆農曆的呢?是查閱歷書,曆書中有每一天的公曆農曆,直接一查就可以了。那麼我們可不可以也這樣做呢?當然可以,但是這樣做要收錄每一天的資訊,工作量就會很大,所以我們要簡化這些資訊。如何簡化呢?

要儲存一年的資訊,其實只要兩個資訊就可以了:(1)農曆每個月的大小;(2)今年是否有閏月,閏幾月以及閏月的大小。用一個整數來儲存這些資訊就足夠了。具體的方法是:用一位來表示一個月的大小,大月記為1,小月記為0,這樣就用掉了12位,再用低四位來表示閏月的月份,沒有閏月記為0。比如說,2000年的資訊資料是0x0c960,轉化成二進位制就是1100100101100000,表示的含義是1、2、5、8、10、11月大,其餘月小,低四位為0說明沒有閏月。2001年的農曆資訊資料是0x0d954,其中的4表示該年閏4月,月份大小資訊就是0x0d95,具體的就是1、2、4、5、8、10、12月大,其餘月小。這樣就可以用一個數組來儲存這些資訊。在我的C++類中是用m_lunarInfo這個陣列來儲存這些資訊的。

下面就是公曆轉換成農曆的具體演算法:

(1) 計算所求時間到起始年正月初一的天數。

(2) 從起始年份開始,減去每一月的天數,一直到剩餘天數沒有下一個月多為止。此時,m_lunarInfo的下標到了多少,就是減去了多少年,用起始年份加上這個下標就可以得到農曆年份,然後看減去了幾個月。如果本年不閏月或者閏月還在後面,就可以直接得到農曆月份,如果在閏月月份數後面一個月,則這個月就是閏月。剩餘的天數就是農曆日。(具體實現時有所改進。)

2. 利於泰勒公式巧算星期

在應用數學中有一個計算某一天是星期幾的公式,這就是泰勒公式。公式如下:w = [c÷4] - 2c + y + [y÷4] + [26(m+1)÷10] + d - 1,其中w就是所求日期的星期數。如果求得的數大於(小於)7,就減去(加上)7的倍數,直到餘數小於7為止。式子中c是指公元年份的前兩位數字,y是後兩位數字,m是月數,d是日數。方括弧[]表示對於括號中的數字取整。還有一個特別要注意的地方:所求的月份如果是1月或2月,則應視為上一年的13月或14月,也就是公式中m的取值範圍是從3到14而不是從1到12。

3. 干支紀法

天干有十個,就是甲、乙、丙、丁、戊、己、庚、辛、壬、癸,地支有十二個,依次是子、醜、寅、卯、辰、巳、午、未、申、酉、戌、亥。古人把它們按照一定的順序而不重複地搭配起來,從甲子到癸亥共六十對,叫做六十甲子。我國古人用這六十對干支來表示年、月、日、時的序號,周而復始,不斷迴圈,這就是干支紀法。

0甲子

1乙丑

2丙寅

3丁卯

4戊辰

5己已

6庚午

7辛未

8壬申

9癸酉10甲戌

11乙亥

12丙子

13丁丑

14戊寅

15己卯

16庚辰

17辛已

18壬午

19癸未20甲申

21乙酉

22丙戌

23丁亥

24戊子

25己丑

26庚寅

......餘下全文>>

javascript陽曆轉陰曆方法?

我這裡剛好有這個演算法程式碼,請看:

var LunarDate = { madd: new Array(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334), HsString: '甲乙丙丁戊己庚辛壬癸', EbString: '子醜寅卯辰巳午未申酉戌亥', NumString: "一二三四五六七八九十", MonString: "正二三四五六七八九十冬臘", CalendarData: new Array(0xA4B, 0x5164B, 0x6A5, 0x6D4, 0x415B5, 0x2B6, 0x957, 0x2092F, 0x497, 0x60C96, 0xD4A, 0xEA5, 0x50DA9, 0x5AD, 0x2B6, 0x3126E, 0x92E, 0x7192D, 0xC95, 0xD4A, 0x61B4A, 0xB55, 0x56A, 0x4155B, 0x25D, 0x92D, 0x2192B, 0xA95, 0x71695, 0x6CA, 0xB55, 0x50AB5, 0x4DA, 0xA5B, 0x30A57, 0x52B, 0x8152A, 0xE95, 0x6AA, 0x615AA, 0xAB5, 0x4B6, 0x414AE, 0xA57, 0x526, 0x31D26, 0xD95, 0x70B55, 0x56A, 0x96D, 0x5095D, 0x4AD, 0xA4D, 0x41A4D, 0xD25, 0x81AA5, 0xB54, 0xB6A, 0x612DA, 0x95B, 0x49B, 0x41497, 0xA4B, 0xA164B, 0x6A5, 0x6D4, 0x615B4, 0xAB6, 0x957, 0x5092F, 0x497, 0x64B, 0x30D4A, 0xEA5, 0x80D65, 0x5AC, 0xAB6, 0x5126D, 0x92E, 0xC96, 0x41A95, 0xD4A, 0xDA5, 0x20B55, 0x56A, 0x7155B, 0x25D, 0x92D, 0x5192B, 0xA95, 0xB4A, 0x416AA, 0xAD5, 0x90AB5, 0x4BA, 0xA5B, 0x60A57, 0x52B, 0xA93, 0x40E95), Year: null, Month: null, Day: null, TheDate: null, GetBit: function(m, n){ return (m >> n) & 1; }, e2c: function(){ this.TheDate = (arguments.length != 3) ? new Date(): new Date(arguments[0], arguments[1], arguments[2]); var total, m, n, k; var isEnd = false; var tmp = this.TheDate.getFullYear(); total = (tmp - 1921) * 365 + Math.floor(乏鼎催刮詘......餘下全文>>

請問知道陽曆怎麼計算陰曆

1、沒有計算方法,只能一天一天排下來。因為農曆不象陽曆那樣固定一年大月就是1、3、5、7、8、10、12等12個月,它經常會出現潤月,而這個潤月又不是固定的,所以沒有計算方法

2、黃帝內經中的月份是農曆三海

3、現行陽曆即格里曆,又譯國瑞歷、額我略曆、格列高利曆、格里高利曆,稱公元。是由義大利醫生兼哲學家裡利烏斯(Aloysius Lilius)改革儒略曆制定的歷法,由教皇格列高利十三世在1582年頒行。

相關問題答案
農曆轉換公曆演算法?
農曆轉換公曆?
農曆轉換公曆星座?
農曆轉換公曆對照表?
農曆轉換公曆查詢?
陽曆農曆轉換公式?
陰陽曆轉換公式?
農曆轉換陽曆查詢?
農曆轉換陽曆?
農曆轉換陽曆星座查詢?