#calendar #chinese #lunar #solar #leap #localization

no-std chinese-lunisolar-calendar

The traditional Chinese Calendar, known as 農曆 or 陰曆 in Chinese, is based on the moon, and is commonly referred to as the Lunar Calendar

29 releases

0.2.0 Nov 29, 2023
0.1.26 Sep 11, 2023
0.1.25 Mar 15, 2023
0.1.23 Nov 2, 2022
0.1.3 Dec 21, 2018

#73 in Date and time

Download history 25/week @ 2024-02-05 102/week @ 2024-02-12 129/week @ 2024-02-19 37/week @ 2024-02-26 33/week @ 2024-03-04 27/week @ 2024-03-11 31/week @ 2024-03-18 64/week @ 2024-03-25 124/week @ 2024-04-01 136/week @ 2024-04-08 47/week @ 2024-04-15 74/week @ 2024-04-22 42/week @ 2024-04-29 220/week @ 2024-05-06 102/week @ 2024-05-13 75/week @ 2024-05-20

450 downloads per month
Used in omnical

MIT license

2.5K SLoC

Chinese Lunisolar Calendar


The traditional Chinese Calendar, known as 農曆 or 陰曆 in Chinese, is based on the moon, and is commonly referred to as the Lunar Calendar.

Due to the Lunar Calendar's 60-year cycle and the absence of regular rules for the days in each lunar month, as well as the variable number of months in a lunar year, using the Lunar Calendar without referencing other calendars can be challenging. The Lunisolar Calendar is designed to address this issue by combining both the Solar Calendar (Gregorian Calendar) and the Lunar Calendar, ensuring accuracy, predictability, and practicality.

This library allows you to seamlessly convert dates between the Lunisolar Calendar and the Solar Calendar, compute the Ba Zi (八字) weight, and also convert dates to Chinese text strings. Furthermore, it enables parsing of Chinese text strings into dates in both Simplified Chinese and Traditional Chinese.


use chinese_lunisolar_calendar::SolarDate;

let solar_date = SolarDate::from_ymd(2019, 1, 15).unwrap();

assert_eq!("二〇一九年一月十五日", solar_date.to_string());
use chinese_lunisolar_calendar::{LunisolarDate, SolarDate};

let lunisolar_date = LunisolarDate::from_solar_date(SolarDate::from_ymd(2019, 1, 15).unwrap()).unwrap();

assert_eq!("二〇一八 戊戌、狗年 臘月 初十", lunisolar_date.to_string());

assert_eq!("二〇一八 戊戌、狗年 臘月 初十", format!("{lunisolar_date}"));
assert_eq!("二〇一八 戊戌、狗年 腊月 初十", format!("{lunisolar_date:#}"));

use chinese_lunisolar_calendar::EarthlyBranch;
assert_eq!(43, lunisolar_date.get_ba_zi_weight(EarthlyBranch::Ninth));

To calculate the Ba Zi weight, the ba-zi-weight feature must be enabled.

No Std

Disable the default features to compile this crate without std.

version = "*"
default-features = false








~42K SLoC