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+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
Dec 16 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
Aug 08 PHP
修改php.ini以达到屏蔽错误信息并记录日志
Jun 16 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
PHP生成等比缩略图类和自定义函数分享
Jun 25 PHP
跟我学Laravel之视图 &amp; Response
Oct 15 PHP
PHP设计模式之观察者模式实例
Feb 22 PHP
PHP文件上传类实例详解
Apr 08 PHP
PHP封装的数据库保存session功能类
Jul 11 PHP
PHP单态模式简单用法示例
Nov 16 PHP
Laravel5.4简单实现app接口Api Token认证方法
Aug 29 PHP
PHP内存溢出优化代码详解
Feb 26 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数据缓存技术
2007/02/14 PHP
浅谈php提交form表单
2015/07/01 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
固定网页背景图同时保持图片比例的思路代码
2013/08/15 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
基于JQuery的Ajax方法使用详解
2017/08/16 jQuery
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
javascript实现留言板功能
2020/02/08 Javascript
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
python中getaddrinfo()基本用法实例分析
2015/06/28 Python
python编写简单爬虫资料汇总
2016/03/22 Python
python抓取京东小米8手机配置信息
2018/11/13 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
Python 画出来六维图
2019/07/26 Python
Python对接六大主流数据库(只需三步)
2019/07/31 Python
python多线程与多进程及其区别详解
2019/08/08 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
2013年大学生的自我鉴定
2013/10/24 职场文书
毕业自我评价范文
2013/11/17 职场文书
应届毕业生应聘自荐信
2013/12/07 职场文书
房屋改造计划书
2014/01/10 职场文书
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
毕业生就业意向书
2014/04/01 职场文书
公司门卫工作职责
2014/06/28 职场文书
浅谈Python协程asyncio
2021/06/20 Python
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis