All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.hutool.core.date.chinese.GanZhi Maven / Gradle / Ivy

Go to download

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

There is a newer version: 5.8.34
Show newest version
package cn.hutool.core.date.chinese;

import java.time.LocalDate;

/**
 * 天干地支类
 * 天干地支,简称为干支
 *
 * @author looly
 * @since 5.4.1
 */
public class GanZhi {

	/**
	 * 十天干:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊(wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)
	 * 十二地支:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、亥(hài)
	 * 十二地支对应十二生肖:子-鼠,丑-牛,寅-虎,卯-兔,辰-龙,巳-蛇, 午-马,未-羊,申-猴,酉-鸡,戌-狗,亥-猪
	 *
	 * @see 天干地支:简称,干支
	 */
	private static final String[] GAN = new String[]{"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};
	private static final String[] ZHI = new String[]{"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};

	/**
	 * 传入 月日的offset 传回干支, 0=甲子
	 *
	 * @param num 月日的offset
	 * @return 干支
	 */
	public static String cyclicalm(int num) {
		return (GAN[num % 10] + ZHI[num % 12]);
	}

	/**
	 * 传入年传回干支
	 *
	 * @param year 农历年
	 * @return 干支
	 * @since 5.4.7
	 */
	public static String getGanzhiOfYear(int year) {
		// 1864年(1900 - 36)是甲子年,用于计算基准的干支年
		return cyclicalm(year - LunarInfo.BASE_YEAR + 36);
	}

	/**
	 * 获取干支月
	 *
	 * @param year  公历年
	 * @param month 公历月,从1开始
	 * @param day   公历日
	 * @return 干支月
	 * @since 5.4.7
	 */
	public static String getGanzhiOfMonth(int year, int month, int day) {
		//返回当月「节」为几日开始
		int firstNode = SolarTerms.getTerm(year, (month * 2 - 1));
		// 依据12节气修正干支月
		int monthOffset = (year - LunarInfo.BASE_YEAR) * 12 + month + 11;
		if (day >= firstNode) {
			monthOffset++;
		}
		return cyclicalm(monthOffset);
	}

	/**
	 * 获取干支日
	 *
	 * @param year  公历年
	 * @param month 公历月,从1开始
	 * @param day   公历日
	 * @return 干支
	 * @since 5.4.7
	 */
	public static String getGanzhiOfDay(int year, int month, int day) {
		// 与1970-01-01相差天数,不包括当天
		final long days = LocalDate.of(year, month, day).toEpochDay() - 1;
		//1899-12-21是农历1899年腊月甲子日  41:相差1900-01-31有41天
		return cyclicalm((int) (days - LunarInfo.BASE_DAY + 41));
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy