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类
Apr 09 PHP
php 计算两个时间戳相隔的时间的函数(小时)
Dec 18 PHP
防止用户利用PHP代码DOS造成用光网络带宽
Mar 01 PHP
PHP计划任务、定时执行任务的实现代码
Apr 23 PHP
php操作xml入门之cdata区段
Jan 23 PHP
php通过文件流方式复制文件的方法
Mar 13 PHP
fckeditor上传文件按日期存放及重命名方法
May 22 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Dec 14 PHP
关于PHP通用返回值设置方法
Mar 31 PHP
ThinkPHP 5.x远程命令执行漏洞复现
Sep 23 PHP
laravel 实现用户登录注销并限制功能
Oct 24 PHP
php变量与字符串的增删改查操作示例
May 07 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
亚洲咖啡有什么?亚洲咖啡产地介绍 亚洲咖啡有什么特点?
2021/03/05 新手入门
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
PHP云打印类完整示例
2016/10/15 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
JavaScript入门教程(9) Document文档对象
2009/01/31 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
深入理解javascript的getTime()方法
2017/02/16 Javascript
JS 60秒后重新发送验证码的实例讲解
2017/07/26 Javascript
JS实现图片旋转动画效果封装与使用示例
2018/07/09 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
深入理解令牌认证机制(token)
2019/08/22 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
Python构造函数及解构函数介绍
2015/02/26 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
在Python中执行系统命令的方法示例详解
2017/09/14 Python
利用python如何处理nc数据详解
2018/05/23 Python
python排序函数sort()与sorted()的区别
2018/09/18 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
python 动态绘制爱心的示例
2020/09/27 Python
为什么会有内存对齐
2016/10/10 面试题
高中生学习总结的自我评价范文
2013/10/13 职场文书
师范应届毕业生自荐信
2013/11/18 职场文书
大学生素质拓展活动方案
2014/02/11 职场文书
市政管理求职信范文
2014/05/07 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书