Nguồn gốc và nguyên tắc tính lịch âm của Việt Nam

Từ xa xưa, việc xem lịch âm để xem ngày giờ tốt xấu nhằm tìm kiếm ngày giờ đẹp để xuất hành, cưới hỏi, ma chay… đã trở thành một thói quen không thể thiếu của người Việt. Tuy vậy rất ít người biết được nguồn gốc lịch âm Việt Nam, bài viết này sẽ giúp các bạn hiểu rõ hơn nguồn gốc lịch âm và các tính lịch âm Việt Nam.
Âm lịch tiếng Anh còn gọi là lunar calendar là việc soạn thảo lịch số dựa vào vận hành của mặt trăng không phải bắt đầu từ Trung hoa như nhiều người lầm tưởng.

Nguồn gốc lịch âm Việt Nam

Theo dữ kiện có được từ các nhà khảo cổ với bằng chứng rõ rệt, thì nền văn minh Sumerian, phát triển bên cạnh con sông Tigris cách đây hơn 6000 năm (khoảng từ năm 5000-4000 BC, để sau này thành trung tâm của xứ ngàn lẻ một đêm, hay ngày nay còn gọi là Baghdad, thủ đô của Iraq) đã biết làm lịch dựa vào vận hành của mặt trăng. Ðế quốc La mã ngay trong thời trước Julius Cesar ( 40 BC ) cũng dùng loại Âm lịch này. Chọn mặt trăng để làm lịch có thể bởi hai lý do: Dễ nhìn vì ánh trăng ban đêm không nóng gay gắt và khó nhìn như mặt trời ban ngày. Thay đổi hình dạng thường xuyên từ khuyết tới tròn dễ thấy hơn là mặt trời hầu như  ít khi thay đổi.
Tuy nhiên, còn một lý do khá quan trọng khác ít người nghĩ đến, là do yếu tố thiên nhiên. Xứ Aicập (Egypt) nằm ngay trên đường Phân cực Hoàng đạo (Tropic of Cancer, khoảng 23°27 từ xích đạo) nên đa số nhiều người đã thấy được hiện tượng mặt trời chiếu thẳng trên đỉnh đầu. Nghĩa là trong khoảng từ 20 tháng 3 đến 20 tháng 9, nếu cắm một cái cọc thật thẳng đứng, sẽ thấy bóng của cây cọc nhập trùng ngay dưới gốc của nó vào lúc 12 giờ trưa, ít nhất là trong vài ngày (Chỉ những nước nằm giữa đường xích đạo và Bắc bán cầu trong khoảng Vĩ tuyến từ 0 – 23°27 mới thấy được hiện tượng trên. Ngược lại, trong vùng Nam Bán cầu thì khoảng từ 20 tháng 9 đến 20 tháng 3). Nhờ quan sát hiện tượng đó, dân Ai cập cách đây khoảng hơn 4000 năm đã tính ra gần đúng số ngày trong năm (365 thayvì 355 như Âm lịch), và cũng chính là lý do họ chọn làm lịch theo mặt trời, lưu truyền Dương lịch cho đến bây giờ!

Nguồn Gốc Lịch Âm Việt Nam
Nguồn Gốc Lịch Âm Việt Nam
Các thủ đô của Trung hoa như Trường An hay Bắc kinh, vì nằm trong vùng ôn đới cách xa trên đường Phân cực (Tropic of Cancer) nên không thấy được hiện tượng nói trên, cũng như khôngcó ấntượng nhiều về mặttrời, và cũnglà lýdo dểhiểu tạisao họ đã dùng mặttrăng để làm lịch.
Theo đúng như trong sử Trung hoa ghi lại thì khoa Lịch số đã có từ thời Hoàng Ðế, cách đây hơn 4000 năm, do các chiêm tinh gia soạn ra (nghĩa nguyên thuỷ là nhà thiênvăn hay chuyên gia coi sao trêntrời, không phải bị biến nghĩa ra thành “thầy bói toán” như về sau này!) chiêm tinh gia biên soạn lịch số để định chuẩn thời gian cho việc hành chánh và cai trị của triều đình Vua quan, nhưng đồng thời cũng giúp rất nhiều cho nghề nông trong việc tiên đóan thời tiết hay thu hoạch mùa màng. Chắc chắn trong giai đoạn đầu khi mới có cho đến khoảng sau thời Hán Cao tổ, âm lịch cũng không tránh khỏi nhiều sai lầm, nhất là rất đơn sơ và chưa có Thiên can hay Ðịa chi như sau này. Bằng chứng là trong thời kỳ phát triển của ChuDịch (1150 – 500 BC) cũng chưa nghe nói đến.
Phải đến thời “Tam Quốc” của Khổng Minh (Gia cát Lượng) vào khoảng 200-300 AD thì mới có văn tự rõ rệt nói về các Thiên Can, đồng thời xuất hiện các khoa lý số như Kỳ Môn Ðộn Giáp, Thái ất Thần toán, hay Lục Nhâm Ðại Ðộn v.v. Hầu hết các sử gia Trung quốc đều công nhận là chỉ vào thời kỳ của Nhà Hán, sau mấy trăm năm chiến tranh liên miên từ thời Ðông chu Liệt quốc, nền văn minh Trung hoa mới thật sự khởi sắc và đi lên trong Thiên niên kỷ đầu tiên (0 -1000 AD).
Theo chính sử ghi lại, những nghiên cứu và phát minh của Trung hoa thật sự đã bắt đầu từ thời Tần thủy Hoàng, khi vị Hoàng đế tài giỏi nhưng tàn bạo này, có thể động viên hay chiêu dụ được nhiều đạo sĩ (coi như là khoa học gia theo tiêu chuẩn thời đó), trongviệc thám hiểm, đi tìm kiếm các kỳ hoa dược thảo để luyện thuốc trường sinh bất tử cho ông. Dưới nhậnxét bình thường thì cho rằng đó là việc làm  xa xỉ, hoang tưởng và mê muội. Nhưng trong lãnh vực nghiên cứu khoa học ngày nay, Tần Thủy Hoàng rất xứng đáng được coi như đã có công sáng lập một cơ cấu kiểu Hàn lâm Viện khoa học đầu tiên cho nhân lọai!
Những chi phí trong việc chiêu đãi hay thưởng công cho các đạo sĩ thời đó, dưới cái nhìn thiếu hiểu biết cho là phung phí, nhưng so với tỷ lệ ngân sách dành riêng cho khảo cứu khoa học ngày nay thì chẳng có nghĩa lý gì cả, dù là của một nước đang phát triển! Chính nhờ làm việc và sống chung tập thể với nhau đó, đã vô tình tạo ra mô itrường tốt đẹp cho những sáng kiến mới, thi đua học hỏi, trao đổi kiến thức giữa các đạo sĩ với nhà vua, và có thể đã là cơ sở đóng góp cho nhiều phát minh quan trọng về khoa học và kỹ thuật saun ày của Trung quốc.
Hoá chất Lưu huỳnh dùng để làm thuốc súng, than đá, thủy ngân, chì, nam châm có từ tính, cách luyện thép, bàn tính (abacus), v.v. có thể đã được bắt đầu nghiên cứu hay tìm ra trong thời kỳ này. Thí dụ về những huyền thoại phù phép mà Khổng Minh xử dụng, là do những phản ứng đặc biệt từ các hóa chất độc hại như lưu huỳnh, thuỷ ngân hay các loài dược thảo trộnc hung với nhau khi bị đốt cháy. Kết qủa là làm cho đối phương bị gây mê, mất trí hay mạng vong trong những vùng gọi là bát qúai trận đồ. Nhưng một trong những thành quả tốt đẹp hơn hết chínhl à bộ môn xem thiênvăn khí tượng bắt đầu xuất hiện được nhiều người biết đến. Nhờ vậy mà khoa lịch số đã được hiệu chỉnh, thay đổi đúng hơn cho tới bây giờ!

Phương pháp soạn Âm lịch

Có thể chia ra làm hai giai đoạn phát triển chính cho việc soạn thảo âm lịch.

Giai Đoạn I:

Kéo dài khoảng gần 2000 năm từ thời Hoàng đế cho đến thời Khổng tử. Trong giai đoạn này chỉ có ngày, tháng và năm. Chưa có chia ra giờ cũng như chưa có thiên can và địa chi. Công việc soạn lịch vào thời sơ khai này rất là dễ hiểu, không có gì phức tạp như nhiều người thường lầm tưởng. Những chiêm tinh gia thời đó chỉ dựa vào khoảng cách giữa hai tuần trăng tròn để tính số ngày cho một tháng. Khoảng cách của một năm thì được định bằng thời điểm vào lúc Trăng tròn nhất, khoảng ngày rằm tháng 8 (sau này thành ra tết Trung thu), và một phần dựa vào thời tiết thay đổi của 4 mùa.
Khó khăn duy nhất lúc ban đầu là cứ cách khoảng chừng hai năm thì tháng có trăng tròn nhất bị kéo dài thêm một tháng. Ðó là những tháng nhuận, và cách giải quyết thực tế đơn giản lúc bấy giờ là thêm nguyên một tháng vào những năm nhuận. Còn làm sao họ biết được năm nào nhuận là do phỏng chừng và dựa vào kinh nghiệm riêng của những đời trước theo kiểu cha truyền con nối. Chính cách làm theo lối thuận tiện như trên, nên âm lịch thường bị thành kiến cho là thiếu chính xác! Có thể trong thời kỳ này, tháng nhuận chỉ được thêm vào trong tháng trước tháng có trăng tròn nhất là tết Trung thu(?) Chỉ sau này khi bắt đầu ăn mừng ngày tết Nguyên đán và để không bị sai ngày quá xa, nên những nhà soạn lịch phải chia ra cho đều, thêm tháng nhuận vào các tháng khác.
Ngoài ra có vài chi tiết cần được để ý là hệ thống Âm lịch dựa vào thiên can và địa chi chỉ có phân biệt tối đa là 60 năm, nên nếu muốn viết lịch sử, họ thường dùng năm cait rị của Vua hay triều đại làm chuẩn. Thí dụ như trong sách thường viết là năm thứ mấy đời Vua nào đó gặp thiên tai bão lụt v.v. Lâu dần trở thành thói quen dùng luôn cho đến khi bị ảnh hưởng của nền văn minh Tây phương thay đổi.
Về giờ giấc, lịch số ở thời kỳ đầu cũng chưa chia ra 12 giờ như sau này. Ðể định giờ, họ dùng cách nói phỏng chừng theo vị trí của mặt trời, mà mãi cho đến bây giờ, nông dân ít học ở các vùng quê vẫn còn dùng, như khi nói mặt trời vừa lên quá ngọn cây (khoảng 8 đến 9 giờ sáng mùa hạ), hay mặt trời đứng bóng giữa trưa khoảng 12 giờ v.v.
Những gì vừa trình bày có thể kiểm chứng bằng bộ sách Chu dịch đã được soạn ra khoảng từ thời nhà Chu (1150 BC) cho đến thời Khổng tử (550 BC). Cụ thể là việc lập quẻ Dịch. Trong bộ Chu Dịch chính bản chỉ ghi cách lập quẻ duy nhất là dùng cỏ Thi, còn gọi là phép bói cỏ Thi, mà không dùng đến giờ nào như Khổng Minh dùng để bấm độn sau này. Các lời bàn của 64 quẻ trong bộ Chu Dịch nguyên thuỷ hoàn toàn không có nói rõ về giờ giấc.

Giai Ðoạn II:

Từ thời Khổng tử cho tới nhà Ðường khoảng chừng 1000 năm. Thời kỳ này văn minh Trung Hoa bắt đầu khởi sắc đi lên. Các Ðạo sĩ hay Chiêm tinh gia làm việc có phương pháp và khoa học hơn. Nhờ vậy, họ đã tìm ra hay khám phá được chu kỳ vận chuyển của các hành tinh trong Thái Dương hệ, và từ đó âm lịch mới được thay đổi để thêm vào Thiên can, Ðịa chi, Lục tuần Hoa giáp (hay chu kỳ 60 năm). Trước khi đi sâu vào chi tiết, và để quý đọc giả dễ theo dõi vấn đề hơn, người viết xin nhắc lại một vài dữ kiện căn bản như sau:
Trong những đêm tốt trời không mây, nếu dùng mắt thường chúng ta có thể đếm được cả vài trăm ngôi sao là chuyện thường. Tuy nhiên, tất cả đều thấy gần như cố định không thay đổi theo năm tháng, vì không phụ thuộc vào một hệ thống vệ tinh như Thái dương hệ, hoặc giả có chu kỳ di chuyển quá lớn đến cả ngàn vạn năm. Còn lại, trừ trường hợp đặc biệt như sao chổi (Comet) và sao băng (Asteroid), chúng ta chỉ thấy được những hành tinh thuộc Thái dương hệ di chuyển mà thôi. Trong tám (8) hành tinh chính, trừ mặt trời và mặt trăng, mắt thường của chúng ta chỉ thấy được có năm(5) hành tinh. Ðó là Thủy tinh(Mercury), Kim tinh(Venus), Hỏa tinh(Mars), Mộc tinh(Jupiter), và chót là Thổ tinh(Saturn). Ba(3) hành tinh không thấy được bằng mắt thường là Diêm vương tinh (Uranus), Hải vương tinh (Neptune) và Thiên vương tinh(Pluto). Không biết có phải là trùng hợp ngẫu nhiên của tạo hóa, hay sắp đặt khéo léo của con người, trong 8 quái (Bát quái hay 8 hành?) của Dịch lý, các “Khoa học gia” thời đó chỉ thấy được có 5 quái: Ðịa, Sơn, Thủy, Lôi, và Hỏa, nên phát minh ra Ngũ hành (Người viết đã trình bày trong bài “Những khám phá mới về Dịch lý và Ngũ hành” cách đây hơn hai năm.)
Ðể tìm hiểu về 5 hành tinh thấy được chuyển động như thế nào, các Chiêm tinh gia thời đó đã dùng một phương pháp đơn giản nhưng rất khoa học, là ghi chép lại vị trí của các hành tinh sau một thời khoảng nhất định. Thời điểm tốt nhất để xem thiên văn là mỗi tháng một lần vào cuối hay đầu tháng, lúc trăng hoàn toàn bị che mất (đêm 29, 30 hay 1). Muốn định rõ vị trí của các sao, có lẽ họ cũng biết dùng theo phương pháp chấm tọa độ, nhưng kém chính xác rất nhiều. Dùng sao Bắc đẩu làm chuẩn và theo đồ hình Bát quái, họ có thể định phương vị (hay khẩu độ) của một sao, và kế đến là cũng theo lối ước chừng độ cao của mặt trời để định khoảng cách từ đường chân trời. Thí dụ như để định vị ngôi sao ở 220 độ từ hướng Bắc (theo chiều kim đồng hồ) và 25 độ cách chân trời nằm ngang, họ có thể nói là nằm ở giữa cung Khôn (hướng Tây-Nam) cách chân trời khoảng một gang tay chẳng hạn. Về sau để được chính xác hơn, có thể các chiêm tinh gia đã dùng đến các tên của quẻ dịch để phân chia thành 64 cung trên vòng tròn. Ðó chính là lý do tại sao các nhà nghiên cứu vềs au có thể hiểu lầm vì bị nạn “tam sao thất bổn”, nên tưởng là môn lịch số có nguồn gốc từ Dịch lý mà ra.
nguon goc lich am vietnam 2
Dù bằng cách nào thì cũng nhờ khái niệm tuần hoàn và chu kỳ âm dương của Dịch lý, chiêm tinh gia thời đó có thể tin chắc là các vì sao đều chuyển động theo một chu kỳ nhất định nào đó. Nếu không thì có lẽ họ không bỏ thì giờ quá lâu cho cả một đời người để tìm ra gần đúng chu kỳ của 5 hành tinh trong Thái dương hệ, trước Âu Châu cả hơn ngàn năm!
Kết quả công trình nghiên cứu và ghi chép vị trí sao của các Chiêm tinh gia Trung hoa nói trên cho thấy là cứ mỗi 60 năm thì cả 5 hành tinh đều quay trở về lại gần vị trí cũ! Ðặc biệt hơn hết, là vào khoảng cuối năm Quý Hợi và đầu năm Giáp Tý thì cả 5 hành tinh đều hội tụ lại, và nằm sát với nhau chung một hướng. Xin nhắc lại đây để tránh hiểu nhầm, nhờ tình cờ ngẫu nhiên quan sát thấy hiện tượng 5 sao tụ hội về một chỗ trước khi phân tán ra, nên có thể các nhà lịch số cho rằng đó là khởi điểm đầu tiên cho chu kỳ 60 năm, và họ đặt tên cho năm có hiện tượng đó là Giáp Tý, đứng đầu trong bảng lục tuần hoa giáp.

Quy tắc tính lịch âm Việt Nam

Âm lịch Việt Nam là một loại lịch thiên văn. Nó được tính toán dựa trên sự chuyển động của mặt trời, trái đất và mặt trăng. Ngày tháng âm lịch được tính dựa theo các nguyên tắc sau:
Ngày đầu tiên của tháng âm lịch là ngày chứa điểm Sóc
Một năm bình thường có 12 tháng âm lịch, một năm nhuận có 13 tháng âm lịch
Đông chí luôn rơi vào tháng 11 âm lịch
Trong một năm nhuận, nếu có 1 tháng không có Trung khí thì tháng đó là tháng nhuận. Nếu nhiều tháng trong năm nhuận đều không có Trung khí thì chỉ tháng đầu tiên sau Đông chí là tháng nhuận
Việc tính toán dựa trên kinh tuyến 105° đông.
Sóc là thời điểm hội diện, đó là khi trái đất, mặt trăng và mặt trời nằm trên một đường thẳng và mặt trăng nằm giữa trái đất và mặt trời. (Như thế góc giữa mặt trăng và mặt trời bằng 0 độ). Gọi là “hội diện” vì mặt trăng và mặt trời ở cùng một hướng đối với trái đất. Chu kỳ của điểm Sóc là khoảng 29,5 ngày. Ngày chứa điểm Sóc được gọi là ngày Sóc, và đó là ngày bắt đầu tháng âm lịch.
Trung khí là các điểm chia đường hoàng đạo thành 12 phần bằng nhau. Trong đó, bốn Trung khí giữa bốn mùa là đặc biệt nhất: Xuân phân (khoảng 20/3), Hạ chí (khoảng 22/6), Thu phân (khoảng 23/9) và Đông chí (khoảng 22/12).
Bởi vì dựa trên cả mặt trời và mặt trăng nên lịch Việt Nam không phải là thuần âm lịch mà là âm-dương-lịch. Theo các nguyên tắc trên, để tính ngày tháng âm lịch cho một năm bất kỳ trước hết chúng ta cần xác định những ngày nào trong năm chứa các thời điểm Sóc (New moon) . Một khi bạn đã tính được ngày Sóc, bạn đã biết được ngày bắt đầu và kết thúc của một tháng âm lịch: ngày mùng một của tháng âm lịch là ngày chứa điểm sóc. Sau khi đã biết ngày bắt đầu/kết thúc các tháng âm lịch, ta tính xem các Trung khí (Major solar term) rơi vào tháng nào để từ đó xác định tên các tháng và tìm tháng nhuận.
Đông chí luôn rơi vào tháng 11 của năm âm lịch. Bởi vậy chúng ta cần tính 2 điểm sóc: Sóc A ngay trước ngày Đông chí thứ nhất và Sóc B ngay trước ngày Đông chí thứ hai. Nếu khoảng cách giữa A và B là dưới 365 ngày thì năm âm lịch có 12 tháng, và những tháng đó có tên là: tháng 11, tháng 12, tháng 1, tháng 2, …, tháng 10. Ngược lại, nếu khoảng cách giữa hai sóc A và B là trên 365 ngày thì năm âm lịch này là năm nhuận, và chúng ta cần tìm xem đâu là tháng nhuận. Để làm việc này ta xem xét tất cả các tháng giữa A và B, tháng đầu tiên không chứa Trung khí sau ngày Đông chí thứ nhất là tháng nhuận. Tháng đó sẽ được mang tên của tháng trước nó kèm chữ “nhuận”.
Khi tính ngày Sóc và ngày chứa Trung khí bạn cần lưu ý xem xét chính xác múi giờ. Đây là lý do tại sao có một vài điểm khác nhau giữa lịch Việt Nam và lịch Trung Quốc.Ví dụ, nếu bạn biết thời điểm hội diện là vào lúc yyyy-02-18 16:24:45 GMT thì ngày Sóc của lịch Việt Nam là 18 tháng 2, bởi vì 16:24:45 GMT là 23:24:45 cùng ngày, giờ Hà nội (GMT+7, kinh tuyến 105° đông). Tuy nhiên theo giờ Bắc Kinh (GMT+8, kinh tuyến 120° đông) thì Sóc là lúc 00:24:45 ngày yyyy-02-19, do đó tháng âm lịch của Trung Quốc lại bắt đầu ngày yyyy-02-19, chậm hơn lịch Việt Nam 1 ngày.
Ví dụ 1: Âm lịch năm 1984
Chúng ta áp dụng quy luật trên để tính âm lịch Việt nam năm 1984.
Sóc A (ngay trước Đông chí năm 1983) rơi vào ngày 4/12/1983, Sóc B (ngay trước Đông chí năm 1984) vào ngày 23/11/1984.
Giữa A và B là khoảng 355 ngày, như thế năm âm lịch 1984 là năm thường. Tháng 11 âm lịch của năm trước kéo dài từ 4/12/1983 đến 2/01/1984, tháng 12 âm từ 3/1/1984 đến 1/2/1984, tháng Giêng từ 2/2/1984 đến 1/3/1984 v.v.
Ví dụ 2: Âm lịch năm 2004
Sóc A – điểm sóc cuối cùng trước Đông chí 2003 – rơi vào ngày 23/11/2003. Sóc B (ngay trước Đông chí năm 2004) rơi vào ngày 12/12/2004.
Giữa 2 ngày này là khoảng 385 ngày, như vậy năm âm lịch 2004 là năm nhuận. Tháng 11 âm của năm 2003 bắt đầu vào ngày chứa Sóc A, tức ngày 23/11/2003.
Tháng âm lịch đầu tiên sau đó mà không chứa Trung khí là tháng từ 21/3/2004 đến 18/4/2004 (Xuân phân rơi vào 20/3/2004, còn Cốc vũ là 19/4/2004). Như thế tháng ấy là tháng nhuận.
Từ 23/11/2003 đến 21/3/2004 là khoảng 120 ngày, tức 4 tháng âm lịch: tháng 11, 12, 1 và 2. Như vậy năm 2004 có tháng 2 nhuận.

Thuật toán chuyển đổi giữa ngày dương và âm

Trong tính toán thiên văn người ta lấy ngày 1/1/4713 trước công nguyên của lịch Julius (tức ngày 24/11/4714 trước CN theo lịch Gregorius) làm điểm gốc. Số ngày tính từ điểm gốc này gọi là số ngày Julius (Julian day number) của một thời điểm. Ví dụ, số ngày Julius của 1/1/2000 là 24515455.
Dùng các công thức sau ta có thể chuyển đổi giữa ngày/tháng/năm và số ngày Julius. Phép chia ở 2 công thức sau được hiểu là chia số nguyên, bỏ phần dư: 23/4=5.
Đổi ngày dd/mm/yyyy ra số ngày Julius jd
a = (14 – mm) / 12
y = yy+4800-a
m = mm+12*a-3
Lịch Gregory:
jd = dd + (153*m+2)/5 + 365*y + y/4 – y/100 + y/400 – 32045Ω
Lịch Julius:
jd = dd + (153*m+2)/5 + 365*y + y/4 – 32083
Đổi số ngày Julius jd ra ngày dd/mm/yyyy
Lịch Gregory (jd lớn hơn 2299160):
a = jd + 32044;
b = (4*a+3)/146097;
c = a – (b*146097)/4;
Lịch Julius:
b = 0;
c = jd + 32082;
Công thức cho cả 2 loại lịch:
d = (4*c+3)/1461;
e = c – (1461*d)/4;
m = (5*e+2)/153;
dd = e – (153*m+2)/5 + 1;
mm = m + 3 – 12*(m/10);
yy = b*100 + d – 4800 + m/10;
Nếu ngôn ngữ lập trình bạn dùng không hỗ trợ phép chia số nguyên bỏ phần dư (VD: JavaScript), bạn có thể định nghĩa một hàm INT(x) để lấy số nguyên lớn nhất không vượt quá x: INT(5)=5, INT(3.2)=3, INT(-5)=-5, INT(-3.2)=-4 v.v. Khi đó, INT(m/10) sẽ trả lại kết quả của phép chia số nguyên. (Nhiều ngôn ngữ có sẵn hàm floor() cho phép làm việc này.)
Các phép chuyển đổi giữa ngày tháng và số ngày Julius có thể được thực hiện với mã JavaScript như sau:
function jdFromDate(dd, mm, yy)
var a, y, m, jd;
a = INT((14 – mm) / 12);
y = yy+4800-a;
m = mm+12*a-3;
jd = dd + INT((153*m+2)/5) + 365*y + INT(y/4) – INT(y/100) + INT(y/400) – 32045;
if (jd < 2299161) {
jd = dd + INT((153*m+2)/5) + 365*y + INT(y/4) – 32083;
}
return jd;
function jdToDate(jd)
var a, b, c, d, e, m, day, month, year;
if (jd > 2299160) { // After 5/10/1582, Gregorian calendar
a = jd + 32044;
b = INT((4*a+3)/146097);
c = a – INT((b*146097)/4);
} else {
b = 0;
c = jd + 32082;
}
d = INT((4*c+3)/1461);
e = c – INT((1461*d)/4);
m = INT((5*e+2)/153);
day = e – INT((153*m+2)/5) + 1;
month = m + 3 – 12*INT(m/10);
year = b*100 + d – 4800 + INT(m/10);
return new Array(day, month, year);
Trong các công thức sau, timeZone là số giờ chênh lệch giữa giờ địa phương và giờ UTC (hay GMT). (Để tính lịch Việt Nam, lấy timeZone = 7.0). Các phương pháp sau được giới thiệu với mã JavaScript. Bạn có thể tải thư viện JavaScript hoặc thư viện PHP hoàn chỉnh để tham khảo.

Tính ngày Sóc

Như trên đã nói, để tính được âm lịch trước hết ta cần xác định các tháng âm lịch bắt đầu vào ngày nào.
Thuật toán sau tính ngày Sóc thứ k kể từ điểm Sóc ngày 1/1/1900. Kết quả trả về là số ngày Julius của ngày Sóc cần tìm.
function getNewMoonDay(k, timeZone)
var T, T2, T3, dr, Jd1, M, Mpr, F, C1, deltat, JdNew;
T = k/1236.85; // Time in Julian centuries from 1900 January 0.5
T2 = T * T;
T3 = T2 * T;
dr = PI/180;
Jd1 = 2415020.75933 + 29.53058868*k + 0.0001178*T2 – 0.000000155*T3;
Jd1 = Jd1 + 0.00033*Math.sin((166.56 + 132.87*T – 0.009173*T2)*dr); // Mean new moon
M = 359.2242 + 29.10535608*k – 0.0000333*T2 – 0.00000347*T3; // Sun’s mean anomaly
Mpr = 306.0253 + 385.81691806*k + 0.0107306*T2 + 0.00001236*T3; // Moon’s mean anomaly
F = 21.2964 + 390.67050646*k – 0.0016528*T2 – 0.00000239*T3; // Moon’s argument of latitude
C1=(0.1734 – 0.000393*T)*Math.sin(M*dr) + 0.0021*Math.sin(2*dr*M);
C1 = C1 – 0.4068*Math.sin(Mpr*dr) + 0.0161*Math.sin(dr*2*Mpr);
C1 = C1 – 0.0004*Math.sin(dr*3*Mpr);
C1 = C1 + 0.0104*Math.sin(dr*2*F) – 0.0051*Math.sin(dr*(M+Mpr));
C1 = C1 – 0.0074*Math.sin(dr*(M-Mpr)) + 0.0004*Math.sin(dr*(2*F+M));
C1 = C1 – 0.0004*Math.sin(dr*(2*F-M)) – 0.0006*Math.sin(dr*(2*F+Mpr));
C1 = C1 + 0.0010*Math.sin(dr*(2*F-Mpr)) + 0.0005*Math.sin(dr*(2*Mpr+M));
if (T < -11) {
deltat= 0.001 + 0.000839*T + 0.0002261*T2 – 0.00000845*T3 – 0.000000081*T*T3;
} else {
deltat= -0.000278 + 0.000265*T + 0.000262*T2;
};
JdNew = Jd1 + C1 – deltat;
return INT(JdNew + 0.5 + timeZone/24)
Với hàm này ta có thể tính được tháng âm lịch chứa ngày N bắt đầu vào ngày nào: giữa ngày 1/1/1900 (số ngày Julius: 2415021) và ngày N có khoảng k=INT((N-2415021)/29.530588853) tháng âm lịch, như thế dùng hàm getNewMoonDay sẽ biết ngày đầu tháng âm lịch chứa ngày N, từ đó ta biết ngày N là mùng mấy âm lịch.

Tính tọa độ mặt trời

Để biết Trung khí nào nằm trong tháng âm lịch nào, ta chỉ cần tính xem mặt trời nằm ở khoảng nào trên đường hoàng đạo vào thời điểm bắt đầu một tháng âm lịch. Ta chia đường hoàng đạo làm 12 phần và đánh số các cung này từ 0 đến 11: từ Xuân phân đến Cốc vũ là 0; từ Cốc vũ đến Tiểu mãn là 1; từ Tiểu mãn đến Hạ chí là 2; v.v.. Cho jdn là số ngày Julius của bất kỳ một ngày, phương pháp sau này sẽ trả lại số cung nói trên.
function getSunLongitude(jdn, timeZone)
var T, T2, dr, M, L0, DL, L;
T = (jdn – 2451545.5 – timeZone/24) / 36525; // Time in Julian centuries from 2000-01-01 12:00:00 GMT
T2 = T*T;
dr = PI/180; // degree to radian
M = 357.52910 + 35999.05030*T – 0.0001559*T2 – 0.00000048*T*T2; // mean anomaly, degree
L0 = 280.46645 + 36000.76983*T + 0.0003032*T2; // mean longitude, degree
DL = (1.914600 – 0.004817*T – 0.000014*T2)*Math.sin(dr*M);
DL = DL + (0.019993 – 0.000101*T)*Math.sin(dr*2*M) + 0.000290*Math.sin(dr*3*M);
L = L0 + DL; // true longitude, degree
L = L*dr;
L = L – PI*2*(INT(L/(PI*2))); // Normalize to (0, 2*PI)
return INT(L / PI * 6)
Với hàm này ta biết được một tháng âm lịch chứa Trung khí nào. Giả sử một tháng âm lịch bắt đầu vào ngày N1 và tháng sau đó bắt đầu vào ngày N2 và hàm getSunLongitude cho kết quả là 8 với N1 và 9 với N2. Như vậy tháng âm lịch bắt đầu ngày N1 là tháng chứa Đông chí: trong khoảng từ N1 đến N2 có một ngày mặt trời di chuyển từ cung 8 (sau Tiểu tuyết) sang cung 9 (sau Đông chí). Nếu hàm getSunLongitude trả lại cùng một kết quả cho cả ngày bắt đầu một tháng âm lịch và ngày bắt đầu tháng sau đó thì tháng đó không có Trung khí và như vậy có thể là tháng nhuận.

Tìm ngày bắt đầu tháng 11 âm lịch

Đông chí thường nằm vào khoảng 19/12-22/12, như vậy trước hết ta tìm ngày Sóc trước ngày 31/12. Nếu tháng bắt đầu vào ngày đó không chứa Đông chí thì ta phải lùi lại 1 tháng nữa.
function getLunarMonth11(yy, timeZone)
var k, off, nm, sunLong;
off = jdFromDate(31, 12, yy) – 2415021;
k = INT(off / 29.530588853);
nm = getNewMoonDay(k, timeZone);
sunLong = getSunLongitude(nm, timeZone); // sun longitude at local midnight
if (sunLong >= 9) {
nm = getNewMoonDay(k-1, timeZone);
}
return nm;

Xác định tháng nhuận

Nếu giữa hai tháng 11 âm lịch (tức tháng có chứa Đông chí) có 13 tháng âm lịch thì năm âm lịch đó có tháng nhuận. Để xác định tháng nhuận, ta sử dụng hàm getSunLongitude như đã nói ở trên. Cho a11 là ngày bắt đầu tháng 11 âm lịch mà một trong 13 tháng sau đó là tháng nhuận. Hàm sau cho biết tháng nhuận nằm ở vị trí nào sau tháng 11 này.
function getLeapMonthOffset(a11, timeZone)
var k, last, arc, i;
k = INT((a11 – 2415021.076998695) / 29.530588853 + 0.5);
last = 0;
i = 1; // We start with the month following lunar month 11
arc = getSunLongitude(getNewMoonDay(k+i, timeZone), timeZone);
do {
last = arc;
i++;
arc = getSunLongitude(getNewMoonDay(k+i, timeZone), timeZone);
} while (arc != last && i < 14);
return i-1;
Giả sử hàm getLeapMonthOffset trả lại giá trị 4, như thế tháng nhuận sẽ là tháng sau tháng 2 thường. (Tháng thứ 4 sau tháng 11 đáng ra là tháng 3, nhưng vì đó là tháng nhuận nên sẽ lấy tên của tháng trước đó tức tháng 2, và tháng thứ 5 sau tháng 11 mới là tháng 3).

Đổi ngày dương dd/mm/yyyy ra ngày âm

Với các phương pháp hỗ trợ trên ta có thể đổi ngày dương dd/mm/yy ra ngày âm dễ dàng. Trước hết ta xem ngày monthStart bắt đầu tháng âm lịch chứa ngày này là ngày nào (dùng hàm getNewMoonDay như trên đã nói). Sau đó, ta tìm các ngày a11 và b11 là ngày bắt đầu các tháng 11 âm lịch trước và sau ngày đang xem xét. Nếu hai ngày này cách nhau dưới 365 ngày thì ta chỉ còn cần xem monthStart và a11 cách nhau bao nhiêu tháng là có thể tính được dd/mm/yy nằm trong tháng mấy âm lịch. Ngược lại, nếu a11 và b11 cách nhau khoảng 13 tháng âm lịch thì ta phải tìm xem tháng nào là tháng nhuận và từ đó suy ra ngày đang tìm nằm trong tháng nào. Công thức đổi ngày dương sang âm như sau:
function convertSolar2Lunar(dd, mm, yy, timeZone)
var k, dayNumber, monthStart, a11, b11, lunarDay, lunarMonth, lunarYear, lunarLeap;
dayNumber = jdFromDate(dd, mm, yy);
k = INT((dayNumber – 2415021.076998695) / 29.530588853);
monthStart = getNewMoonDay(k+1, timeZone);
if (monthStart > dayNumber) {
monthStart = getNewMoonDay(k, timeZone);
}
a11 = getLunarMonth11(yy, timeZone);
b11 = a11;
if (a11 >= monthStart) {
lunarYear = yy;
a11 = getLunarMonth11(yy-1, timeZone);
} else {
lunarYear = yy+1;
b11 = getLunarMonth11(yy+1, timeZone);
}
lunarDay = dayNumber-monthStart+1;
diff = INT((monthStart – a11)/29);
lunarLeap = 0;
lunarMonth = diff+11;
if (b11 – a11 > 365) {
leapMonthDiff = getLeapMonthOffset(a11, timeZone);
if (diff >= leapMonthDiff) {
lunarMonth = diff + 10;
if (diff == leapMonthDiff) {
lunarLeap = 1;
}
}
}
if (lunarMonth > 12) {
lunarMonth = lunarMonth – 12;
}
if (lunarMonth >= 11 && diff < 4) {
lunarYear -= 1;
}

Đổi âm lịch ra dương lịch

Cách làm cũng tương tự như đổi ngày dương sang ngày âm.
function convertLunar2Solar(lunarDay, lunarMonth, lunarYear, lunarLeap, timeZone)
var k, a11, b11, off, leapOff, leapMonth, monthStart;
if (lunarMonth < 11) {
a11 = getLunarMonth11(lunarYear-1, timeZone);
b11 = getLunarMonth11(lunarYear, timeZone);
} else {
a11 = getLunarMonth11(lunarYear, timeZone);
b11 = getLunarMonth11(lunarYear+1, timeZone);
}
off = lunarMonth – 11;
if (off < 0) {
off += 12;
}
if (b11 – a11 > 365) {
leapOff = getLeapMonthOffset(a11, timeZone);
leapMonth = leapOff – 2;
if (leapMonth < 0) {
leapMonth += 12;
}
if (lunarLeap != 0 && lunarMonth != leapMonth) {
return new Array(0, 0, 0);
} else if (lunarLeap != 0 || off >= leapOff) {
off += 1;
}
}
k = INT(0.5 + (a11 – 2415021.076998695) / 29.530588853);
monthStart = getNewMoonDay(k+off, timeZone);
return jdToDate(monthStart+lunarDay-1);

Tính ngày thứ và Can-Chi cho ngày và tháng âm lịch

Ngày thứ lặp lại theo chu kỳ 7 ngày, như thế để biết một ngày d/m/y bất kỳ là thứ mấy ta chỉ việc tìm số dư của số ngày Julius của ngày này cho 7.
Để tính Can của năm Y, tìm số dư của Y+6 chia cho 10. Số dư 0 là Giáp, 1 là Ất v.v. Để tính Chi của năm, chia Y+8 cho 12. Số dư 0 là Tý, 1 là Sửu, 2 là Dần v.v.
Hiệu Can-Chi của ngày lặp lại theo chu kỳ 60 ngày, như thế nó cũng có thể tính được một cách đơn giản. Cho N là số ngày Julius của ngày dd/mm/yyyy. Ta chia N+9 cho 10. Số dư 0 là Giáp, 1 là Ất v.v. Để tìm Chi, chia N+1 cho 12; số dư 0 là Tý, 1 là Sửu v.v.
Trong một năm âm lịch, tháng 11 là tháng Tý, tháng 12 là Sửu, tháng Giêng là tháng Dần v.v. Can của tháng M năm Y âm lịch được tính theo công thức sau: chia Y*12+M+3 cho 10. Số dư 0 là Giáp, 1 là Ất v.v.
Ví dụ, Can-Chi của tháng 3 âm lịch năm Giáp Thân 2004 là Mậu Thìn: tháng 3 âm lịch là tháng Thìn, và (2004*12+3+3) % 10 = 24054 % 10 = 4, như vậy Can của tháng là Mậu.
Một tháng nhuận không có tên riêng mà lấy tên của tháng trước đó kèm thêm chữ “Nhuận”, VD: tháng 2 nhuận năm Giáp Thân 2004 là tháng Đinh Mão nhuận.

Website và ứng dụng xem lịch âm

Lichvannien.net tự hào là website xem lịch âm chính xác nhất hiện nay. Không chỉ phát triển giao diện website dễ dàng sử dụng cho tất cả mọi người, lichvannien.net còn phát triển ứng dụng xem lịch vạn niên trên Android và IOS với các tính năng:
Website xem lịch vạn niên - lịch âm - lịch vạn sự
LỊCH NGÀY

  • Xem lịch Âm, lịch Dương
  • Xem can, chi của giờ, ngày, tháng, năm
  • Xem giờ Hoàng đạo
  • Xem ngày hoàng đạo
  • Hiển thị danh ngôn theo chủ đề và thay đổi theo ngày
  • Xem thời tiết hiện tại, cả ngày và các ngày kế tiếp
  • Giao diện đẹp
  • Thay đổi ảnh nền

LỊCH THÁNG

  • Xem nhanh ngày Âm, Dương theo tháng, chi tiết từng ngày.
  • Hiển thị chi tiết ngày, xem ngày hoàng đạo, hắc đạo trong tháng.

GHI CHÚ

  • Thêm và quản lý ghi chú.
  • Hiển thị danh sách sự kiện.

VĂN HÓA VIỆT

  • Danh nhân Việt Nam
  • Thơ ca Việt Nam
  • Ca dao tục ngữ
  • Phong tục , hát ru, đồng dao
  • Văn khấn
  • Ý nghĩa ngày lễ
  • Lời chúc tết
  • Phong tục ngày tết
  • Cẩm nang ngày tết

KHÁM PHÁ
Tiện ích:

  • Tử vi bói toán: Tử vi 2021, xem sao giải hạn, tử vi trọn đời
  • Đổi ngày: Đổi ngày âm dương, đếm ngày xuôi ngược
  • La bàn phong thuỷ
  • Xông đất năm 2021

Các nội dung khác như: Danh nhân thế giới, danh ngôn cuộc sống, mẹo vặt hàng ngày, truyện cười, truyện cổ tích Việt Nam cũng như thế giới

Sự đánh giá và góp ý của các bạn là động lực lớn để chúng tôi tiếp tục nâng cấp hoàn thiện hơn cho sản phẩm:

  • Website: https://lichvannien.net
  • Mail: lichvannien.net@gmail.com
  • Phone: 0387139054
  • Địa chỉ: Tòa Nhà Viettel 285 Cách Mạng Tháng Tám, Phường 12, Quận 10, Thành phố Hồ Chí Minh
  • Facebook: https://www.facebook.com/lichvanniennet/
  • Instagram: https://www.instagram.com/lichvanniennet/
  • Twitter: https://twitter.com/lichvannien_net

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *