当前位置:网站首页>Learn the method code of using PHP to realize the conversion of Gregorian calendar and lunar calendar
Learn the method code of using PHP to realize the conversion of Gregorian calendar and lunar calendar
2022-07-02 15:07:00 【Lingering memory of Yu Fei】
Learn to use php The method code to realize the conversion of the Gregorian calendar and the lunar calendar
Encapsulate calendar conversion class
Class file :lunar.class.php
<?php
class Lunar
{
var $MIN_YEAR = 1891;
var $MAX_YEAR = 2100;
var $lunarInfo = array(
array(0, 2, 9, 21936), array(6, 1, 30, 9656), array(0, 2, 17, 9584), array(0, 2, 6, 21168),
array(5, 1, 26, 43344), array(0, 2, 13, 59728), array(0, 2, 2, 27296), array(3, 1, 22, 44368),
array(0, 2, 10, 43856), array(8, 1, 30, 19304), array(0, 2, 19, 19168), array(0, 2, 8, 42352),
array(5, 1, 29, 21096), array(0, 2, 16, 53856), array(0, 2, 4, 55632), array(4, 1, 25, 27304),
array(0, 2, 13, 22176), array(0, 2, 2, 39632), array(2, 1, 22, 19176), array(0, 2, 10, 19168),
array(6, 1, 30, 42200), array(0, 2, 18, 42192), array(0, 2, 6, 53840), array(5, 1, 26, 54568),
array(0, 2, 14, 46400), array(0, 2, 3, 54944), array(2, 1, 23, 38608), array(0, 2, 11, 38320),
array(7, 2, 1, 18872), array(0, 2, 20, 18800), array(0, 2, 8, 42160), array(5, 1, 28, 45656),
array(0, 2, 16, 27216), array(0, 2, 5, 27968), array(4, 1, 24, 44456), array(0, 2, 13, 11104),
array(0, 2, 2, 38256), array(2, 1, 23, 18808), array(0, 2, 10, 18800), array(6, 1, 30, 25776),
array(0, 2, 17, 54432), array(0, 2, 6, 59984), array(5, 1, 26, 27976), array(0, 2, 14, 23248),
array(0, 2, 4, 11104), array(3, 1, 24, 37744), array(0, 2, 11, 37600), array(7, 1, 31, 51560),
array(0, 2, 19, 51536), array(0, 2, 8, 54432), array(6, 1, 27, 55888), array(0, 2, 15, 46416),
array(0, 2, 5, 22176), array(4, 1, 25, 43736), array(0, 2, 13, 9680), array(0, 2, 2, 37584),
array(2, 1, 22, 51544), array(0, 2, 10, 43344), array(7, 1, 29, 46248), array(0, 2, 17, 27808),
array(0, 2, 6, 46416), array(5, 1, 27, 21928), array(0, 2, 14, 19872), array(0, 2, 3, 42416),
array(3, 1, 24, 21176), array(0, 2, 12, 21168), array(8, 1, 31, 43344), array(0, 2, 18, 59728),
array(0, 2, 8, 27296), array(6, 1, 28, 44368), array(0, 2, 15, 43856), array(0, 2, 5, 19296),
array(4, 1, 25, 42352), array(0, 2, 13, 42352), array(0, 2, 2, 21088), array(3, 1, 21, 59696),
array(0, 2, 9, 55632), array(7, 1, 30, 23208), array(0, 2, 17, 22176), array(0, 2, 6, 38608),
array(5, 1, 27, 19176), array(0, 2, 15, 19152), array(0, 2, 3, 42192), array(4, 1, 23, 53864),
array(0, 2, 11, 53840), array(8, 1, 31, 54568), array(0, 2, 18, 46400), array(0, 2, 7, 46752),
array(6, 1, 28, 38608), array(0, 2, 16, 38320), array(0, 2, 5, 18864), array(4, 1, 25, 42168),
array(0, 2, 13, 42160), array(10, 2, 2, 45656), array(0, 2, 20, 27216), array(0, 2, 9, 27968),
array(6, 1, 29, 44448), array(0, 2, 17, 43872), array(0, 2, 6, 38256), array(5, 1, 27, 18808),
array(0, 2, 15, 18800), array(0, 2, 4, 25776), array(3, 1, 23, 27216), array(0, 2, 10, 59984),
array(8, 1, 31, 27432), array(0, 2, 19, 23232), array(0, 2, 7, 43872), array(5, 1, 28, 37736),
array(0, 2, 16, 37600), array(0, 2, 5, 51552), array(4, 1, 24, 54440), array(0, 2, 12, 54432),
array(0, 2, 1, 55888), array(2, 1, 22, 23208), array(0, 2, 9, 22176), array(7, 1, 29, 43736),
array(0, 2, 18, 9680), array(0, 2, 7, 37584), array(5, 1, 26, 51544), array(0, 2, 14, 43344),
array(0, 2, 3, 46240), array(4, 1, 23, 46416), array(0, 2, 10, 44368), array(9, 1, 31, 21928),
array(0, 2, 19, 19360), array(0, 2, 8, 42416), array(6, 1, 28, 21176), array(0, 2, 16, 21168),
array(0, 2, 5, 43312), array(4, 1, 25, 29864), array(0, 2, 12, 27296), array(0, 2, 1, 44368),
array(2, 1, 22, 19880), array(0, 2, 10, 19296), array(6, 1, 29, 42352), array(0, 2, 17, 42208),
array(0, 2, 6, 53856), array(5, 1, 26, 59696), array(0, 2, 13, 54576), array(0, 2, 3, 23200),
array(3, 1, 23, 27472), array(0, 2, 11, 38608), array(11, 1, 31, 19176), array(0, 2, 19, 19152),
array(0, 2, 8, 42192), array(6, 1, 28, 53848), array(0, 2, 15, 53840), array(0, 2, 4, 54560),
array(5, 1, 24, 55968), array(0, 2, 12, 46496), array(0, 2, 1, 22224), array(2, 1, 22, 19160),
array(0, 2, 10, 18864), array(7, 1, 30, 42168), array(0, 2, 17, 42160), array(0, 2, 6, 43600),
array(5, 1, 26, 46376), array(0, 2, 14, 27936), array(0, 2, 2, 44448), array(3, 1, 23, 21936),
array(0, 2, 11, 37744), array(8, 2, 1, 18808), array(0, 2, 19, 18800), array(0, 2, 8, 25776),
array(6, 1, 28, 27216), array(0, 2, 15, 59984), array(0, 2, 4, 27424), array(4, 1, 24, 43872),
array(0, 2, 12, 43744), array(0, 2, 2, 37600), array(3, 1, 21, 51568), array(0, 2, 9, 51552),
array(7, 1, 29, 54440), array(0, 2, 17, 54432), array(0, 2, 5, 55888), array(5, 1, 26, 23208),
array(0, 2, 14, 22176), array(0, 2, 3, 42704), array(4, 1, 23, 21224), array(0, 2, 11, 21200),
array(8, 1, 31, 43352), array(0, 2, 19, 43344), array(0, 2, 7, 46240), array(6, 1, 27, 46416),
array(0, 2, 15, 44368), array(0, 2, 5, 21920), array(4, 1, 24, 42448), array(0, 2, 12, 42416),
array(0, 2, 2, 21168), array(3, 1, 22, 43320), array(0, 2, 9, 26928), array(7, 1, 29, 29336),
array(0, 2, 17, 27296), array(0, 2, 6, 44368), array(5, 1, 26, 19880), array(0, 2, 14, 19296),
array(0, 2, 3, 42352), array(4, 1, 24, 21104), array(0, 2, 10, 53856), array(8, 1, 30, 59696),
array(0, 2, 18, 54560), array(0, 2, 7, 55968), array(6, 1, 27, 27472), array(0, 2, 15, 22224),
array(0, 2, 5, 19168), array(4, 1, 25, 42216), array(0, 2, 12, 42192), array(0, 2, 1, 53584),
array(2, 1, 21, 55592), array(0, 2, 9, 54560)
);
/** * Convert the Gregorian calendar to the lunar calendar * @param year Gregorian calendar - year * @param month Gregorian calendar - month * @param date Gregorian calendar - Japan */
function convertSolarToLunar($year, $month, $date)
{
//debugger;
$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
if ($year == $this->MIN_YEAR && $month <= 2 && $date <= 9) {
return array(1891, ' In the first month ', ' The new moon ', ' Xin Mao ', 1, 1, ' rabbit ');
}
return $this->getLunarByBetween($year, $this->getDaysBetweenSolar($year, $month, $date, $yearData[1], $yearData[2]));
}
function convertSolarMonthToLunar($year, $month)
{
$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
if ($year == $this->MIN_YEAR && $month <= 2 && $date <= 9) {
return array(1891, ' In the first month ', ' The new moon ', ' Xin Mao ', 1, 1, ' rabbit ');
}
$month_days_ary = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$dd = $month_days_ary[$month];
if ($this->isLeapYear($year) && $month == 2) $dd++;
$lunar_ary = array();
for ($i = 1; $i < $dd; $i++) {
$array = $this->getLunarByBetween($year, $this->getDaysBetweenSolar($year, $month, $i, $yearData[1], $yearData[2]));
$array[] = $year . '-' . $month . '-' . $i;
$lunar_ary[$i] = $array;
}
return $lunar_ary;
}
/** * Convert the lunar calendar to the Gregorian calendar * @param year Lunar calendar - year * @param month Lunar calendar - month , Leap month processing : For example, if it's leap may , Then the second may will be June , Equivalent to the lunar calendar has 13 Months , Only sometimes 13 The number of days in a month is 0 * @param date Lunar calendar - Japan */
function convertLunarToSolar($year, $month, $date)
{
$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
$between = $this->getDaysBetweenLunar($year, $month, $date);
$res = mktime(0, 0, 0, $yearData[1], $yearData[2], $year);
$res = date('Y-m-d', $res + $between * 24 * 60 * 60);
$day = explode('-', $res);
$year = $day[0];
$month = $day[1];
$day = $day[2];
return array($year, $month, $day);
}
/** * Determine if it's a leap year * @param year */
function isLeapYear($year)
{
return (($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0));
}
/** * Get the annals of the branches and branches * @param year */
function getLunarYearName($year)
{
$sky = array(' Geng ', ' simba ', ' Ren ', ' Dec. ', ' nail ', ' B ', ' C ', ' Ding ', ' E ', ' Oneself ');
$earth = array(' Shen ', ' Unitary ', ' Xu ', ' Hai ', ' Son ', ' ugly ', ' Yin ', ' Mao ', ' Chen" ', ' Already ', ' Noon ', ' not ');
$year = $year . '';
return $sky[$year{
3}] . $earth[$year % 12];
}
/** * Get the zodiac according to the lunar year * @param year lunar year */
function getYearZodiac($year)
{
$zodiac = array(' Monkey ', ' chicken ', ' Dog ', ' The pig ', ' rat ', ' cattle ', ' The tiger ', ' rabbit ', ' dragon ', ' The snake ', ' Horse ', ' sheep ');
return $zodiac[$year % 12];
}
/** * Get the number of days in the Gregorian month * @param year The solar calendar - year * @param month The solar calendar - month */
function getSolarMonthDays($year, $month)
{
$monthHash = array('1' => 31, '2' => $this->isLeapYear($year) ? 29 : 28, '3' => 31, '4' => 30, '5' => 31, '6' => 30, '7' => 31, '8' => 31, '9' => 30, '10' => 31, '11' => 30, '12' => 31);
return $monthHash["$month"];
}
/** * Get the number of days in the lunar month * @param year Lunar calendar - year * @param month Lunar calendar - month , From January on */
function getLunarMonthDays($year, $month)
{
$monthData = $this->getLunarMonths($year);
return $monthData[$month - 1];
}
/** * Get the array of days of each month in the lunar calendar * @param year */
function getLunarMonths($year)
{
$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
$leapMonth = $yearData[0];
$bit = decbin($yearData[3]);
for ($i = 0; $i < strlen($bit); $i++) {
$bitArray[$i] = substr($bit, $i, 1);
}
for ($k = 0, $klen = 16 - count($bitArray); $k < $klen; $k++) {
array_unshift($bitArray, '0');
}
$bitArray = array_slice($bitArray, 0, ($leapMonth == 0 ? 12 : 13));
for ($i = 0; $i < count($bitArray); $i++) {
$bitArray[$i] = $bitArray[$i] + 29;
}
return $bitArray;
}
/** * Get the number of days per year in the lunar calendar * @param year Lunar year */
function getLunarYearDays($year)
{
$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
$monthArray = $this->getLunarYearMonths($year);
$len = count($monthArray);
return ($monthArray[$len - 1] == 0 ? $monthArray[$len - 2] : $monthArray[$len - 1]);
}
function getLunarYearMonths($year)
{
//debugger;
$monthData = $this->getLunarMonths($year);
$res = array();
$temp = 0;
$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
$len = ($yearData[0] == 0 ? 12 : 13);
for ($i = 0; $i < $len; $i++) {
$temp = 0;
for ($j = 0; $j <= $i; $j++) {
$temp += $monthData[$j];
}
array_push($res, $temp);
}
return $res;
}
/** * Get leap month * @param year Lunar year */
function getLeapMonth($year)
{
$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
return $yearData[0];
}
/** * Calculate the number of days between the lunar date and the first day of the first month * @param year http://www.codetc.com/ * @param month * @param date */
function getDaysBetweenLunar($year, $month, $date)
{
$yearMonth = $this->getLunarMonths($year);
$res = 0;
for ($i = 1; $i < $month; $i++) {
$res += $yearMonth[$i - 1];
}
$res += $date - 1;
return $res;
}
/** * Calculation 2 Number of days between Gregorian calendar dates * @param year solar year * @param cmonth * @param cdate * @param dmonth The month of the Gregorian calendar corresponding to the first month of the lunar calendar * @param ddate The number of days in the Gregorian calendar corresponding to the first day of the lunar calendar */
function getDaysBetweenSolar($year, $cmonth, $cdate, $dmonth, $ddate)
{
$a = mktime(0, 0, 0, $cmonth, $cdate, $year);
$b = mktime(0, 0, 0, $dmonth, $ddate, $year);
return ceil(($a - $b) / 24 / 3600);
}
/** * Calculate the lunar calendar date according to the number of days from the first day of the first month * @param year solar year * @param between Days */
function getLunarByBetween($year, $between)
{
//debugger;
$lunarArray = array();
$yearMonth = array();
$t = 0;
$e = 0;
$leapMonth = 0;
$m = '';
if ($between == 0) {
array_push($lunarArray, $year, ' In the first month ', ' The new moon ');
$t = 1;
$e = 1;
} else {
$year = $between > 0 ? $year : ($year - 1);
$yearMonth = $this->getLunarYearMonths($year);
$leapMonth = $this->getLeapMonth($year);
$between = $between > 0 ? $between : ($this->getLunarYearDays($year) + $between);
for ($i = 0; $i < 13; $i++) {
if ($between == $yearMonth[$i]) {
$t = $i + 2;
$e = 1;
break;
} else if ($between < $yearMonth[$i]) {
$t = $i + 1;
$e = $between - (empty($yearMonth[$i - 1]) ? 0 : $yearMonth[$i - 1]) + 1;
break;
}
}
$m = ($leapMonth != 0 && $t == $leapMonth + 1) ? (' Leap ' . $this->getCapitalNum($t - 1, true)) : $this->getCapitalNum(($leapMonth != 0 && $leapMonth + 1 < $t ? ($t - 1) : $t), true);
array_push($lunarArray, $year, $m, $this->getCapitalNum($e, false));
}
array_push($lunarArray, $this->getLunarYearName($year));// Heaven and earth
array_push($lunarArray, $t, $e);
array_push($lunarArray, $this->getYearZodiac($year));// 12 the Chinese zodiac
array_push($lunarArray, $leapMonth);// Leap month
return $lunarArray;
}
/** * The name of the lunar calendar for getting numbers * @param num Numbers * @param isMonth Is it the number of months */
function getCapitalNum($num, $isMonth)
{
$isMonth = $isMonth || false;
$dateHash = array('0' => '', '1' => ' One ', '2' => ' Two ', '3' => ' 3、 ... and ', '4' => ' Four ', '5' => ' 5、 ... and ', '6' => ' 6、 ... and ', '7' => ' 7、 ... and ', '8' => ' 8、 ... and ', '9' => ' Nine ', '10' => ' Ten ');
$monthHash = array('0' => '', '1' => ' In the first month ', '2' => ' February ', '3' => ' March ', '4' => ' April ', '5' => ' May ', '6' => ' June ', '7' => ' July ', '8' => ' August ', '9' => ' September ', '10' => ' October ', '11' => ' Winter moon ', '12' => ' December ');
$res = '';
if ($isMonth) {
$res = $monthHash[$num];
} else {
if ($num <= 10) {
$res = ' first ' . $dateHash[$num];
} else if ($num > 10 && $num < 20) {
$res = ' Ten ' . $dateHash[$num - 10];
} else if ($num == 20) {
$res = " twenty ";
} else if ($num > 20 && $num < 30) {
$res = " Twenty " . $dateHash[$num - 20];
} else if ($num == 30) {
$res = " thirty ";
}
}
return $res;
}
}
?>
Reference classes
New file lunardate.php
<?php
header("Content-Type:text/html;charset=utf-8");
require "lunar.class.php";
echo ' Current date is ' . $day = '2022-06-28';
echo '<br>';
$lunar = new Lunar();
$month = $lunar->convertSolarToLunar(2022, 06, 28);// Convert the Gregorian calendar to the lunar calendar
echo '<pre>';
print_r($month);
?>
Print out
Current date is 2022-06-28
Array
(
[0] => 2022
[1] => May
[2] => thirty
[3] => Ren Yin
[4] => 5
[5] => 30
[6] => The tiger
[7] => 0
)
边栏推荐
- TiDB 集群最小部署的拓扑架构
- C code audit practice + pre knowledge
- fatal: unsafe repository is owned by someone else 的解决方法
- 【无标题】LeetCode 2321. 拼接数组的最大分数
- 传感器数据怎么写入电脑数据库
- MFC console printing, pop-up dialog box
- 报错:npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
- [noi Simulation Competition] scraping (dynamic planning)
- 广州市应急管理局发布7月高温高湿化工安全提醒
- 原则、语言、编译、解释
猜你喜欢

LeetCode 2310. 个位数字为 K 的整数之和

fatal: unsafe repository is owned by someone else 的解决方法

实用调试技巧

Advanced C language (learn malloc & calloc & realloc & free in simple dynamic memory management)

Thoroughly master prototype__ proto__、 Relationship before constructor (JS prototype, prototype chain)

Onnx+tensorrt: write preprocessing operations to onnx and complete TRT deployment

【无标题】LeetCode 2321. 拼接数组的最大分数

MFC 定时器使用

Edit the formula with MathType, and set it to include only mathjax syntax when copying and pasting

YoloV6训练:训练自己数据集遇到的各种问题
随机推荐
传感器数据怎么写入电脑数据库
LeetCode 2320. Count the number of ways to place the house
为什么只会编程的程序员无法成为优秀的开发者?
Solve the problem that El radio group cannot be edited after echo
TiDB数据迁移工具概览
HUSTPC2022
Bit by bit of OpenCV calling USB camera
Sharp tool SPL for post SQL calculation
[untitled] leetcode 2321 Maximum score of concatenated array
LeetCode_滑动窗口_中等_395.至少有 K 个重复字符的最长子串
Why can't programmers who can only program become excellent developers?
The past and present lives of visual page building tools
2021-2022学年编译原理考试重点[华侨大学]
vChain: Enabling Verifiable Boolean Range Queries over Blockchain Databases(sigmod‘2019)
微信小程序使用towxml显示公式
Database connection pool and data source
Key points of compilation principle examination in 2021-2022 academic year [overseas Chinese University]
广州市应急管理局发布7月高温高湿化工安全提醒
C语言中的算术运算及相关练习题
LeetCode 2310. The number of digits is the sum of integers of K