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年后的转换会出问题了,大家有空可以研究下,如果您有更好的实现代码,欢迎分享。