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


Posted in PHP onJuly 01, 2014

本文整理了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 相关文章推荐
php4的session功能评述(三)
Oct 09 PHP
php过滤危险html代码
Aug 18 PHP
php打造属于自己的MVC框架
Mar 07 PHP
Yii操作数据库的3种方法
Mar 11 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
ThinkPHP CURD方法之page方法详解
Jun 18 PHP
php轻松实现文件上传功能
Mar 03 PHP
Zend Framework教程之连接数据库并执行增删查的方法(附demo源码下载)
Mar 21 PHP
CodeIgniter连贯操作的底层原理分析
May 17 PHP
简单谈谈PHP中的trait
Feb 25 PHP
PHP实时统计中文字数和区别
Feb 28 PHP
PHP中的自动加载操作实现方法详解
Aug 06 PHP
PHP和javascript常用正则表达式及用法实例
Jul 01 #PHP
PHP生成二维码的两个方法和实例
Jul 01 #PHP
PHP中使用TCPDF生成PDF文档实例
Jul 01 #PHP
PHP中使用CURL模拟登录并获取数据实例
Jul 01 #PHP
2个比较经典的PHP加密解密函数分享
Jul 01 #PHP
PHP实现生成唯一编号(36进制的不重复编号)
Jul 01 #PHP
ThinkPHP使用smarty模板引擎的方法
Jul 01 #PHP
You might like
全文搜索和替换
2006/10/09 PHP
php通过淘宝API查询IP地址归属等信息
2015/12/25 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
php实现微信分享朋友链接功能
2019/02/18 PHP
仿猪八戒网左下角的文字滚动效果
2011/10/28 Javascript
javascript实现tab切换的四种方法
2015/11/05 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
JS中传递参数的几种不同方法比较
2017/01/20 Javascript
使用Math.max,Math.min获取数组中的最值实例
2017/04/25 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
Python中优化NumPy包使用性能的教程
2015/04/23 Python
Python+django实现文件下载
2016/01/17 Python
git进行版本控制心得详谈
2017/12/10 Python
pandas string转dataframe的方法
2018/04/11 Python
python绘制地震散点图
2019/06/18 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
有关Tensorflow梯度下降常用的优化方法分享
2020/02/04 Python
Python中pass的作用与使用教程
2020/11/13 Python
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
关于运动会广播稿300字
2014/10/05 职场文书
教师节校长致辞
2015/07/31 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
react中props 的使用及进行限制的方法
2021/04/28 Javascript
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android
ICOM R71E和R72E图文对比解说
2022/04/07 无线电
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS