当前位置:网站首页>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语言中的算术运算及相关练习题
- MFC 定时器使用
- Leetcode - Search 2D matrix
- Niuke Practice 101
- Fundamentals of software testing
- Advanced C language (learn malloc & calloc & realloc & free in simple dynamic memory management)
- Slashgear shares 2021 life changing technology products, which are somewhat unexpected
- Jenkins Pipeline 应用与实践
- C语言实现N皇后问题
猜你喜欢
fatal: unsafe repository is owned by someone else 的解决方法
Add vector formula in rich text editor (MathType for TinyMCE, visual addition)
It's no exaggeration to say that this is the most user-friendly basic tutorial of pytest I've ever seen
实用调试技巧
Kityformula editor configure font size and spacing
Large top heap, small top heap and heap sequencing
geoserver离线地图服务搭建和图层发布
表格响应式布局小技巧
Reuse and distribution
Obsidian installs third-party plug-ins - unable to load plug-ins
随机推荐
编译原理课程实践——实现一个初等函数运算语言的解释器或编译器
华为面试题: 没有回文串
学习使用php将时间戳转换为大写日期的方法代码示例
Kityformula editor configure font size and spacing
用户隐私协议有些汉字编码不规范导致网页显示乱码,需要统一找出来处理一下
Why can't browsers read JSX?
蜻蜓低代码安全工具平台开发之路
报错:npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
如何用 Sysbench 测试 TiDB
【NOI模拟赛】刮痧(动态规划)
Btrace- (bytecode) dynamic tracking tool
Simple verification code generator for 51 single chip microcomputer experiment
Base64 编码原来还可以这么理解
Sharp tool SPL for post SQL calculation
TiDB 软件和硬件环境建议配置
LeetCode 2310. The number of digits is the sum of integers of K
. Net core logging system
Niuke Practice 101
原则、语言、编译、解释
Wechat applet uses towxml to display formula