Hiển thị các bài đăng có nhãn ☽ Calendar. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn ☽ Calendar. Hiển thị tất cả bài đăng

Thứ Năm, 26 tháng 2, 2015

Âm lịch dưới góc nhìn khoa học


Hàng ngày khi nhìn lên cuốn lịch treo tường cũng như nhiều loại lịch khác thông dụng trong công việc và cuộc sống hàng ngày của người Việt Nam, chúng ta đều thấy có hai phần dương lịch và âm lịch. Dương lịch giúp người ta lên kế hoạch làm việc, tính chu kì thời tiết, nói cách khác về cơ bản nó mang phần nhiều ý nghĩa vật chất. Trong khi đó, âm lịch lại có một ý nghĩa rất đặc biệt đối với đời sống văn hóa và tinh thần của người phương Đông nói chung và người Việt Nam nói riêng. Hiểu về âm lịch như thế nào cho đầy đủ, cho đúng cả về cơ sở khoa học lẫn ý nghĩa văn hóa, là điều không nên bỏ qua.


Cơ sở thiên văn học của Âm lịch
Khác với Dương lịch được đặt ra dựa trên chu kỳ chuyển động của Trái Đất quanh Mặt Trời, Âm lịch dựa trên chu kỳ chuyển động của Mặt Trăng quanh Trái Đất.
Mặt Trăng chuyển động quanh Trái Đất mỗi vòng hết 27,32 ngày. Tuy vậy trên thực tế, vì bản thân Trái Đất còn có chuyển động quanh Mặt Trời nên Mặt Trăng cần thêm một chút thời gian nữa để trở về vị trí cũ trên bầu trời khi nhìn từ Trái Đất, do vậy chu kỳ mà chúng ta quan sát thực tế của Mặt Trăng là 29,53 ngày. Chu kỳ này được gọi là một "tuần trăng". Từ xa xưa người phương Đông đã nhận thấy khoảng 12 tuần trăng tương đương với một chu kỳ thời tiết. Để thuận tiện cho việc quan sát, dự đoán thời tiết phục vụ sản xuất nông nghiệp, người ta chọn một chu kỳ này là một năm, mỗi tuần trăng gọi là một tháng. Tuy vậy, cứ 3 năm thì lại bị chậm so với chu kì thời tiết khoảng 1 tháng nên cần có thêm một tháng bù vào. Những năm có tháng bù vào này được gọi là năm nhuận, chẳng hạn như năm Giáp Ngọ vừa qua là một năm nhuận.

Người phương Đông xưa lại đặt ra Can và Chi, hay gọi đầy đủ là Thiên Can và Địa Chi, đều có cơ sở từ quan sát thiên văn. Thời trước, người ta chưa biết rằng các ngôi sao trên bầu trời đều là các thiên thể như Mặt Trời, chỉ có riêng các hành tinh là chuyển động quanh Mặt Trời. Tuy vậy, người thời đó đã nhận thấy có năm đốm sáng không đứng im so với nền trời sao mà vị trí thay đổi mỗi ngày, họ gọi chúng là các hành tinh. Năm hành tinh này gồm: Sao Thủy, Sao Kim, Sao Hỏa, Sao Mộc và Sao Thổ, được gọi là ngũ hành  (Sao Thiên Vương và Sao Hải Vương chỉ có thể quan sát qua kính thiên văn nên người thời xưa không nhìn thấy). Khi quan sát năm hành tinh này, người phương Đông cổ nhận thấy mỗi hành tinh đều có một chu kỳ nhất định để chúng trở về vị trí cũ so với nền trời sao. Cụ thể như sau: Sao Thủy: khoảng 0,25 năm; Sao Kim: khoảng 0,6 năm; Sao Hỏa: khoảng 2 năm; Sao Mộc: khoảng 12 năm; Sao Thổ: khoảng 30 năm.

Sao Hỏa cứ hai năm lại về vị trí cũ, nên mỗi chu kỳ của nó được coi tương ứng với một hành trong ngũ hành (Kim, Mộc, Thủy, Hỏa, Thổ), mỗi hành hai năm như vậy nên có một năm mang tính dương và một năm mang tính âm. Tổng cộng mỗi chu kỳ như vậy là 10 năm, vậy nên người ta đặt ra 10 can tương ứng với âm và dương của mỗi hành.
10 can gồm: Giáp, Ất tương ứng với Mộc; Bính, Đinh tương ứng với Hỏa; Mậu, Kỷ tương ứng với Thổ; Canh, Tân tương ứng với Kim; Nhâm, Quý tương ứng với Thủy.
Trong khi đó Sao Mộc hết khoảng 12 năm trở về vị trí cũ. Con số 12 này cũng trùng với số tuần Trăng trung bình của một năm. Vậy nên 12 chi được đặt ra, mỗi chi gắn vào một năm theo chu kỳ này và vào một tháng trong năm. Sao Mộc có chu kỳ trùng khớp như vậy nên còn được gọi là Tuế Tinh. 12 chi gồm có: Tý, Sửu, Dần, Mão, Thìn, Tỵ, Ngọ, Mùi, Thân, Dậu, Tuất, Hợi.
Mỗi năm âm lịch được gọi tên bằng một can đi với một chi, ví dụ năm vừa rồi là năm Giáp Ngọ, năm tới là năm Ất Mùi. Vì bội số chung nhỏ nhất của 10 và 12 là 60 nên có thể thấy ngay rằng cứ 60 năm thì chu kỳ mới kết thúc; chẳng hạn chúng ta đón Tết Ất Mùi bây giờ thì phải đúng 60 năm sau mới lại được thấy Tết Ất Mùi.
Con số 60 này cũng chính là bội số chung nhỏ nhất của 2, 12 và 30 (chu kỳ của các hành tinh như nêu trên), nên 60 năm cũng chính là khoảng thời gian tương đối chính xác để tất cả 5 hành tinh quay trở lại vị trí tương đối như cũ. Chu kỳ này còn thường được gọi là Lục Thập Hoa Giáp. Ngoài ra, như chúng ta đều biết, can chi không chỉ được ứng dụng để gọi tên tháng, năm mà còn dùng cho cả tên gọi ngày, giờ.
Như vậy có thể thấy rằng âm lịch mà chúng ta đang sử dụng có cơ sở rất mật thiết từ các quan sát thiên văn. Dựa vào chu kỳ chuyển động của các thiên thể mà người ta đưa ra các qui ước tính thời gian, và ngược lại qua quan sát vị trí và chuyển động của các thiên thể cũng có thể phán đoán được các giá trị thời gian (Điều này được ứng dụng nhiều trong tra cứu lịch sử. Nhiều chi tiết trong lịch sử không rõ ngày tháng sau đó được làm rõ nhờ những văn bản còn lại có nhắc đến vị trí của các thiên thể trên bầu trời).
Khác với nhiều người vẫn nghĩ lịch chỉ đơn giản là để đếm thời gian, trên thực tế lịch cần đáp ứng được việc dự đoán chu kỳ chuyển động của các thiên thể và qua đó dự đoán được chu kỳ thời tiết, qui luật xảy ra các hiện tượng tự nhiên. Có thể thấy mặc dù đi theo một hướng khác với phương Tây ở nghiên cứu khoa học nói chung và lịch pháp nói riêng,  nhưng văn hóa phương Đông cũng thể hiện tinh hoa riêng của mình.

Điều gì hạn chế ở Âm lịch?
Âm lịch chúng ta đang sử dụng đã được cải biên thêm về cách tính năm nhuận cho phù hợp hơn với Dương lịch, vì thế gọi một cách chính xác thì lịch cổ truyền ngày nay chúng ta sử dụng là "Âm Dương lịch". Tuy vậy để gần gũi và dễ hiểu thì trong bài này tôi vẫn xin phép gọi ngắn gọn là "Âm lịch" như vẫn gọi từ đầu bài viết.
Như chúng ta đã thấy, Âm lịch có cơ sở khoa học rõ ràng và mang màu sắc văn hóa đặc sắc phương Đông. Tuy nhiên, cũng không nên phủ nhận việc nó vẫn có hạn chế so với Dương lịch. Hạn chế cơ bản nhất là: vì trên thực tế một chu kỳ Trái Đất chuyển động quanh Mặt Trời không phải là tương đương với 12 tuần Trăng (12 tháng Âm lịch) mà dài hơn khoảng 10 ngày,  do đó dù Âm lịch được bổ sung việc tính năm nhuận nhưng sự dịch chuyển về ngày tương ứng hàng năm khiến cho ngày tháng trong Âm lịch không phản ánh chính xác chu kỳ thời tiết như Dương lịch (chu kỳ thời tiết trên Trái Đất là do Trái Đất chuyển động quanh Mặt Trời). Chẳng hạn, ngày xuân phân Mặt Trời chiếu vuông góc với xích đạo của Trái Đất, trong dương lịch luôn rơi vào ngày 21 tháng 3, có chăng có năm lệch đi chỉ vài giờ. Trong Âm lịch có 24 tiết khí và có tiết xuân phân này nhưng vì sự chênh lệch chu kì nên mỗi năm xuân phân lại rơi vào ngày khác nhau (Ví dụ: năm Ất Mùi 2015, Xuân phân là ngày mùng 2 tháng 2 Âm lịch, nhưng đến năm sau là Bính Thân thì xuân phân theo Âm lịch lại là 12 tháng 2). Không chỉ xuân phân mà cả 23 tiết khí còn lại trong năm tuy là được qui ước bởi người phương Đông nhưng lại không rơi vào cùng ngày hàng năm theo Âm lịch, chỉ đúng chu kỳ theo Dương lịch.
Chúng ta thấy rằng để dự đoán chu kỳ thời tiết thì Âm lịch không được tiện lợi và chính xác như Dương lịch. Vậy nên trong cuộc sống hiện đại, người phương Đông nói chung và người Việt chúng ta nói riêng cần sử dụng và kết hợp thật hài hòa: Sử dụng Dương lịch không chỉ cho hành chính mà còn cho dự đoán chu kỳ thời tiết, mùa màng, hiện tượng tự nhiên; đồng thời sử dụng Âm lịch đối với những nét văn hóa truyền thống quí giá cần được gìn giữ và phát triển, đặc biệt nhất chính là Tết cổ truyền đầu năm của chúng ta.

Không có tháng mười một?
Dân gian ta thường đếm tháng Âm lịch là "Một, Chạp, Giêng, Hai, ...". Điều đó có nghĩa là tháng Một nằm trước tháng Chạp. Có ý kiến cho rằng đó là do người xưa đọc cho thuận miệng và ngắn gọn còn đúng ra là tháng mười một. Trên các cuốn lịch treo tường ngày nay người biên soạn cũng thường ghi tháng Âm lịch bằng cách đánh số từ 1 đến 12 giống như Dương lịch.
Tuy nhiên, nếu xem xét kỹ cả về logic lẫn lịch sử thì không phải như vậy. Chúng ta có thể để ý rằng tháng thứ mười một trong năm (được gọi là "Một" trong cách nói dân gian nêu trên) là tháng Tý, tức là tháng đầu tiên của một chu kỳ 12 chi. Thực tế trong lịch sử đã có một giai đoạn khá dài người phương Đông lấy tháng này làm tháng đầu tiên của năm. Tháng Tý là tháng khởi đầu, và thông thường ngày Đông chí hàng năm luôn rơi vào tháng này. Sau này qui ước tính điểm khởi đầu của năm thay đổi nên tháng Dần vốn là tháng thứ ba lại được chọn làm tháng đầu tiên của năm. Dù vậy nếu để ý ngay trong cuộc sống hàng ngày, chúng ta thấy nhiều người am hiểu văn hóa phương Đông vẫn xem tuổi, xem ngày trong năm với mốc là ngày Đông chí. Chẳng hạn người 40 tuổi (Âm lịch) vào năm Giáp Ngọ thì thực tế đã được coi là bước sang tuổi 41 vào sau ngày Đông chí của năm Giáp Ngọ (tức ngày 22 tháng 12 năm 2014 vừa qua).
Như vậy, cách đếm "Một, Chạp, Giêng, Hai, ..." là chính xác. Tháng thứ mười một trong năm tính từ Tết nguyên đán gọi là tháng Một, còn tháng đầu tiên trong năm là tháng Giêng chứ không phải tháng Một như đa số hiểu nhầm ngày nay.
Một mùa xuân mới vừa tới, nhìn lại đôi nét về lịch cổ truyền của dân tộc, chúng ta không chỉ hiểu hơn về ý nghĩa khoa học của cuốn lịch sử dụng mỗi ngày mà thông qua đó còn hiểu một cách sâu sắc hơn về tinh hoa văn hóa và vũ trụ quan phương Đông.
Ánh Toàn

Mẹo vặt: Làm thế nào để biết số ngày trong tháng?

theo Blog Sức Khỏe

Hẳn không ít trong chúng ta thắc mắc tháng nào có 30 ngày, tháng nào có 31 ngày. Có một mẹo nhỏ nhưng rất có ích giúp chúng ta tính được số ngày trong tháng: Đó là dùng hai nắm bàn tay.
CÁCH THỰC HIỆN:
Đầu tiên hãy nắm hai bàn tay lại như hình minh họa bên dưới.
Cách tính số ngày trong tháng (30 ngày và 31 ngày)
Đếm từ trái qua, đánh dấu như như minh họa, ta có các khớp u lên (1,3,5,7 và 8,10,12) là các tháng có đủ 31 ngày. Còn các tháng còn lại là phần lõm giữa 2 khớp u (2,4,6 và 9,11) là các tháng có 30 ngày, riêng tháng 2 ra có 28 hoặc 29 ngày. Hy vọng với mẹo vặt này sẽ giúp các bạn đỡ nhức đầu hơn để tính mấy ngày trong tháng  ∎

Tại sao người Nhật lại đón Tết theo Dương lịch?

Người Nhật Bản hiện tổ chức đón năm mới vào ngày 01/01 hằng năm theo dương lịch. Trước năm 1873, người dân xứ mặt trời mọc thường đón năm mới theo âm lịch, như Tết Nguyên đán của Việt Nam; tuy nhiên, kể từ năm 1873 trở về sau, Nhật Bản đã tổ chức Tết theo dương lịch nhằm tiết giảm thời gian cũng như đem lại nhiều ích lợi cho kinh tế.
Lịch sử ngày Tết ở Nhật Bản
Trước đây, Nhật Bản ăn Tết theo Âm lịch nhưng đã chuyển sang ăn Tết theo Dương lịch kể từ năm 1873. Từ năm 1844 đến ngày 31 tháng 12 năm 1872 (ngày 2 tháng 12 năm Minh Trị thứ 5) người Nhật đón Tết theo lịch Thiên Bảo (天保暦, Tempo reki). Ngày 3 tháng 12 năm Minh Trị thứ 5 được sửa đổi thành ngày 1 tháng 1 năm Minh Trị thứ 6 (năm 1873). Việc sửa đổi này đã được chính phủ công bố vào ngày 9 tháng 11 năm Minh Trị thứ 5 (9/12/1872) và được áp dụng vào tháng sau đó.
Nhờ việc thay đổi lịch này mà chính phủ đã tiết kiệm được tiền trả lương tháng 13 cho công chức (vì nếu tính theo lịch cũ thì năm Minh Trị thứ 6 có tháng 6 là tháng nhuận) và giảm bớt ngày nghỉ, tăng sản lượng quốc gia. Thật ra, lý do chính muốn dùng lịch phương Tây là vì giới lãnh đạo Nhật đương thời muốn thoát khỏi vòng ảnh hưởng văn hóa của Trung Quốc, vì nhận thấy rằng văn minh phương Tây đã phát triển hơn châu Á về nhiều mặt. Từ khi nhìn thấy những chiếc Tàu Đen (Black Ships, 黒船, kurofune) của hải quân Mỹ lúc ghé vào cảng Uraga (14/7/1853), Nhật đã muốn sớm tách ra khỏi hàng ngũ các nước châu Á hòng đuổi kịp và đứng vào hàng ngũ các nước văn minh phương Tây.
Ở Nhật Bản, người ta còn sử dụng lịch Trung Hoa (hay Âm lịch) không?
Trước đây, người Nhật sử dụng lịch của người Trung Quốc (Âm Lịch). Đến năm 1873, lịch phương Tây du nhập vào Nhật Bản và hiện nay vẫn được sử dụng phổ biến, chẳng hạn trên tất cả các tờ lịch, cuốn lịch thì đều ghi số năm theo lịch phương Tây.
Tuy nhiên, người Nhật vẫn áp dụng cách đếm năm theo cách của họ, đó là hệ thống đánh số các năm theo niên hiệu và số năm trị vì của Nhật Hoàng đương thời. Cách đánh số này được áp dụng rất thông dụng trong các form mẫu, giấy tờ ở khắp nơi tại Nhật.
Ví dụ, năm 2011 được gọi là năm Heisei 23, có nghĩa là năm thứ 23 trị vì của Nhật Hoàng hiện tại – Nhật Hoàng Akihito. Tuy nhiên, năm đầu tiên trị vì của một Nhật Hoàng không được ký hiệu là 1, tức là sẽ không có Heisei 1, mà được gọi là Gannen 元年 (ví dụ Heisei Gannen).

Quy luật của âm lịch Việt Nam -Hồ Đức Ngọc

Theo link Quy luật của âm lịch Việt Nam -Hồ Đức Ngọc

Thuật toán tính âm lịch

Hồ Ngọc Đức

Bài viết sau giới thiệu cách tính âm lịch Việt Nam và mô tả một số thuật toán dùng để chuyển đổi giữa ngày dương lịch và ngày âm lịch. Các thuật toán mô tả ở đây đã được đơn giản hóa nhiều để bạn đọc tiện theo dõi và dễ dàng sử dụng vào việc lập trình, do đó độ chính xác của chúng thấp hơn độ chính xác của chương trình âm lịch trực tuyến tại http://www.informatik.uni-leipzig.de/~duc/amlich/. (Một phiên bản cũ của bài viết này giới thiệu vài thuật toán hơi khác, có thể khó thực hiện hơn một chút. Bản cũ này có thể xem tại đây.)
[If you cannot read Vietnamese: Old version in English]

Quy luật của âm lịch 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:
  1. Ngày đầu tiên của tháng âm lịch là ngày chứa điểm Sóc
  2. 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
  3. Đông chí luôn rơi vào tháng 11 âm lịch
  4. 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
  5. 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ặcthư 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.
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.

Tài liệu tham khảo