PHP实现的汉字拼音转换和公历农历转换类及使用示例_php教程-查字典教程网
PHP实现的汉字拼音转换和公历农历转换类及使用示例
PHP实现的汉字拼音转换和公历农历转换类及使用示例
发布时间:2016-12-29 来源:查字典编辑
摘要:本文整理了PHP汉字拼音转换和公历农历转换两个功能类文件,非常实用。比如我们查找通讯录可以通过联系人姓名的拼音首字母来查询,可以通过首字母来...

本文整理了PHP汉字拼音转换和公历农历转换两个功能类文件,非常实用。比如我们查找通讯录可以通过联系人姓名的拼音首字母来查询,可以通过首字母来导航大数据量,可以通过转换拼音来做网站优化等。公农历转化一般用在日历日程安排的项目中,方便农历的节日提醒等等。

1、PHP汉字转拼音

Pinyin.class.php类文件可以将大多数汉字转换成汉语拼音,当然也有个别生僻字不能转换,如果你想转换所有的汉字拼音的话,可能需要再配合一个汉字字库来实现,使用该类文件就基本能满足你的项目需求了。用法:

复制代码 代码如下:

require_once("Pinyin.class.php");

$pinyin = new Pinyin();

$str = '好好学习天天向上';

echo $pinyin->strtopin($str);

执行后输出:hao hao xue xi tian tian xiang shang。

如果只是想输出汉字首字母则使用:

复制代码 代码如下:

echo $pinyin->strtopin($str,1);

执行后输出:hhxxttxs。

Pinyin.class.php 源码:

复制代码 代码如下:

<?php

class Pinyin{

private $d = array (

array (

"a",

-20319

),

array (

"ai",

-20317

),

array (

"an",

-20304

),

array (

"ang",

-20295

),

array (

"ao",

-20292

),

array (

"ba",

-20283

),

array (

"bai",

-20265

),

array (

"ban",

-20257

),

array (

"bang",

-20242

),

array (

"bao",

-20230

),

array (

"bei",

-20051

),

array (

"ben",

-20036

),

array (

"beng",

-20032

),

array (

"bi",

-20026

),

array (

"bian",

-20002

),

array (

"biao",

-19990

),

array (

"bie",

-19986

),

array (

"bin",

-19982

),

array (

"bing",

-19976

),

array (

"bo",

-19805

),

array (

"bu",

-19784

),

array (

"ca",

-19775

),

array (

"cai",

-19774

),

array (

"can",

-19763

),

array (

"cang",

-19756

),

array (

"cao",

-19751

),

array (

"ce",

-19746

),

array (

"ceng",

-19741

),

array (

"cha",

-19739

),

array (

"chai",

-19728

),

array (

"chan",

-19725

),

array (

"chang",

-19715

),

array (

"chao",

-19540

),

array (

"che",

-19531

),

array (

"chen",

-19525

),

array (

"cheng",

-19515

),

array (

"chi",

-19500

),

array (

"chong",

-19484

),

array (

"chou",

-19479

),

array (

"chu",

-19467

),

array (

"chuai",

-19289

),

array (

"chuan",

-19288

),

array (

"chuang",

-19281

),

array (

"chui",

-19275

),

array (

"chun",

-19270

),

array (

"chuo",

-19263

),

array (

"ci",

-19261

),

array (

"cong",

-19249

),

array (

"cou",

-19243

),

array (

"cu",

-19242

),

array (

"cuan",

-19238

),

array (

"cui",

-19235

),

array (

"cun",

-19227

),

array (

"cuo",

-19224

),

array (

"da",

-19218

),

array (

"dai",

-19212

),

array (

"dan",

-19038

),

array (

"dang",

-19023

),

array (

"dao",

-19018

),

array (

"de",

-19006

),

array (

"deng",

-19003

),

array (

"di",

-18996

),

array (

"dian",

-18977

),

array (

"diao",

-18961

),

array (

"die",

-18952

),

array (

"ding",

-18783

),

array (

"diu",

-18774

),

array (

"dong",

-18773

),

array (

"dou",

-18763

),

array (

"du",

-18756

),

array (

"duan",

-18741

),

array (

"dui",

-18735

),

array (

"dun",

-18731

),

array (

"duo",

-18722

),

array (

"e",

-18710

),

array (

"en",

-18697

),

array (

"er",

-18696

),

array (

"fa",

-18526

),

array (

"fan",

-18518

),

array (

"fang",

-18501

),

array (

"fei",

-18490

),

array (

"fen",

-18478

),

array (

"feng",

-18463

),

array (

"fo",

-18448

),

array (

"fou",

-18447

),

array (

"fu",

-18446

),

array (

"ga",

-18239

),

array (

"gai",

-18237

),

array (

"gan",

-18231

),

array (

"gang",

-18220

),

array (

"gao",

-18211

),

array (

"ge",

-18201

),

array (

"gei",

-18184

),

array (

"gen",

-18183

),

array (

"geng",

-18181

),

array (

"gong",

-18012

),

array (

"gou",

-17997

),

array (

"gu",

-17988

),

array (

"gua",

-17970

),

array (

"guai",

-17964

),

array (

"guan",

-17961

),

array (

"guang",

-17950

),

array (

"gui",

-17947

),

array (

"gun",

-17931

),

array (

"guo",

-17928

),

array (

"ha",

-17922

),

array (

"hai",

-17759

),

array (

"han",

-17752

),

array (

"hang",

-17733

),

array (

"hao",

-17730

),

array (

"he",

-17721

),

array (

"hei",

-17703

),

array (

"hen",

-17701

),

array (

"heng",

-17697

),

array (

"hong",

-17692

),

array (

"hou",

-17683

),

array (

"hu",

-17676

),

array (

"hua",

-17496

),

array (

"huai",

-17487

),

array (

"huan",

-17482

),

array (

"huang",

-17468

),

array (

"hui",

-17454

),

array (

"hun",

-17433

),

array (

"huo",

-17427

),

array (

"ji",

-17417

),

array (

"jia",

-17202

),

array (

"jian",

-17185

),

array (

"jiang",

-16983

),

array (

"jiao",

-16970

),

array (

"jie",

-16942

),

array (

"jin",

-16915

),

array (

"jing",

-16733

),

array (

"jiong",

-16708

),

array (

"jiu",

-16706

),

array (

"ju",

-16689

),

array (

"juan",

-16664

),

array (

"jue",

-16657

),

array (

"jun",

-16647

),

array (

"ka",

-16474

),

array (

"kai",

-16470

),

array (

"kan",

-16465

),

array (

"kang",

-16459

),

array (

"kao",

-16452

),

array (

"ke",

-16448

),

array (

"ken",

-16433

),

array (

"keng",

-16429

),

array (

"kong",

-16427

),

array (

"kou",

-16423

),

array (

"ku",

-16419

),

array (

"kua",

-16412

),

array (

"kuai",

-16407

),

array (

"kuan",

-16403

),

array (

"kuang",

-16401

),

array (

"kui",

-16393

),

array (

"kun",

-16220

),

array (

"kuo",

-16216

),

array (

"la",

-16212

),

array (

"lai",

-16205

),

array (

"lan",

-16202

),

array (

"lang",

-16187

),

array (

"lao",

-16180

),

array (

"le",

-16171

),

array (

"lei",

-16169

),

array (

"leng",

-16158

),

array (

"li",

-16155

),

array (

"lia",

-15959

),

array (

"lian",

-15958

),

array (

"liang",

-15944

),

array (

"liao",

-15933

),

array (

"lie",

-15920

),

array (

"lin",

-15915

),

array (

"ling",

-15903

),

array (

"liu",

-15889

),

array (

"long",

-15878

),

array (

"lou",

-15707

),

array (

"lu",

-15701

),

array (

"lv",

-15681

),

array (

"luan",

-15667

),

array (

"lue",

-15661

),

array (

"lun",

-15659

),

array (

"luo",

-15652

),

array (

"ma",

-15640

),

array (

"mai",

-15631

),

array (

"man",

-15625

),

array (

"mang",

-15454

),

array (

"mao",

-15448

),

array (

"me",

-15436

),

array (

"mei",

-15435

),

array (

"men",

-15419

),

array (

"meng",

-15416

),

array (

"mi",

-15408

),

array (

"mian",

-15394

),

array (

"miao",

-15385

),

array (

"mie",

-15377

),

array (

"min",

-15375

),

array (

"ming",

-15369

),

array (

"miu",

-15363

),

array (

"mo",

-15362

),

array (

"mou",

-15183

),

array (

"mu",

-15180

),

array (

"na",

-15165

),

array (

"nai",

-15158

),

array (

"nan",

-15153

),

array (

"nang",

-15150

),

array (

"nao",

-15149

),

array (

"ne",

-15144

),

array (

"nei",

-15143

),

array (

"nen",

-15141

),

array (

"neng",

-15140

),

array (

"ni",

-15139

),

array (

"nian",

-15128

),

array (

"niang",

-15121

),

array (

"niao",

-15119

),

array (

"nie",

-15117

),

array (

"nin",

-15110

),

array (

"ning",

-15109

),

array (

"niu",

-14941

),

array (

"nong",

-14937

),

array (

"nu",

-14933

),

array (

"nv",

-14930

),

array (

"nuan",

-14929

),

array (

"nue",

-14928

),

array (

"nuo",

-14926

),

array (

"o",

-14922

),

array (

"ou",

-14921

),

array (

"pa",

-14914

),

array (

"pai",

-14908

),

array (

"pan",

-14902

),

array (

"pang",

-14894

),

array (

"pao",

-14889

),

array (

"pei",

-14882

),

array (

"pen",

-14873

),

array (

"peng",

-14871

),

array (

"pi",

-14857

),

array (

"pian",

-14678

),

array (

"piao",

-14674

),

array (

"pie",

-14670

),

array (

"pin",

-14668

),

array (

"ping",

-14663

),

array (

"po",

-14654

),

array (

"pu",

-14645

),

array (

"qi",

-14630

),

array (

"qia",

-14594

),

array (

"qian",

-14429

),

array (

"qiang",

-14407

),

array (

"qiao",

-14399

),

array (

"qie",

-14384

),

array (

"qin",

-14379

),

array (

"qing",

-14368

),

array (

"qiong",

-14355

),

array (

"qiu",

-14353

),

array (

"qu",

-14345

),

array (

"quan",

-14170

),

array (

"que",

-14159

),

array (

"qun",

-14151

),

array (

"ran",

-14149

),

array (

"rang",

-14145

),

array (

"rao",

-14140

),

array (

"re",

-14137

),

array (

"ren",

-14135

),

array (

"reng",

-14125

),

array (

"ri",

-14123

),

array (

"rong",

-14122

),

array (

"rou",

-14112

),

array (

"ru",

-14109

),

array (

"ruan",

-14099

),

array (

"rui",

-14097

),

array (

"run",

-14094

),

array (

"ruo",

-14092

),

array (

"sa",

-14090

),

array (

"sai",

-14087

),

array (

"san",

-14083

),

array (

"sang",

-13917

),

array (

"sao",

-13914

),

array (

"se",

-13910

),

array (

"sen",

-13907

),

array (

"seng",

-13906

),

array (

"sha",

-13905

),

array (

"shai",

-13896

),

array (

"shan",

-13894

),

array (

"shang",

-13878

),

array (

"shao",

-13870

),

array (

"she",

-13859

),

array (

"shen",

-13847

),

array (

"sheng",

-13831

),

array (

"shi",

-13658

),

array (

"shou",

-13611

),

array (

"shu",

-13601

),

array (

"shua",

-13406

),

array (

"shuai",

-13404

),

array (

"shuan",

-13400

),

array (

"shuang",

-13398

),

array (

"shui",

-13395

),

array (

"shun",

-13391

),

array (

"shuo",

-13387

),

array (

"si",

-13383

),

array (

"song",

-13367

),

array (

"sou",

-13359

),

array (

"su",

-13356

),

array (

"suan",

-13343

),

array (

"sui",

-13340

),

array (

"sun",

-13329

),

array (

"suo",

-13326

),

array (

"ta",

-13318

),

array (

"tai",

-13147

),

array (

"tan",

-13138

),

array (

"tang",

-13120

),

array (

"tao",

-13107

),

array (

"te",

-13096

),

array (

"teng",

-13095

),

array (

"ti",

-13091

),

array (

"tian",

-13076

),

array (

"tiao",

-13068

),

array (

"tie",

-13063

),

array (

"ting",

-13060

),

array (

"tong",

-12888

),

array (

"tou",

-12875

),

array (

"tu",

-12871

),

array (

"tuan",

-12860

),

array (

"tui",

-12858

),

array (

"tun",

-12852

),

array (

"tuo",

-12849

),

array (

"wa",

-12838

),

array (

"wai",

-12831

),

array (

"wan",

-12829

),

array (

"wang",

-12812

),

array (

"wei",

-12802

),

array (

"wen",

-12607

),

array (

"weng",

-12597

),

array (

"wo",

-12594

),

array (

"wu",

-12585

),

array (

"xi",

-12556

),

array (

"xia",

-12359

),

array (

"xian",

-12346

),

array (

"xiang",

-12320

),

array (

"xiao",

-12300

),

array (

"xie",

-12120

),

array (

"xin",

-12099

),

array (

"xing",

-12089

),

array (

"xiong",

-12074

),

array (

"xiu",

-12067

),

array (

"xu",

-12058

),

array (

"xuan",

-12039

),

array (

"xue",

-11867

),

array (

"xun",

-11861

),

array (

"ya",

-11847

),

array (

"yan",

-11831

),

array (

"yang",

-11798

),

array (

"yao",

-11781

),

array (

"ye",

-11604

),

array (

"yi",

-11589

),

array (

"yin",

-11536

),

array (

"ying",

-11358

),

array (

"yo",

-11340

),

array (

"yong",

-11339

),

array (

"you",

-11324

),

array (

"yu",

-11303

),

array (

"yuan",

-11097

),

array (

"yue",

-11077

),

array (

"yun",

-11067

),

array (

"za",

-11055

),

array (

"zai",

-11052

),

array (

"zan",

-11045

),

array (

"zang",

-11041

),

array (

"zao",

-11038

),

array (

"ze",

-11024

),

array (

"zei",

-11020

),

array (

"zen",

-11019

),

array (

"zeng",

-11018

),

array (

"zha",

-11014

),

array (

"zhai",

-10838

),

array (

"zhan",

-10832

),

array (

"zhang",

-10815

),

array (

"zhao",

-10800

),

array (

"zhe",

-10790

),

array (

"zhen",

-10780

),

array (

"zheng",

-10764

),

array (

"zhi",

-10587

),

array (

"zhong",

-10544

),

array (

"zhou",

-10533

),

array (

"zhu",

-10519

),

array (

"zhua",

-10331

),

array (

"zhuai",

-10329

),

array (

"zhuan",

-10328

),

array (

"zhuang",

-10322

),

array (

"zhui",

-10315

),

array (

"zhun",

-10309

),

array (

"zhuo",

-10307

),

array (

"zi",

-10296

),

array (

"zong",

-10281

),

array (

"zou",

-10274

),

array (

"zu",

-10270

),

array (

"zuan",

-10262

),

array (

"zui",

-10260

),

array (

"zun",

-10256

),

array (

"zuo",

-10254

)

);

function g($num) {

if ($num > 0 && $num < 160) {

return chr($num);

}

elseif ($num < -20319 || $num > -10247) {

return "";

} else {

for ($i = count($this->d) - 1; $i >= 0; $i--) {

if ($this->d[$i][1] <= $num)

break;

}

return $this->d[$i][0];

}

}

function c($str) {

$ret = "";

for ($i = 0; $i < strlen($str); $i++) {

$p = ord(substr($str, $i, 1));

if ($p > 160) {

$q = ord(substr($str, ++ $i, 1));

$p = $p * 256 + $q -65536;

}

$ret .= $this->g($p);

}

$ret = substr($ret, 0, 1);

return $ret;

}

function f($str) {

$ret = "";

for ($i = 0; $i < strlen($str); $i++) {

$p = ord(substr($str, $i, 1));

if ($p > 160) {

$q = ord(substr($str, ++ $i, 1));

$p = $p * 256 + $q -65536;

}

$ret .= $this->g($p);

}

return $ret;

}

/*

PHP截取UTF-8编码的中英文字符串

*/

function utf8_substr($str, $from, $len) {

return preg_replace('#^(?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,' . $from . '}' . '((?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,' . $len . '}).*#s', '$1', $str);

}

/*

将中英文字符串转换成拼音

*/

function strtopin($chinese,$type=0) {

$i = 0;

$pinyin = "";

$arr = array ();

while (1) {

$str = $this->utf8_substr($chinese, $i, 1);

if (!empty ($str)) {

$arr[$i] = $str;

$str = iconv("utf-8", "gb2312", $str);

if($type==1){ //转换成首字母

$pinyin .= $this->c($str);

}else{ //转换成全拼

$pinyin .= $this->f($str)." ";

}

$i = $i +1;

} else

break;

}

return $pinyin;

}

}

?>

2、PHP公历农历转换

公历转农历的算法非常复杂,涉及到农历润月、干支纪年、生肖等。网络上有很多提供的算法,本文整理的一个Lunar.class.php可以实现公农历互转功能。用法:

复制代码 代码如下:

require_once("Lunar.class.php");

$lunar = new Lunar();

$date = $lunar->convertLunarToSolar(2013,8,17); //公历转农历

print_r($date);

执行后输出数组:

复制代码 代码如下:

Array ( [0] => 二零一三 [1] => 七月 [2] => 十一 [3] => 癸巳

[4] => 7 [5] => 11 [6] => 蛇 [7] => 0 )

如果要将农历转换成公历则使用:

复制代码 代码如下:

$date = $lunar->convertLunarToSolar(2013,8,17); //农历转公历

print_r($date);

执行后输出数组:

复制代码 代码如下:

Array ( [0] => 2013 [1] => 09 [2] => 21 )

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)

);

/**

* 将阳历转换为阴历

* @param year 公历-年

* @param month 公历-月

* @param date 公历-日

*/

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,'正月','初一','辛卯',1,1,'兔');

}

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,'正月','初一','辛卯',1,1,'兔');

}

$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;

}

/**

* 将阴历转换为阳历

* @param year 阴历-年

* @param month 阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月,只是有的时候第13个月的天数为0

* @param date 阴历-日

*/

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);

}

/**

* 判断是否是闰年

* @param year

*/

function isLeapYear($year){

return (($year%4==0 && $year%100 !=0) || ($year%400==0));

}

/**

* 获取干支纪年

* @param year

*/

function getLunarYearName($year){

$sky = array('庚','辛','壬','癸','甲','乙','丙','丁','戊','己');

$earth = array('申','酉','戌','亥','子','丑','寅','卯','辰','巳','午','未');

$year = $year.'';

return $sky[$year{3}].$earth[$year%12];

}

/**

* 根据阴历年获取生肖

* @param year 阴历年

*/

function getYearZodiac($year){

$zodiac = array('猴','鸡','狗','猪','鼠','牛','虎','兔','龙','蛇','马','羊');

return $zodiac[$year%12];

}

/**

* 获取阳历月份的天数

* @param year 阳历-年

* @param 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"];

}

/**

* 获取阴历月份的天数

* @param year 阴历-年

* @param month 阴历-月,从一月开始

*/

function getLunarMonthDays($year,$month){

$monthData = $this->getLunarMonths($year);

return $monthData[$month-1];

}

/**

* 获取阴历每月的天数的数组

* @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;

}

/**

* 获取农历每年的天数

* @param 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;

}

/**

* 获取闰月

* @param year 阴历年份

*/

function getLeapMonth($year){

$yearData = $this->lunarInfo[$year-$this->MIN_YEAR];

return $yearData[0];

}

/**

* 计算阴历日期与正月初一相隔的天数

* @param year

* @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;

}

/**

* 计算2个阳历日期之间的天数

* @param year 阳历年

* @param cmonth

* @param cdate

* @param dmonth 阴历正月对应的阳历月份

* @param ddate 阴历初一对应的阳历天数

*/

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);

}

/**

* 根据距离正月初一的天数计算阴历日期

* @param year 阳历年

* @param between 天数

*/

function getLunarByBetween($year,$between){

//debugger;

$lunarArray = array();

$yearMonth=array();

$t=0;

$e=0;

$leapMonth=0;

$m='';

if($between==0){

array_push($lunarArray, $year,'正月','初一');

$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)?('闰'.$this->getCapitalNum($t- 1,true)):$this->getCapitalNum(($leapMonth!=0&&$leapMonth+1<$t?($t-1):$t),true);

$my_year =$this->toYear($year);

array_push($lunarArray,$my_year,$m,$this->getCapitalNum($e,false));

}

array_push($lunarArray,$this->getLunarYearName($year));// 天干地支

array_push($lunarArray,$t,$e);

array_push($lunarArray,$this->getYearZodiac($year));// 12生肖

array_push($lunarArray,$leapMonth);// 闰几月

return $lunarArray;

}

//转换成中文年份

function toYear($year){

$arr = array("零","一","二","三","四","五","六","七","八","九");

$year_arr = str_split($year);

$str = $arr[$year_arr[0]].$arr[$year_arr[1]].$arr[$year_arr[2]].$arr[$year_arr[3]];

return $str;

}

/**

* 获取数字的阴历叫法

* @param num 数字

* @param isMonth 是否是月份的数字

*/

function getCapitalNum($num,$isMonth){

$isMonth = $isMonth || false;

$dateHash=array('0'=>'','1'=>'一','2'=>'二','3'=>'三','4'=>'四','5'=>'五','6'=>'六','7'=>'七','8'=>'八','9'=>'九','10'=>'十 ');

$monthHash=array('0'=>'','1'=>'正月','2'=>'二月','3'=>'三月','4'=>'四月','5'=>'五月','6'=>'六月','7'=>'七月','8'=>'八月','9'=>'九月','10'=>'十月','11'=>'冬月','12'=>'腊月');

$res='';

if($isMonth){

$res = $monthHash[$num];

}else{

if($num<=10){

$res = '初'.$dateHash[$num];

}else if($num>10&&$num<20){

$res = '十'.$dateHash[$num-10];

}else if($num==20){

$res = "二十";

}else if($num>20&&$num<30){

$res = "廿".$dateHash[$num-20];

}else if($num==30){

$res = "三十";

}

}

return $res;

}

}

?>

以上整理的两个PHP类,可以满足项目基本需求,但是都有一定的缺陷,比如拼音转换可能会遇到生僻字转换不了,公历转农历你会发现2021年后的转换会出问题了,大家有空可以研究下,如果您有更好的实现代码,欢迎分享。

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新php教程学习
    热门php教程学习
    编程开发子分类