Âm lịch Việt Nam là hệ thống lịch thiên văn phức tạp đượ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. Việc chuyển đổi qua lại giữa hai hệ thống lịch này đòi hỏi những thuật toán thiên văn có độ chính xác cao. Bài viết này từ thương hiệu Casio Store sẽ tóm tắt các quy luật cốt lõi và hướng dẫn bạn cách xây dựng thuật toán đổi ngày dương sang ngày âm và ngược lại bằng ngôn ngữ lập trình.
Tìm hiểu quy luật cốt lõi của hệ thống âm lịch Việt Nam
Hệ thống lịch thiên văn của nước ta được thiết lập dựa trên múi giờ GMT+7 tương ứng với kinh tuyến 105° Đông. Ngày đầu tiên của một tháng âm lịch bắt đầu vào ngày chứa điểm Sóc, tức là thời điểm Mặt Trăng nằm chính giữa Trái Đất và Mặt Trời trên cùng một đường thẳng. Chu kỳ dịch chuyển của điểm Sóc này dao động ở mức 29,5 ngày. Một năm bình thường có tổng cộng 12 tháng âm lịch, riêng đối với năm nhuận sẽ xuất hiện thêm một tháng thứ 13.
Tiêu chuẩn quan trọng tiếp theo là ngày Đông chí luôn phải rơi vào tháng 11 âm lịch của năm đó. Để xác định tháng nhuận, các nhà thiên văn dựa vào 12 điểm Trung khí chia đều đường hoàng đạo. Nếu một tháng trong năm nhuận hoàn toàn không chứa bất kỳ Trung khí nào thì tháng đó được quy ước là tháng nhuận. Do sự chênh lệch về múi giờ kinh tuyến, lịch Việt Nam đôi khi sẽ nhanh hoặc chậm hơn lịch Trung Quốc 01 ngày.
Phương pháp chuyển đổi ngày tháng bằng số ngày Julius
Trong các phép toán thiên văn, người ta sử dụng số ngày Julius làm điểm mốc trung gian để tính toán thời gian. Điểm mốc gốc được tính từ ngày 1 tháng 1 năm 4713 trước Công nguyên theo lịch Julius. Ví dụ cụ thể là ngày 1 tháng 1 năm 2000 có giá trị số ngày Julius tương ứng là 2451545. Mọi phép chia xuất hiện trong công thức tính toán đều phải lấy phần nguyên và lược bỏ phần dư.
Để thực hiện việc lập trình, bạn cần thiết lập hai hàm cơ bản gồm mã hóa ngày dương lịch sang số Julius và giải mã ngược lại. Khi áp dụng các ngôn ngữ như JavaScript vốn không tự động bỏ phần dư, bạn cần bổ sung hàm lấy số nguyên lớn nhất không vượt quá tham số đầu vào. Cơ chế tính toán này giúp đồng bộ hóa toàn bộ mốc thời gian về một dãy số tuyến tính liên tục để chuẩn bị cho các bước tìm điểm Sóc.
<>Xem Thêm Bài Viết:<>- Cách bấm máy tính đạo hàm nhanh chóng và chính xác nhất
- Cách tính điểm tín chỉ đại học chuẩn quy định
- Cách tính chu kỳ kinh nguyệt chuẩn xác nhất
- Cách tính cự li vận chuyển hàng hóa trung bình chính xác
- Phương thức tuyển sinh Đại học Kinh tế TPHCM năm 2026
Thuật toán xác định ngày Sóc và vị trí tọa độ Mặt Trời
Bước tiếp theo trong quy trình lập trình là xác định thời điểm hội diện thông qua số thế kỷ Thiên văn tính từ năm 1900. Công thức lượng giác phức tạp dưới đây hỗ trợ tính toán chính xác ngày bắt đầu của một tháng âm lịch bất kỳ.
function getNewMoonDay(k, timeZone) {
var T, T2, T3, dr, Jd1, M, Mpr, F, C1, deltat, JdNew;
T = k/1236.85;
T2 = T * T; T3 = T2 * T; dr = Math.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);
M = 359.2242 + 29.10535608*k - 0.0000333*T2 - 0.00000347*T3;
Mpr = 306.0253 + 385.81691806*k + 0.0107306*T2 + 0.00001236*T3;
F = 21.2964 + 390.67050646*k - 0.0016528*T2 - 0.00000239*T3;
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) - 0.0004*Math.sin(dr*3*Mpr);
C1 = C1 + 0.0104*Math.sin(dr*2*F) - 0.0051*Math.sin(dr*(M+Mpr)) - 0.0074*Math.sin(dr*(M-Mpr));
JdNew = Jd1 + C1 - (0.001 + 0.000839*T + 0.0002261*T2);
return Math.floor(JdNew + 0.5 + timeZone/24);
}
Song song với điểm Sóc, bạn phải xác định kinh độ Mặt Trời để biết tháng đó chứa Trung khí nào. Đường hoàng đạo được chia thành 12 cung ký hiệu từ 0 đến 11. Hàm tính kinh độ sẽ trả về chỉ số cung tại thời điểm nửa đêm của ngày cần tra cứu. Nếu kết quả kinh độ Mặt Trời ở ngày đầu tháng này và ngày đầu tháng kế tiếp trùng nhau, điều đó khẳng định tháng ở giữa hoàn toàn không có Trung khí.
Cách tìm tháng 11 âm lịch và định vị vị trí tháng nhuận
Do ngày Đông chí bắt buộc nằm trong tháng 11 âm lịch, thuật toán luôn phải quét điểm Sóc xuất hiện trước ngày 31 tháng 12 của năm dương lịch. Hệ thống thực hiện tính số ngày Julius của mốc này rồi quy đổi ngược về số tháng âm lịch tiêu chuẩn. Nếu kinh độ Mặt Trời tại điểm Sóc tìm được lớn hơn hoặc bằng cung số 9, chương trình tự động lùi lại 01 tháng để tìm đúng tháng 11.
Khi khoảng cách giữa hai tháng 11 liên tiếp vượt quá 365 ngày, thuật toán sẽ kích hoạt vòng lặp kiểm tra tháng nhuận. Chương trình tiến hành so sánh kinh độ Mặt Trời của từng tháng liên tiếp nhau. Vị trí có hai tháng liền kề sở hữu cùng một giá trị kinh độ chính là tháng nhuận cần tìm. Tên của tháng nhuận được lấy theo tên của tháng chính thức ngay trước nó kèm theo hậu tố đặc biệt.
Hướng dẫn tính Can Chi và thứ trong tuần tự động
Phép tính thứ trong tuần được thực hiện đơn giản bằng cách lấy số ngày Julius chia cho số 7 để tìm số dư tương ứng. Chu kỳ Can Chi của năm được xác định dựa trên số dư của các phép chia cho 10 và 12 sau khi đã cộng thêm các hằng số lịch sử. Cụ thể đối với việc tìm Can của năm, ta lấy tổng số năm cộng thêm 6 rồi chia lấy dư cho 10 với quy ước số 0 là Giáp, số 1 là Ất.
Đối với hệ thống ngày, sự lặp lại của Can Chi tuân theo một chu kỳ cố định gồm 60 ngày liên tục. Chúng ta lấy số ngày Julius cộng thêm 9 rồi chia lấy dư cho 10 để xác định Thiên Can, và cộng thêm 1 rồi chia lấy dư cho 12 để tìm Địa Chi. Quy luật này giúp phần mềm hiển thị đầy đủ thông tin ngày hoàng đạo phục vụ nhu cầu tra cứu của người dùng.
Câu hỏi thường gặp về thuật toán tính âm lịch
Tại sao lịch âm Việt Nam và lịch âm Trung Quốc đôi khi lệch nhau 01 ngày?
Sự khác biệt này xuất phát từ việc áp dụng múi giờ kinh tuyến khác nhau khi tính điểm Sóc. Việt Nam tính theo múi giờ GMT+7 trong khi Trung Quốc tính theo múi giờ GMT+8, dẫn đến thời điểm hội diện có thể rơi vào hai ngày dương lịch khác nhau.
Làm thế nào để thuật toán nhận biết một năm âm lịch có tháng nhuận?
Thuật toán sẽ đo đạc số ngày giữa hai điểm Sóc của tháng 11 âm lịch thuộc hai năm liên tiếp. Nếu khoảng cách thời gian này lớn hơn 365 ngày, hệ thống sẽ xác định năm đó có 13 tháng âm lịch và chứa tháng nhuận.
Hàm lấy số nguyên trong thuật toán có lưu ý gì đặc biệt không?
Khi lập trình trên các ngôn ngữ không tự động làm tròn dưới đối với số âm, lập trình viên bắt buộc phải tự định nghĩa một hàm riêng biệt để lấy giá trị nguyên lớn nhất không vượt quá tham số, đảm bảo kết quả phép tính thiên văn không bị sai lệch.
Để cập nhật thêm các tin tức công nghệ hữu ích và thủ thuật máy tính mới nhất, hãy tiếp tục theo dõi các bài viết chia sẻ kiến thức từ Casio Store.
