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 相关文章推荐
两个强悍的php 图像处理类1
Jun 15 PHP
PHP sprintf()函数用例解析
May 18 PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
Aug 16 PHP
自己写了一个php检测文件编码的函数
Apr 21 PHP
yii操作cookie实例简介
Jul 09 PHP
destoon实现公司新闻详细页添加评论功能的方法
Jul 15 PHP
PHP 7的一些引人注目的新特性简单介绍
Nov 08 PHP
PHP常见的6个错误提示及解决方法
Jul 07 PHP
PHP命名空间namespace用法实例分析
Sep 27 PHP
PHP 7.1新特性的汇总介绍
Dec 16 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
Dec 27 PHP
PHP如何开启Opcache功能提升程序处理效率
Apr 27 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
php学习笔记 类的声明与对象实例化
2011/06/13 PHP
javascript学习网址备忘
2007/05/29 Javascript
js 动态选中下拉框
2009/11/26 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
SOSO地图API使用(一)在地图上画圆实现思路与代码
2013/01/15 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
javascript学习笔记(二)数组和对象部分
2014/09/30 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
jsTree使用记录实例
2016/12/01 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
使用node搭建自动发图文微博机器人的方法
2019/03/22 Javascript
javascript防抖函数debounce详解
2019/06/11 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
jQuery实现简单三级联动效果
2020/09/05 jQuery
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
Python 抓取动态网页内容方案详解
2014/12/25 Python
Python的字典和列表的使用中一些需要注意的地方
2015/04/24 Python
详解Python程序与服务器连接的WSGI接口
2015/04/29 Python
对python中字典keys,values,items的使用详解
2019/02/03 Python
python3 实现函数写文件路径的正确方法
2019/11/27 Python
python 字符串格式化的示例
2020/09/21 Python
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
美国木工工具和用品商店:Woodcraft
2019/10/30 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
后勤岗位职责
2013/11/26 职场文书
应届毕业生求职信范文
2013/12/18 职场文书
文明市民先进事迹
2014/05/15 职场文书
民主评议党员个人总结
2015/02/13 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
MySQL的安装与配置详细教程
2021/06/26 MySQL
Nginx实现负载均衡的项目实践
2022/03/18 Servers