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ã Java
Script 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 get
Sun
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 get
Sun
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 month
Start 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 convert
Lunar2Solar(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 Astronomy
Calendar 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


*

*
Quản lý bởi Vật Phẩm Phong Thủy. Một thành viên của Blog Phong Thủy. Tổng Đài Bán Hàng 19006883. Designed by Thiết Kế Website Đẹp