SylarLong/lunar-lite

View on GitHub
src/ganzhi.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { lunar2solar, normalizeDateStr } from "./convertor";
import {
  EarthlyBranch,
  HeavenlyStem,
  HeavenlyStemAndEarthlyBranch,
  HeavenlyStemAndEarthlyBranchDate,
  Options,
} from "./types";
import { Solar } from "lunar-typescript";

/**
 * 通过农历获取生辰干支
 *
 * @param dateStr 农历日期 YYYY-MM-DD
 * @param timeIndex 时辰索引【0~12】
 * @param isLeap 是否为闰月
 * @returns HeavenlyStemAndEarthlyBranchResult
 */
export const getHeavenlyStemAndEarthlyBranchByLunarDate = (
  dateStr: string,
  timeIndex: number,
  isLeap?: boolean,
  options: Options = { year: "normal" },
): HeavenlyStemAndEarthlyBranchDate => {
  const solarDate = lunar2solar(dateStr, isLeap);

  return getHeavenlyStemAndEarthlyBranchBySolarDate(
    solarDate.toString(),
    timeIndex,
    options,
  );
};

/**
 * 将阳历转化为干支纪年
 *
 * @param dateStr 公历日期 YYYY-MM-DD
 * @param timeIndex 时辰索引【0~12】
 * @returns HeavenlyStemAndEarthlyBranchResult
 */
export const getHeavenlyStemAndEarthlyBranchBySolarDate = (
  dateStr: string | Date,
  timeIndex: number,
  options: Options = { year: "exact" },
): HeavenlyStemAndEarthlyBranchDate => {
  const [year, month, date] = normalizeDateStr(dateStr);
  const solar = Solar.fromYmdHms(
    year,
    month,
    date,
    Math.max(timeIndex * 2 - 1, 0),
    30,
    0,
  );
  const lunar = solar.getLunar();

  const yearlyGan =
    options?.year === "normal"
      ? lunar.getYearGan()
      : lunar.getYearGanByLiChun();
  const yearlyZhi =
    options?.year === "normal"
      ? lunar.getYearZhi()
      : lunar.getYearZhiByLiChun();

  const yearly: HeavenlyStemAndEarthlyBranch = [
    yearlyGan as HeavenlyStem,
    yearlyZhi as EarthlyBranch,
  ];
  const monthly: HeavenlyStemAndEarthlyBranch = [
    lunar.getMonthGanExact() as HeavenlyStem,
    lunar.getMonthZhiExact() as EarthlyBranch,
  ];
  const daily: HeavenlyStemAndEarthlyBranch = [
    lunar.getDayGanExact() as HeavenlyStem,
    lunar.getDayZhiExact() as EarthlyBranch,
  ];
  const hourly: HeavenlyStemAndEarthlyBranch = [
    lunar.getTimeGan() as HeavenlyStem,
    lunar.getTimeZhi() as EarthlyBranch,
  ];

  return {
    yearly,
    monthly,
    daily,
    hourly,
    toString() {
      return `${yearly.join("")} ${monthly.join("")} ${daily.join(
        "",
      )} ${hourly.join("")}`;
    },
  };
};