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函数
Feb 16 PHP
thinkphp在模型中自动完成session赋值示例代码
Sep 09 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
Dec 15 PHP
基于PHPexecl类生成复杂的报表表头示例
Oct 14 PHP
yii2项目实战之restful api授权验证详解
May 20 PHP
PHP实现的mysql主从数据库状态检测功能示例
Jul 20 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
Sep 01 PHP
php简单读取.vcf格式文件的方法示例
Sep 02 PHP
PHP判断json格式是否正确的实现代码
Sep 20 PHP
PHP封装的分页类与简单用法示例
Feb 25 PHP
PHP实现数组和对象的相互转换操作示例
Mar 20 PHP
PHP var关键字相关原理及使用实例解析
Jul 11 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源代码
2006/10/09 PHP
PHP写杨辉三角实例代码
2011/07/17 PHP
php中判断数组是一维,二维,还是多维的解决方法
2013/05/04 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
Javascript学习笔记9 prototype封装继承
2010/01/11 Javascript
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
jQuery验证插件validation使用指南
2015/04/21 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
JS中DOM元素的attribute与property属性示例详解
2018/09/04 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
[01:24:34]2014 DOTA2华西杯精英邀请赛5 24 DK VS LGD
2014/05/25 DOTA
python自动安装pip
2014/04/24 Python
python编写简单爬虫资料汇总
2016/03/22 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
浅谈django不使用restframework自定义接口与使用的区别
2020/07/15 Python
乡镇庆八一活动方案
2014/02/02 职场文书
家具促销活动方案
2014/02/16 职场文书
班级德育工作实施方案
2014/02/21 职场文书
职业生涯规划书结束语
2014/04/15 职场文书
劳动竞赛口号
2014/06/16 职场文书
农行心得体会
2014/09/02 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
一文搞懂Python Sklearn库使用
2021/08/23 Python