PHP实现的汉字拼音转换和公历农历转换类及使用示例

 更新时间:2014年07月01日 10:54:42   投稿:junjie  
这篇文章主要介绍了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年后的转换会出问题了,大家有空可以研究下,如果您有更好的实现代码,欢迎分享。

相关文章

最新评论