Tham chiếu API
Chi tiết toàn bộ hàm, class và kiểu dữ liệu export từ @lichta/core.
LichTa
Class tĩnh (static) chứa các phương thức chuyển đổi giữa Dương Lịch và Âm Lịch, cùng các hàm tiện ích ngày tháng. Thuật toán Hồ Ngọc Đức, hỗ trợ năm trong khoảng 1800–2199.
LichTa.toLunar(day, month, year, timeZone?)
Chuyển đổi ngày Dương Lịch sang Âm Lịch.
day(number): Ngày dương lịch (1–31).month(number): Tháng dương lịch (1–12).year(number): Năm dương lịch (1800–2199).timeZone(number, tùy chọn, mặc định: 7): Múi giờ GMT.
Trả về: LunarDate.
Throws: RangeError nếu year, month hoặc day ngoài phạm vi hợp lệ.
// -> { day: 1, month: 1, year: 2024, isLeap: false, jd: 2460351,
// dayCanChi: 'Giáp Thìn', monthCanChi: 'Bính Dần', yearCanChi: 'Giáp Thìn' }
LichTa.toSolar(lunarDay, lunarMonth, lunarYear, isLeap?, timeZone?)
Chuyển đổi ngày Âm Lịch sang Dương Lịch.
lunarDay(number): Ngày âm lịch (1–30).lunarMonth(number): Tháng âm lịch (1–12).lunarYear(number): Năm âm lịch (1800–2199).isLeap(boolean, tùy chọn, mặc định: false): Có phải tháng nhuận không — bắt buộc truyền đúng nếu năm đó có tháng nhuận và bạn muốn lấy ngày của tháng nhuận thay vì tháng thường cùng số.timeZone(number, tùy chọn, mặc định: 7): Múi giờ GMT.
Trả về: SolarDate.
Throws: RangeError nếu lunarYear ngoài phạm vi hợp lệ, hoặc nếu isLeap: true nhưng lunarMonth không phải là tháng nhuận thực sự của lunarYear đó.
// -> { day: 10, month: 2, year: 2024 }
// Năm 2020 có nhuận tháng 4 — phân biệt tháng 4 thường và tháng 4 nhuận:
LichTa.toSolar(1, 4, 2020, false); // -> 23/4/2020
LichTa.toSolar(1, 4, 2020, true); // -> 23/5/2020 (tháng nhuận)
LichTa.fromDate(date, timeZone?)
Chuyển đổi trực tiếp từ đối tượng Date của JavaScript sang ngày Âm Lịch LunarDate.
date(Date): Đối tượng JavaScript Date.timeZone(number, tùy chọn, mặc định: 7): Múi giờ GMT.
Trả về: LunarDate.
// -> LunarDate tương ứng với thời điểm hiện tại
LichTa.today(timeZone?)
Lấy ngày Âm Lịch của ngày hôm nay theo múi giờ chỉ định.
timeZone(number, tùy chọn, mặc định: 7): Múi giờ GMT.
Trả về: LunarDate.
LichTa.getLeapMonth(lunarYear, timeZone?)
Tra cứu tháng nhuận âm lịch của một năm. Trả về số tháng nhuận (1–12) hoặc 0 nếu năm đó không có tháng nhuận.
lunarYear(number): Năm âm lịch (1800–2199).timeZone(number, tùy chọn, mặc định: 7): Múi giờ GMT.
Trả về: number — tháng nhuận (1–12), hoặc 0 nếu không có.
LichTa.getLeapMonth(2024); // 0 (năm Giáp Thìn 2024 không có tháng nhuận)
LichTa.getDaysInLunarMonth(lunarMonth, lunarYear, isLeap?, timeZone?)
Lấy số ngày trong một tháng âm lịch cụ thể (tháng thiếu: 29 ngày, tháng đủ: 30 ngày).
lunarMonth(number): Tháng âm lịch (1–12).lunarYear(number): Năm âm lịch (1800–2199).isLeap(boolean, tùy chọn, mặc định: false): Có phải tháng nhuận hay không.timeZone(number, tùy chọn, mặc định: 7): Múi giờ GMT.
Trả về: number — 29 hoặc 30 ngày.
Số học Ngày Âm (Lunar Date Math)
Các hàm tính toán số học trên ngày âm lịch: cộng trừ ngày, tính khoảng cách giữa 2 ngày và so sánh thứ tự thời gian. Tự động xử lý chính xác tháng thiếu (29 ngày), tháng đủ (30 ngày), tháng nhuận và đổi năm.
addDays(lunarDate, days, timeZone?)
Cộng hoặc trừ một số ngày vào một ngày âm lịch.
lunarDate(LunarDate): Ngày âm lịch ban đầu.days(number): Số ngày cần cộng (dương) hoặc trừ (âm).timeZone(number, tùy chọn, mặc định: 7): Múi giờ GMT.
Trả về: LunarDate mới sau khi dịch chuyển số ngày.
const mung2 = addDays(tet, 1); // 02/01/2024 Âm lịch
const tatNien = addDays(tet, -1); // 30/12/2023 Âm lịch (năm Quý Mão)
diffDays(lunarDateA, lunarDateB)
Tính khoảng cách số ngày giữa hai ngày âm lịch (lunarDateA - lunarDateB).
lunarDateA(LunarDate): Ngày âm lịch thứ nhất.lunarDateB(LunarDate): Ngày âm lịch thứ hai.
Trả về: number — khoảng cách tính theo số ngày (dương nếu A sau B, âm nếu A trước B, 0 nếu cùng ngày).
isSameDay(lunarDateA, lunarDateB)
Kiểm tra hai ngày âm lịch có phải là cùng một ngày hay không (dựa trên Julian Day Number).
lunarDateA(LunarDate): Ngày âm lịch thứ nhất.lunarDateB(LunarDate): Ngày âm lịch thứ hai.
Trả về: boolean.
isBefore(lunarDateA, lunarDateB)
Kiểm tra ngày âm lịch A có diễn ra trước ngày âm lịch B hay không.
lunarDateA(LunarDate): Ngày âm lịch thứ nhất.lunarDateB(LunarDate): Ngày âm lịch thứ hai.
Trả về: boolean.
isAfter(lunarDateA, lunarDateB)
Kiểm tra ngày âm lịch A có diễn ra sau ngày âm lịch B hay không.
lunarDateA(LunarDate): Ngày âm lịch thứ nhất.lunarDateB(LunarDate): Ngày âm lịch thứ hai.
Trả về: boolean.
Julian Day Number
2 hàm cấp thấp dùng để quy đổi qua lại giữa ngày Dương lịch và Julian Day Number (JDN) — hệ đếm ngày liên tục dùng trong thiên văn học, là nền tảng cho mọi phép tính của thư viện.
jdFromDate(day, month, year)
Chuyển ngày Dương lịch (Gregorian) sang Julian Day Number.
day(number): Ngày (1–31).month(number): Tháng (1–12).year(number): Năm.
Trả về: number — Julian Day Number.
jdToDate(jd)
Chuyển Julian Day Number ngược lại ngày Dương lịch.
jd(number): Julian Day Number.
Trả về: [day, month, year] — tuple 3 số.
Can Chi & Phong Thủy
Các hàm tính Thiên Can – Địa Chi, Ngũ Hành (Mệnh), và Giờ Hoàng Đạo.
getYearDetails(year)
Lấy Can, Chi và Mệnh (Ngũ Hành) của một năm — áp dụng cho cả năm dương lịch lẫn năm âm lịch (công thức Can Chi năm không phụ thuộc lịch nào).
year(number): Năm cần tính (dương lịch hoặc âm lịch).
Trả về: YearDetails — { can: string, chi: string, menh: string, menhIndex: number, fullString: string }
// -> { can: 'Giáp', chi: 'Thìn', menh: 'Hỏa', menhIndex: 3, fullString: 'Giáp Thìn - Mệnh Hỏa' }
Nhận mọi số năm nguyên (kể cả 0 hoặc âm) — chu kỳ Can Chi 60 năm lặp lại vô hạn, không giới hạn phạm vi 1800–2199 như toLunar/toSolar.
getDayCanChi(jd, locale?)
Tính Can Chi của một ngày, dựa trên Julian Day Number của ngày đó (lấy từ trường jd trong kết quả toLunar()).
jd(number): Julian Day Number của ngày.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị tên Can/Chi.
Trả về: string — ví dụ "Giáp Tý".
getMonthCanChi(lunarMonth, lunarYear, locale?)
Tính Can Chi của một tháng âm lịch, theo quy tắc Ngũ Hổ Độn (Can tháng phụ thuộc Can năm).
lunarMonth(number): Tháng âm lịch (1–12).lunarYear(number): Năm âm lịch.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị tên Can/Chi.
Trả về: string — ví dụ "Bính Dần".
getHourCanChi(hour, dayJd, locale?)
Tính Can Chi của một giờ trong ngày (12 canh giờ, mỗi canh 2 tiếng, Tý bắt đầu từ 23h), theo quy tắc Ngũ Thử Độn (Can giờ phụ thuộc Can ngày).
hour(number): Giờ trong ngày (0–23).dayJd(number): Julian Day Number của ngày.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị tên Can/Chi.
Trả về: string — ví dụ "Canh Thìn".
getAuspiciousHours(dayJd, locale?)
Lấy danh sách 6 giờ Hoàng Đạo (giờ tốt) trong ngày, dựa trên Địa Chi của ngày đó.
dayJd(number): Julian Day Number của ngày.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị tên Địa Chi.
Trả về: string[] — mảng 6 tên Địa Chi, ví dụ ['Tý', 'Sửu', 'Mão', 'Ngọ', 'Mùi', 'Dậu'].
getAuspiciousHourIndices(dayJd)
Giống getAuspiciousHours() nhưng trả về index Địa Chi (0–11, 0 = Tý) thay vì tên đã dịch — dùng khi bạn muốn tự map sang UI/locale riêng thay vì nhận chuỗi có sẵn.
dayJd(number): Julian Day Number của ngày.
Trả về: number[] — mảng 6 index Địa Chi, ví dụ [0, 3, 4, 6, 9, 10].
getInauspiciousHours(dayJd, locale?)
Lấy danh sách 6 giờ Hắc Đạo (giờ xấu) trong ngày — phần bù của getAuspiciousHours() trong 12 canh giờ (6 tốt + 6 xấu = đủ 12).
dayJd(number): Julian Day Number của ngày.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị tên Địa Chi.
Trả về: string[] — mảng 6 tên Địa Chi, ví dụ ['Sửu', 'Dần', 'Tỵ', 'Mùi', 'Thân', 'Hợi'].
getInauspiciousHourIndices(dayJd)
Giống getInauspiciousHours() nhưng trả về index Địa Chi thay vì tên.
dayJd(number): Julian Day Number của ngày.
Trả về: number[] — mảng 6 index Địa Chi tăng dần, ví dụ [1, 2, 5, 7, 8, 11].
getAuspiciousDays(jd, timeZone?, locale?)
Lấy danh sách 6 Ngày Hoàng Đạo (ngày tốt) trong tháng theo Tháng Kiến.
jd(number): Julian Day Number của ngày cần tra.timeZone(number, tùy chọn, mặc định: 7): Múi giờ.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị.
Trả về: string[].
getAuspiciousDayIndices(jd, timeZone?)
Giống getAuspiciousDays() nhưng trả về index Địa Chi.
jd(number): Julian Day Number của ngày cần tra.timeZone(number, tùy chọn, mặc định: 7): Múi giờ.
Trả về: number[].
isAuspiciousDay(jd, timeZone?)
Kiểm tra một ngày có phải là Ngày Hoàng Đạo không.
jd(number): Julian Day Number của ngày.timeZone(number, tùy chọn, mặc định: 7): Múi giờ.
Trả về: boolean.
isInauspiciousDay(jd, timeZone?)
Kiểm tra một ngày có phải là Ngày Hắc Đạo không.
jd(number): Julian Day Number của ngày.timeZone(number, tùy chọn, mặc định: 7): Múi giờ.
Trả về: boolean.
Ngũ Hành (Nạp Âm & Tương Sinh Tương Khắc)
Mệnh (Ngũ Hành Nạp Âm) cho Ngày/Tháng/Giờ — dùng chung bảng tra cứu Nạp Âm 60 Hoa Giáp với getYearDetails(). Bảng Nạp Âm không có công thức đóng (closed-form), là bảng tra cứu chuẩn theo quy ước truyền thống (30 nhóm, mỗi nhóm 2 tổ hợp Can Chi liền kề trong chu kỳ 60 dùng chung 1 hành).
getElementName(index, locale?)
Tra tên Ngũ Hành theo index thuần túy, không cần tính toán Can Chi.
index(number): Index Ngũ Hành (0–4: Kim, Mộc, Thủy, Hỏa, Thổ).locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị.
Trả về: string.
getElementName(3, 'en'); // 'Fire'
getDayElementIndex(jd) / getDayElement(jd, locale?)
Tính Mệnh (Ngũ Hành Nạp Âm) của ngày. Chỉ số Can/Chi tính giống hệt getDayCanChi().
jd(number): Julian Day Number của ngày.locale(Locale, tùy chọn, mặc định: 'vi', chỉ áp dụng chogetDayElement)
Trả về: getDayElementIndex → number (0–4); getDayElement → string.
getDayElementIndex(lunar.jd); // 3
getDayElement(lunar.jd); // 'Hỏa' (Giáp Thìn/Ất Tỵ = Phú Đăng Hỏa)
getMonthElementIndex(lunarMonth, lunarYear) / getMonthElement(lunarMonth, lunarYear, locale?)
Tính Mệnh (Ngũ Hành Nạp Âm) của tháng âm lịch. Chỉ số Can/Chi tính giống hệt getMonthCanChi().
lunarMonth(number): Tháng âm lịch (1–12).lunarYear(number): Năm âm lịch.locale(Locale, tùy chọn, mặc định: 'vi', chỉ áp dụng chogetMonthElement)
Trả về: getMonthElementIndex → number (0–4); getMonthElement → string.
getHourElementIndex(hour, dayJd) / getHourElement(hour, dayJd, locale?)
Tính Mệnh (Ngũ Hành Nạp Âm) của giờ. Chỉ số Can/Chi tính giống hệt getHourCanChi().
hour(number): Giờ trong ngày (0–23).dayJd(number): Julian Day Number của ngày.locale(Locale, tùy chọn, mặc định: 'vi', chỉ áp dụng chogetHourElement)
Trả về: getHourElementIndex → number (0–4); getHourElement → string.
getElementRelationIndex(fromIndex, toIndex) / getElementRelation(fromIndex, toIndex, locale?)
Tính quan hệ Tương Sinh — Tương Khắc giữa 2 hành, theo góc nhìn từ fromIndex tới toIndex. Với 5 hành, 2 hành khác nhau bất kỳ luôn rơi vào đúng 1 trong 4 quan hệ — không có trường hợp mơ hồ.
fromIndex(number): Index Ngũ Hành thứ nhất (0–4).toIndex(number): Index Ngũ Hành thứ hai (0–4).locale(Locale, tùy chọn, mặc định: 'vi', chỉ áp dụng chogetElementRelation)
Trả về: getElementRelationIndex → number (0 = sinh, 1 = được sinh, 2 = khắc, 3 = bị khắc, 4 = hòa); getElementRelation → string.
getElementRelation(1, 3); // 'Tương sinh'
getElementRelation(3, 1); // 'Được sinh' (từ góc nhìn của Hỏa: được Mộc sinh)
Tiết Khí (24 Solar Terms)
Tính toán trực tiếp trên kinh độ Mặt Trời (cùng công thức Hồ Ngọc Đức/Meeus dùng cho Điểm Sóc), không suy ra ngày trung bình — chính xác đến từng ngày kể cả gần ranh giới năm. Index 0 = Xuân Phân (kinh độ 0°), tăng dần mỗi 15°; 12 index lẻ (1, 3, 5, ..., 23) là Tiết (Lập Xuân, Kinh Trập, Thanh Minh, ...), 12 index chẵn là Trung Khí (Xuân Phân, Hạ Chí, Đông Chí, ...).
getSolarTermName(index, locale?)
Tra tên Tiết Khí theo index thuần túy.
index(number): Index Tiết Khí (0–23).locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị.
Trả về: string.
getSolarTermName(18, 'en'); // 'Winter Solstice'
getSolarTerm(day, month, year, timeZone?, locale?)
Lấy Tiết Khí đang hiệu lực tại một ngày dương lịch cho trước.
day(number): Ngày dương lịch (1–31).month(number): Tháng dương lịch (1–12).year(number): Năm dương lịch.timeZone(number, tùy chọn, mặc định: 7): Múi giờ GMT.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị.
Trả về: SolarTerm — { index: number, name: string, date: SolarDate, jd: number }
// -> { index: 6, name: 'Hạ Chí', date: { day: 21, month: 6, year: 2024 }, jd: 2460483 }
getSolarTermsInYear(year, timeZone?, locale?)
Liệt kê toàn bộ Tiết Khí bắt đầu trong một năm dương lịch (luôn đúng 24 lần xuất hiện — mỗi năm dương lịch chứa trọn 24 Tiết Khí).
year(number): Năm dương lịch.timeZone(number, tùy chọn, mặc định: 7): Múi giờ GMT.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị.
Trả về: SolarTerm[] — mảng 24 phần tử, theo thứ tự thời gian tăng dần.
getSolarTermsInYear(2024)[0];
// -> { index: 19, name: 'Tiểu Hàn', date: { day: 6, month: 1, year: 2024 }, jd: 2460316 }
Trực (12 Kiến Trừ)
Trực được neo theo Tiết (12 mốc: Lập Xuân, Kinh Trập, ...) — không theo số tháng âm lịch, vì tháng nhuận âm lịch không tương ứng với một Tiết mới (dùng số tháng âm lịch sẽ cho kết quả sai trong các tháng nhuận). Ngày Tiết bắt đầu luôn là "Kiến" (index 0), Trực tăng dần 1 mỗi ngày sau đó và quay lại "Kiến" vào Tiết kế tiếp.
getKienBranchIndex(jd, timeZone?)
Lấy index Địa Chi của Tháng Kiến tại một ngày cụ thể (xác định theo Tiết Khí).
jd(number): Julian Day Number của ngày.timeZone(number, tùy chọn, mặc định: 7): Múi giờ GMT.
Trả về: number (0–11).
getTrucIndex(jd, timeZone?)
Tính index Trực (0–11: Kiến, Trừ, Mãn, Bình, Định, Chấp, Phá, Nguy, Thành, Thu, Khai, Bế) tại một ngày.
jd(number): Julian Day Number của ngày.timeZone(number, tùy chọn, mặc định: 7): Múi giờ GMT.
Trả về: number (0–11).
getTrucName(index, locale?)
Tra tên Trực theo index thuần túy.
index(number): Index Trực (0–11).locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị.
Trả về: string.
getTruc(jd, timeZone?, locale?)
Lấy tên Trực tại một ngày — kết hợp getTrucIndex() + getTrucName().
jd(number): Julian Day Number của ngày.timeZone(number, tùy chọn, mặc định: 7): Múi giờ GMT.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị.
Trả về: string.
getTrucQualityIndex(trucIndex) / getTrucQuality(trucIndex, locale?)
Mức tốt/xấu tổng quát của một Trực. Chỉ phân loại dứt khoát 4/12 Trực có sự đồng thuận rất cao giữa các nguồn: Phá, Nguy = Xấu; Thành, Khai = Tốt. 8 Trực còn lại (Kiến, Trừ, Mãn, Bình, Định, Chấp, Thu, Bế) được xếp "Trung bình" một cách bảo thủ — không phải vì trung tính thật sự, mà vì mức tốt/xấu chi tiết phụ thuộc từng việc cụ thể và có dị bản giữa các nguồn almanac.
trucIndex(number): Index Trực (0–11).locale(Locale, tùy chọn, mặc định: 'vi', chỉ áp dụng chogetTrucQuality)
Trả về: getTrucQualityIndex → number (0 = Xấu, 1 = Trung bình, 2 = Tốt); getTrucQuality → string.
Tuổi Hợp — Xung
Kiểm tra các mối quan hệ Hợp và Xung giữa 2 Địa Chi (con giáp): Tam Hợp, Lục Hợp, Lục Xung, Lục Hại, Tứ Hành Xung. Tất cả nhận vào index Địa Chi (0–11, 0 = Tý), cùng thứ tự với getZodiacAnimal().
getTamHopGroupIndex(branchIndex) / getTamHopGroupMembers(branchIndex) / isTamHop(branchIndexA, branchIndexB)
Tam Hợp: 4 nhóm Địa Chi hợp hóa cục — Thân-Tý-Thìn (Thủy cục), Tỵ-Dậu-Sửu (Kim cục), Dần-Ngọ-Tuất (Hỏa cục), Hợi-Mão-Mùi (Mộc cục).
branchIndex(number): Index Địa Chi (0–11).
Trả về: getTamHopGroupIndex → number (0–3); getTamHopGroupMembers → number[] (3 phần tử); isTamHop → boolean.
getTamHopGroupMembers(0); // [0, 4, 8] — Tý, Thìn, Thân
getLucHopBranchIndex(branchIndex) / isLucHop(branchIndexA, branchIndexB)
Lục Hợp (Nhị Hợp): 6 cặp Địa Chi tương hợp đôi một — Tý-Sửu, Dần-Hợi, Mão-Tuất, Thìn-Dậu, Tỵ-Thân, Ngọ-Mùi.
branchIndex(number): Index Địa Chi (0–11).
Trả về: getLucHopBranchIndex → number (Chi hợp đôi); isLucHop → boolean.
getLucHopBranchIndex(0); // 1 (Sửu)
getXungBranchIndex(branchIndex) / isXung(branchIndexA, branchIndexB)
Lục Xung: 2 Chi đối xứng nhau trong vòng tròn 12 Chi (cách nhau 6 vị trí) — Tý-Ngọ, Sửu-Mùi, Dần-Thân, Mão-Dậu, Thìn-Tuất, Tỵ-Hợi.
branchIndex(number): Index Địa Chi (0–11).
Trả về: getXungBranchIndex → number (Chi đối xung); isXung → boolean.
isXung(0, 6); // true
getHaiBranchIndex(branchIndex) / isHai(branchIndexA, branchIndexB)
Lục Hại: Tý-Mùi, Sửu-Ngọ, Dần-Tỵ, Mão-Thìn, Thân-Hợi, Dậu-Tuất.
branchIndex(number): Index Địa Chi (0–11).
Trả về: getHaiBranchIndex → number (Chi bị hại); isHai → boolean.
isHai(0, 7); // true
getTuHanhXungGroupIndex(branchIndex) / getTuHanhXungGroupMembers(branchIndex) / isTuHanhXung(branchIndexA, branchIndexB)
Tứ Hành Xung: 3 nhóm, mỗi nhóm 4 Chi được xem là xung khắc lẫn nhau — Tý/Mão/Ngọ/Dậu, Dần/Tỵ/Thân/Hợi, Sửu/Thìn/Mùi/Tuất.
branchIndex(number): Index Địa Chi (0–11).
Trả về: getTuHanhXungGroupIndex → number (0–2); getTuHanhXungGroupMembers → number[] (4 phần tử); isTuHanhXung → boolean.
isTuHanhXung(0, 3); // true — Tý và Mão cùng nhóm
getZodiacHarmony(branchIndexA, branchIndexB)
Kiểm tra các quan hệ hòa hợp (Tam Hợp, Lục Hợp) giữa 2 tuổi trong 1 lần gọi.
branchIndexA(number): Index Địa Chi thứ nhất (0–11).branchIndexB(number): Index Địa Chi thứ hai (0–11).
Trả về: ZodiacHarmony — { tamHop: boolean, lucHop: boolean }
// -> { tamHop: true, lucHop: false }
getZodiacConflicts(branchIndexA, branchIndexB)
Kiểm tra gộp cả 3 quan hệ Lục Xung, Lục Hại, Tứ Hành Xung giữa 2 tuổi trong 1 lần gọi.
branchIndexA(number): Index Địa Chi (con giáp) thứ nhất (0–11).branchIndexB(number): Index Địa Chi (con giáp) thứ hai (0–11).
Trả về: ZodiacConflicts — { xung: boolean, hai: boolean, tuHanhXung: boolean }
// -> { xung: true, hai: false, tuHanhXung: true }
getZodiacRelations(branchIndexA, branchIndexB)
Kiểm tra toàn bộ quan hệ Hợp và Xung giữa 2 Địa Chi (kết hợp cả ZodiacConflicts và ZodiacHarmony).
branchIndexA(number): Index Địa Chi thứ nhất (0–11).branchIndexB(number): Index Địa Chi thứ hai (0–11).
Trả về: ZodiacRelations — { xung: boolean, hai: boolean, tuHanhXung: boolean, tamHop: boolean, lucHop: boolean }
// -> { xung: false, hai: false, tuHanhXung: false, tamHop: false, lucHop: true }
Giờ Lý Thuần Phong (Xuất Hành)
Phương pháp chọn giờ xuất hành truyền thống theo Lục Nhâm tiểu độn của Lý Thuần Phong: tuần hoàn 6 cung gồm Đại An (Cát), Lưu Niên (Hung), Tốc Hỷ (Cát), Xích Khẩu (Hung), Tiểu Cát (Cát), Không Vong (Hung). Hỗ trợ đa ngôn ngữ (vi, en, ja, ko).
getLyThuanPhongHour(lunarDay, lunarMonth, hour, locale?)
Lấy thông tin cung giờ xuất hành Lý Thuần Phong tại một giờ cụ thể trong ngày âm lịch.
lunarDay(number): Ngày âm lịch (1–30).lunarMonth(number): Tháng âm lịch (1–12).hour(number): Giờ trong ngày (0–23).locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị tên cung và tên chi.
Trả về: LyThuanPhongHour — { index: number, name: string, isAuspicious: boolean, branchIndex: number, branchName: string }
// -> { index: 4, name: 'Tiểu Cát', isAuspicious: true, branchIndex: 4, branchName: 'Thìn' }
getLyThuanPhongIndex(lunarDay, lunarMonth, hourBranchIndex)
Tính index cung giờ Lý Thuần Phong (0–5: 0=Đại An, 1=Lưu Niên, 2=Tốc Hỷ, 3=Xích Khẩu, 4=Tiểu Cát, 5=Không Vong).
lunarDay(number): Ngày âm lịch (1–30).lunarMonth(number): Tháng âm lịch (1–12).hourBranchIndex(number): Index Địa Chi của giờ (0–11, 0 = Tý).
Trả về: number (0–5).
getAllLyThuanPhongHoursOfDay(lunarDay, lunarMonth, locale?)
Lấy danh sách thông tin xuất hành Lý Thuần Phong cho toàn bộ 12 canh giờ trong ngày âm lịch.
lunarDay(number): Ngày âm lịch (1–30).lunarMonth(number): Tháng âm lịch (1–12).locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị.
Trả về: LyThuanPhongHour[] — mảng 12 phần tử ứng với 12 canh giờ (Tý → Hợi).
// hours[0] = Đại An (giờ Tý), hours[1] = Lưu Niên (giờ Sửu)...
Ngày Kỵ Dân Gian
Hệ thống tra cứu các ngày đại kỵ dân gian truyền thống theo Ngọc Hạp Thông Thư & Lịch Vạn Niên: Tam Nương, Nguyệt Kỵ, Dương Công Kỵ Nhật, Sát Chủ Dương, Sát Chủ Âm, Thọ Tử, Vãng Vong.
getDayTaboos(lunar) / getDayTaboos(lunarDay, lunarMonth, jd)
Kiểm tra toàn bộ các yếu tố ngày kỵ dân gian của một ngày âm lịch trong một lần gọi.
lunar(LunarDate): Đối tượng ngày âm lịch (kết quả từtoLunar()). Hoặc truyền bộ 3 số(lunarDay, lunarMonth, jd).
Trả về: DayTaboos — gồm cờ boolean cho từng loại kỵ, hasTaboo: boolean và mảng tabooNames: string[].
getDayTaboos(lunar);
// -> { isTamNuong: false, isNguyetKy: true, ..., hasTaboo: true, tabooNames: ['Nguyệt Kỵ'] }
isTamNuong(lunarDay)
Kiểm tra ngày âm lịch có phải ngày Tam Nương không (các ngày mùng 3, 7, 13, 18, 22, 27 hàng tháng).
lunarDay(number): Ngày âm lịch (1–30).
Trả về: boolean.
isNguyetKy(lunarDay)
Kiểm tra ngày âm lịch có phải ngày Nguyệt Kỵ không (mùng 5, 14, 23 — "Mùng năm, mười bốn, hai ba...").
lunarDay(number): Ngày âm lịch (1–30).
Trả về: boolean.
isDuongCongKyNhat(lunarDay, lunarMonth)
Kiểm tra ngày có phải 1 trong 13 ngày Dương Công Kỵ Nhật trong năm (ngày rất kỵ khởi công, xuất hành).
lunarDay(number): Ngày âm lịch (1–30).lunarMonth(number): Tháng âm lịch (1–12).
Trả về: boolean.
isSatChuDuong(lunarMonth, dayBranchIndex)
Kiểm tra ngày có phải ngày Sát Chủ Dương theo tháng và Địa Chi của ngày (kỵ cưới hỏi, cất nhà, xuất hành).
lunarMonth(number): Tháng âm lịch (1–12).dayBranchIndex(number): Index Địa Chi của ngày (0–11).
Trả về: boolean.
isSatChuAm(lunarMonth, dayBranchIndex)
Kiểm tra ngày có phải ngày Sát Chủ Âm theo tháng và Địa Chi của ngày (kỵ an táng, tu bổ mồ mả).
lunarMonth(number): Tháng âm lịch (1–12).dayBranchIndex(number): Index Địa Chi của ngày (0–11).
Trả về: boolean.
isThoTu(lunarMonth, dayBranchIndex)
Kiểm tra ngày có phải ngày Thọ Tử theo tháng và Địa Chi của ngày (ngày trăm sự đều kỵ).
lunarMonth(number): Tháng âm lịch (1–12).dayBranchIndex(number): Index Địa Chi của ngày (0–11).
Trả về: boolean.
isVangVong(lunarMonth, dayBranchIndex)
Kiểm tra ngày có phải ngày Vãng Vong (Lục Hao) theo tháng và Địa Chi của ngày (kỵ xuất hành, cầu tài).
lunarMonth(number): Tháng âm lịch (1–12).dayBranchIndex(number): Index Địa Chi của ngày (0–11).
Trả về: boolean.
Thần Sát & Nhị Thập Bát Tú
Các hàm tính 12 Thần Sát (Hoàng Đạo / Hắc Đạo) và Nhị Thập Bát Tú (28 chòm sao) cho ngày và giờ.
getDayThanSat(jd, timeZone?, locale?)
Lấy thông tin Thần Sát (Tên sao, tính chất Hoàng Đạo/Hắc Đạo) của ngày.
jd(number): Julian Day Number của ngày.timeZone(number, tùy chọn, mặc định: 7): Múi giờ.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị.
Trả về: ThanSat — ví dụ: { name: 'Thanh Long', fullName: 'Thanh Long Hoàng Đạo', isAuspicious: true }.
getHourThanSat(hour, dayJd, locale?)
Lấy thông tin Thần Sát của một giờ cụ thể trong ngày.
hour(number): Giờ trong ngày (0–23).dayJd(number): Julian Day Number của ngày.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị.
Trả về: ThanSat.
getNhiThapBatTuIndex(jd)
Lấy index của sao trong Nhị Thập Bát Tú (0-27).
jd(number): Julian Day Number của ngày.
Trả về: number.
getNhiThapBatTu(jd)
Lấy tên của sao trong Nhị Thập Bát Tú (ví dụ: Giác, Cang, Đê...).
jd(number): Julian Day Number của ngày.
Trả về: string.
Hướng Xuất Hành
Tính hướng xuất hành: Hỷ Thần và Tài Thần theo ngày.
getHyThanDirection(jd, locale?)
Lấy hướng Hỷ Thần (đón niềm vui, may mắn) của ngày.
jd(number): Julian Day Number của ngày.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị.
Trả về: string — ví dụ: "Đông Bắc".
getTaiThanDirection(jd, locale?)
Lấy hướng Tài Thần (đón tài lộc, tiền bạc) của ngày.
jd(number): Julian Day Number của ngày.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị.
Trả về: string — ví dụ: "Đông Nam".
getDepartureDirections(jd, locale?)
Lấy thông tin cả hai hướng Hỷ Thần và Tài Thần cùng lúc.
jd(number): Julian Day Number của ngày.locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ hiển thị.
Trả về: DepartureDirections — ví dụ: { hyThan: 'Đông Bắc', taiThan: 'Đông Nam' }.
Format & Hiển thị
Các hàm hỗ trợ hiển thị ngày âm lịch theo cách gọi truyền thống Việt Nam.
formatLunarDate(lunar, pattern, locale?)
Format một LunarDate theo pattern tùy chỉnh, tương tự cú pháp của các thư viện format ngày phổ biến.
lunar(LunarDate): Đối tượng ngày âm lịch (kết quả củatoLunar()).pattern(string): Chuỗi pattern, xem bảng token bên dưới.locale(Locale, tùy chọn, mặc định: 'vi'): Chỉ ảnh hưởng tokenL("Nhuận"/"Leap"/...).
Trả về: string.
| Token | Mô tả | Ví dụ |
|---|---|---|
dd / d | Ngày (2 chữ số / không đệm 0) | 01, 1 |
MM / M | Tháng (2 chữ số / không đệm 0) | 01, 1 |
yyyy / yy | Năm (4 chữ số / 2 chữ số cuối) | 2024, 24 |
CC | Can Chi năm | Giáp Thìn |
MC | Can Chi tháng | Bính Dần |
DC | Can Chi ngày | Giáp Tý |
L | "Nhuận" nếu isLeap, ngược lại chuỗi rỗng | Nhuận |
formatLunarDate(lunar, 'Ngày d tháng M năm CC'); // 'Ngày 1 tháng 1 năm Giáp Thìn'
formatTraditional(lunar)
Format một LunarDate theo cách gọi truyền thống Việt Nam đầy đủ (không cần pattern).
lunar(LunarDate): Đối tượng ngày âm lịch.
Trả về: string — ví dụ "Mùng Một tháng Giêng năm Giáp Thìn".
getMonthName(month)
Lấy tên tháng âm lịch dạng chữ truyền thống.
month(number): Tháng âm lịch (1–12).
Trả về: string — 1 → "Giêng", 12 → "Chạp", các tháng khác → "Hai"..."Mười Một".
Throws: RangeError nếu month ngoài khoảng 1–12.
getDayName(day)
Lấy tên ngày âm lịch theo cách gọi truyền thống: Mùng Một–Mười, Mười Một–Mười Chín, Hai Mươi, Hăm Mốt–Hăm Chín, Ba Mươi.
day(number): Ngày âm lịch (1–30).
Trả về: string — ví dụ: 1 → "Mùng Một", 15 → "Rằm", 30 → "Ba Mươi".
Throws: RangeError nếu day ngoài khoảng 1–30.
parseLunarDate(dateStr, pattern, locale?)
Phân tích cú pháp chuỗi ngày âm lịch theo mẫu định dạng (pattern) thành đối tượng LunarDate hoàn chỉnh.
dateStr(string): Chuỗi ngày âm lịch cần parse (ví dụ"15/08/2024"hoặc"15/02/2023 Nhuận").pattern(string): Chuỗi pattern tương ứng với cấu trúc chuỗi (hỗ trợ các token:yyyy,yy,MM,M,dd,d,L).locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ nhận diện token tháng nhuậnL.
Trả về: LunarDate.
Throws: Error nếu chuỗi không khớp với pattern hoặc ngày âm lịch không hợp lệ.
// -> { day: 15, month: 8, year: 2024, isLeap: false, ... }
const leap = parseLunarDate('15/02/2023 Nhuận', 'dd/MM/yyyy L');
// -> { day: 15, month: 2, year: 2023, isLeap: true, ... }
Lưới lịch tháng
Hàm dựng lưới ngày cho UI lịch tháng — đây cũng là hàm mà component Calendar và DatePicker ở các package binding (@lichta/react/vue/svelte) dùng nội bộ. Hữu ích nếu bạn muốn tự dựng UI lịch riêng thay vì dùng component có sẵn.
getCalendarGrid(month, year, selectedDate?, firstDayOfWeek?)
Dựng lưới 42 ô (6 tuần × 7 ngày) cho 1 tháng dương lịch, gồm cả ngày tràn từ tháng trước/sau để lấp đầy tuần đầu/cuối, mỗi ô kèm ngày âm lịch tương ứng và số tuần ISO-8601.
month(number): Tháng dương lịch (1–12).year(number): Năm dương lịch.selectedDate(Date | null, tùy chọn): Ngày đang chọn, dùng để đánh dấuisSelectedtrên ô tương ứng.firstDayOfWeek(0 | 1, tùy chọn, mặc định: 0): Ngày bắt đầu tuần — 0 = Chủ Nhật, 1 = Thứ Hai.
Trả về: CalendarDayCell[] — mảng 42 phần tử.
// -> [{ solar: Date, lunar: LunarDate, isToday, isSelected, isCurrentMonth, weekNumber }, ...] × 42
getISOWeekNumber(date)
Tính số tuần theo chuẩn ISO-8601: tuần bắt đầu Thứ Hai, tuần 1 của năm là tuần chứa Thứ Năm đầu tiên (tương đương: tuần chứa ngày 4/1).
date(Date): Ngày cần tính số tuần.
Trả về: number.
i18n
Thư viện hỗ trợ 4 ngôn ngữ cho tên Can Chi, Ngũ Hành, con giáp, tên tháng và thứ trong tuần: vi, en, ja, ko.
t(locale)
Lấy trọn bộ dịch cho một locale.
locale(Locale):'vi' | 'en' | 'ja' | 'ko'.
Trả về: object gồm heavenlyStems, earthlyBranches, fiveElements, zodiacAnimals, lunarMonthNames, solarMonthNames, weekDays, leapLabel, yearLabel, monthLabel, destiny (đều là string[] hoặc string).
t('ja').weekDays; // ['日', '月', '火', '水', '木', '金', '土']
t('vi').lunarMonthNames; // ['Giêng', 'Hai', ..., 'Chạp'] — tên tháng ÂM lịch
t('vi').solarMonthNames; // ['Tháng 1', ..., 'Tháng 12'] — tên tháng DƯƠNG lịch
Field monthNames vẫn tồn tại (backward compat) nhưng đã @deprecated — ngữ nghĩa không nhất quán giữa các locale ('vi' trỏ tới tên tháng âm, 'en'/'ja'/'ko' lại trỏ tới tên tháng dương). Luôn dùng lunarMonthNames/solarMonthNames cho code mới.
getZodiacAnimal(branchIndex, locale?)
Lấy tên con giáp theo index Địa Chi và locale.
branchIndex(number): Index Địa Chi (0–11, 0 = Tý).locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ.
Trả về: string.
getZodiacAnimal(4, 'en'); // 'Dragon'
getWeekDayLabels(locale?)
Lấy danh sách các nhãn thứ trong tuần (viết tắt) theo locale.
locale(Locale, tùy chọn, mặc định: 'vi'): Ngôn ngữ.
Trả về: string[].
Kiểu dữ liệu (Types)
Các kiểu dữ liệu chính được export dưới dạng type-only từ @lichta/core.
day: number;
month: number;
year: number;
isLeap: boolean; // tháng này có phải tháng nhuận không
jd: number; // Julian Day Number — dùng cho getDayCanChi/getHourCanChi
dayCanChi?: string;
monthCanChi?: string;
yearCanChi?: string;
}
interface SolarDate {
day: number;
month: number;
year: number;
}
interface YearDetails { // return type của getYearDetails()
can: string;
chi: string;
menh: string;
menhIndex: number;
fullString: string;
}
interface CalendarDayCell { // return type của getCalendarGrid()
solar: Date;
lunar: LunarDate;
isToday: boolean;
isSelected: boolean;
isCurrentMonth: boolean;
weekNumber: number; // số tuần ISO-8601 của hàng chứa ô này
}
interface SolarTerm { // return type của getSolarTerm()/getSolarTermsInYear()
index: number; // 0-23
name: string;
date: SolarDate;
jd: number;
}
interface ZodiacConflicts { // return type của getZodiacConflicts()
xung: boolean;
hai: boolean;
tuHanhXung: boolean;
}
interface ZodiacHarmony { // return type của getZodiacHarmony()
tamHop: boolean;
lucHop: boolean;
}
interface ZodiacRelations extends ZodiacConflicts, ZodiacHarmony {}
interface LyThuanPhongHour { // return type của getLyThuanPhongHour()
index: number; // 0-5
name: string;
isAuspicious: boolean;
branchIndex: number;
branchName: string;
}
interface DayTaboos { // return type của getDayTaboos()
isTamNuong: boolean;
isNguyetKy: boolean;
isDuongCongKyNhat: boolean;
isSatChuDuong: boolean;
isSatChuAm: boolean;
isThoTu: boolean;
isVangVong: boolean;
hasTaboo: boolean;
tabooNames: string[];
}
interface ThanSat { // return type của getDayThanSat() / getHourThanSat()
name: string;
fullName: string;
isAuspicious: boolean;
}
interface DepartureDirections { // return type của getDepartureDirections()
hyThan: string;
taiThan: string;
}
type Locale = 'vi' | 'en' | 'ja' | 'ko';