Cách đổi ngày dương sang ngày âm sang dương, đổi ngày dương sang âm
-
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.)Quy luật của âm lịch Việt Nam
Thuật toán chuyển đổi giữa ngày dương và âm
Script), 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 jd
From
Date(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 function jd
To
Zone 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 time
Zone = 7.0). Các phương pháp sau được giới thiệu với mã Java
Script. Bạn có thể tải thư viện Java
New
Moon
Day(k, time
Zone)var T, T2, T3, dr, Jd1, M, Mpr, F, C1, deltat, Jd
New;T = k/1236.85; // Time in Julian centuries from 1900 January 0.5T2 = 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
New
Moon
Day 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.
Bạn đang xem: Cách đổi ngày dương sang ngày âm
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 getSun
Longitude(jdn, time
Zone)var T, T2, dr, M, L0, DL, L;T = (jdn - 2451545.5 - time
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 get
Sun
Longitude 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 get
Sun
Lunar
Month11(yy, time
Zone)var k, off, nm, sun
Long;off = jd
From
Date(31, 12, yy) - 2415021;k = INT(off / 29.530588853);nm = get
New
Moon
Day(k, time
Zone);sun
Long = get
Sun
Longitude(nm, time
Zone); // sun longitude at local midnightif (sun
Long >= 9) {nm = get
New
Moon
Day(k-1, time
Zone);}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 getSun
Longitude 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 get
Leap
Month
Offset(a11, time
Zone)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 11arc = get
Sun
Longitude(get
New
Moon
Day(k+i, time
Zone), time
Zone);do {last = arc;i++;arc = get
Sun
Longitude(get
New
Moon
Day(k+i, time
Zone), time
Zone);} while (arc != last && i Giả sử hàm get
Leap
Month
Offset 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).
Xem thêm: Cách Đổi Điểm Tích Lũy Mobifone (Kết Nối Dài Lâu) Nhận Tới 350 Phút Gọi Miễn Phí
Đổ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 get
New
Moon
Day 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 month
Start 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 convert
Solar2Lunar(dd, mm, yy, time
Zone)var k, day
Number, month
Start, a11, b11, lunar
Day, lunar
Month, lunar
Year, lunar
Leap;day
Number = jd
From
Date(dd, mm, yy);k = INT((day
Number - 2415021.076998695) / 29.530588853);month
Start = get
New
Moon
Day(k+1, time
Zone);if (month
Start > day
Number) {month
Start = get
New
Moon
Day(k, time
Zone);}a11 = get
Lunar
Month11(yy, time
Zone);b11 = a11;if (a11 >= month
Start) {lunar
Year = yy;a11 = get
Lunar
Month11(yy-1, time
Zone);} else {lunar
Year = yy+1;b11 = get
Lunar
Month11(yy+1, time
Zone);}lunar
Day = day
Number-month
Start+1;diff = INT((month
Start - a11)/29);lunar
Leap = 0;lunar
Month = diff+11;if (b11 - a11 > 365) {leap
Month
Diff = get
Leap
Month
Offset(a11, time
Zone);if (diff >= leap
Month
Diff) {lunar
Month = diff + 10;if (diff == leap
Month
Diff) {lunar
Leap = 1;}}}if (lunar
Month > 12) {lunar
Month = lunar
Month - 12;}if (lunar
Month >= 11 && diff
Đổ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(lunar
Day, lunar
Month, lunar
Year, lunar
Leap, time
Zone)var k, a11, b11, off, leap
Off, leap
Month, month
Start;if (lunar
Month 365) {leap
Off = get
Leap
Month
Offset(a11, time
Zone);leap
Month = leap
Off - 2;if (leap
Month = leap
Off) {off += 1;}}k = INT(0.5 + (a11 - 2415021.076998695) / 29.530588853);month
Start = get
New
Moon
Day(k+off, time
Zone);return jd
To
Date(month
Start+lunar
Day-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
Eric Weisstein"s World of AstronomyCalendar FAQHồ Ngọc Đức, Java
Script lunar calendar - Chương trình âm lịch Việt Nam bằng Java
Script (sử dụng bảng tính sẵn cho thời kỳ 1800-2199)Tính âm lịch dùng các ngôn ngữ khác: Java
Ngày dương lịch là Thứ Bảy 25 - 3 - 2023 là ngày 4 tháng 2 năm 2023 . Theo Can chi : Ngày Nhâm Ngọ Tháng Ất Mão Năm Quý Mão
0:00 | Giờ: Canh Tý |
Kim Quỹ | Hoàng Đạo |
1:00 | Giờ: Tân Sửu |
Kim Đường ( Bảo Quang) | Hoàng Đạo |
3:00 | Giờ: Nhâm Dần |
Bạch Hổ | Hắc Đạo |
5:00 | Giờ:Quý Mão |
Ngọc Đường | Hoàng Đạo |
7:00 | Giờ: Giáp Thìn |
Thiên Lao | Hắc Đạo |
9:00 | Giờ: Ất Tỵ |
Nguyên Vũ | Hắc Đạo |
11:00 | Giờ: Bính Ngọ |
Tư Mệnh | Hoàng Đạo |
13:00 | Giờ: Đinh Mùi |
Câu Trận | Hắc Đạo |
15:00 | Giờ: Mậu Thân |
Thanh Long | Hoàng Đạo |
17:00 | Giờ: Kỷ Dậu |
Minh Đường | Hoàng Đạo |
19:00 | Giờ: Canh Tuất |
Thiên Hình | Hắc Đạo |
21:00 | Giờ: Tân Hợi |
Chu Tước | Hắc Đạo |
23:00 | Giờ: Canh Tý |
Kim Quỹ | Hoàng Đạo |
Ngày Hoàng Đạo | Sao: Kim Quỹ | ||
Giờ Hoàng đạo | Tí Sửu Mão Ngọ Thân Dậu | ||
Giờ Hắc đạo | Dần Thìn Tỵ Mùi Tuất Hợi | ||
Năm | Kim | Bạch | Bạch kim |
Mùa | Mộc | Mùa Xuân | Trọng |
Ngày | Mộc | Dương liễu | Gỗ dương liễu |
Tuổi xung năm | Tân Dậu, Đinh Dậu, Đinh Mão | ||
Tuổi xung ngày | Giáp Tí, Canh Tí, Bính Tuất, Bính Thìn | ||
Tiết khí | Giữa : Xuân phân ( Giữa xuân ) và Thanh minh ( Trời trong sáng ) | ||
Sao | Vị | Vị thổ Trĩ | |
Ngũ hành | Thổ | Chủ trì :Thứ 7 | |
Động vật | Chim Trĩ | Diễn giải | |
Trực | Bình | Tốt với mọi việc | |
Hướng xuất hành | |||
Hỷ thần | Nam | ||
Tài thần | Tây | ||
Cát tinh | Diễn giải | ||
Dân nhật, Thời đức | Tốt mọi việc | ||
Ích Hậu | Tốt mọi việc, nhất là giá thú | ||
Thiên Ân | Tốt mọi việc | ||
Thiên Tài | Tốt cho việc cầu tài lộc, khai trương | ||
Sát tinh | Kỵ | Ghi chú | |
Hà khôi Cẩu Giảo | Kỵ khởi công xây nhà cửa, xấu mọi việc | ||
Hoả tinh | Xấu với lợp nhà, làm bếp | ||
Lục Bất thành | Xấu đối với xây dựng | ||
Thiên Lại | Xấu mọi việc | ||
Tiểu Hao | Xấu về kinh doanh, cầu tài | ||
Trường Đoản Tinh | May áo, nạp tài, giao dịch, lập di chúc,đề cử người |

Xem phong thuỷ
Vật phẩm phong thuỷ
Facebook Fanpage

