当前位置:网站首页>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
)
边栏推荐
- Table responsive layout tips
- Have you learned the wrong usage of foreach
- MFC CString 转 char*
- C语言习题---(数组)
- Key points of compilation principle examination in 2021-2022 academic year [overseas Chinese University]
- TiDB数据迁移工具概览
- TiDB跨数据中心部署拓扑
- fatal: unsafe repository is owned by someone else 的解决方法
- 表格响应式布局小技巧
- Thoroughly master prototype__ proto__、 Relationship before constructor (JS prototype, prototype chain)
猜你喜欢

Table responsive layout tips

Base64 coding can be understood this way

buuctf-pwn write-ups (7)

Mavn 搭建 Nexus 私服

【NOI模拟赛】伊莉斯elis(贪心,模拟)

Base64 编码原来还可以这么理解

Reuse and distribution

Have you learned the wrong usage of foreach

Error: NPM warn config global ` --global`, `--local` are deprecated Use `--location=global` instead.

About text selection in web pages and counting the length of selected text
随机推荐
LeetCode 209. 长度最小的子数组
Socket and socket address
Find the maximum inscribed circle of the contour
CodeCraft-22 and Codeforces Round #795 (Div. 2)D,E
It's no exaggeration to say that this is the most user-friendly basic tutorial of pytest I've ever seen
C code audit practice + pre knowledge
Map介绍
TiDB 集群最小部署的拓扑架构
Jenkins Pipeline 应用与实践
Internet Explorer officially retired
kibana 基础操作
记一次面试
TiDB 环境与系统配置检查
Introduction to mathjax (web display of mathematical formulas, vector)
Mavn 搭建 Nexus 私服
【C语言】详解指针的初阶和进阶以及注意点(1)
TiDB数据迁移工具概览
关于网页中的文本选择以及统计选中文本长度
Base64 coding can be understood this way
富文本编辑器添加矢量公式(MathType for TinyMCE ,可视化添加)