<?php
/**
* @author szargv@wo.cn
*
* 此日历转换类完全源于以下项目,感谢这两个项目作者的无私分享:
* https://github.com/nozomi199/qimen_star (八字排盘,JS源码)
* http://www.bieyu.com/ (详尽的历法转换原理,JS源码)
*
* 我們現在所使用的以西元年月日表示的格里高利历(Gregorian calendar)
* 儒略日历(Julian day),以西元前4713年(或-4712年)1月1日12時為起點,方便各历法间的转换
*/
class paipan{
/**
* 是否区分 早晚子 时,true则23:00-24:00算成上一天
* @var bool
*/
public $zwz = false;
/**
* 十天干
* @var array
*/
public $ctg = array('甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'); //char of TianGan
/**
* 五行
*/
public $cwx = array('金', '木', '水', '火', '土'); //char of WuXing
/**
* 天干对应五行
* @var array
*/
public $tgwx = array(1, 1, 3, 3, 4, 4, 0, 0, 2, 2);
/**
* 十二地支
* @var array
*/
public $cdz = array('子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'); //char of DiZhi
/**
* 地支对应五行
* @var array
*/
public $dzwx = array(2, 4, 1, 1, 4, 3, 3, 4, 0, 0, 4, 2);
/**
* 地支藏干
* @var array
*/
public $dzcg = array([9], [5,9,7], [0,2,4], [1], [4,1,9], [2,4,6], [3,5], [5,3,1], [6,8,4], [7], [4,7,3], [8,0]);
/**
* 十二生肖
* @var array
*/
public $csa = array('鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪'); //char of symbolic animals
/**
* 十二星座
* @var array
*/
public $cxz = array('水瓶座', '双鱼座', '白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座', '摩羯座'); //char of XingZuo
/**
* 星期
* @var array
*/
public $wkd = array('日', '一', '二', '三', '四', '五', '六'); //week day
/**
* 廿四节气(从春分开始)
* @var array
*/
public $jq = array('春分', '清明', '谷雨', '立夏', '小满', '芒种', '夏至', '小暑', '大暑', '立秋', '处暑', '白露', '秋分', '寒露', '霜降', '立冬', '小雪', '大雪', '冬至', '小寒', '大寒', '立春', '雨水', '惊蛰'); //JieQi
/**
* 均值朔望月長(mean length of synodic month)
* @var float
*/
private $synmonth = 29.530588853;
/**
* 因子
* @var array
*/
private $ptsa = array(485, 203, 199, 182, 156, 136, 77, 74, 70, 58, 52, 50, 45, 44, 29, 18, 17, 16, 14, 12, 12, 12, 9, 8);
private $ptsb = array(324.96, 337.23, 342.08, 27.85, 73.14, 171.52, 222.54, 296.72, 243.58, 119.81, 297.17, 21.02, 247.54, 325.15, 60.93, 155.12, 288.79, 198.04, 199.76, 95.39, 287.11, 320.81, 227.73, 15.45);
private $ptsc = array(1934.136, 32964.467, 20.186, 445267.112, 45036.886, 22518.443, 65928.934, 3034.906, 9037.513, 33718.147, 150.678, 2281.226, 29929.562, 31555.956, 4443.417, 67555.328, 4562.452, 62894.029, 31436.921, 14577.848, 31931.756, 34777.259, 1222.114, 16859.074);
/**
* 计算指定年(公历)的春分点(vernal equinox),但因地球在繞日运行時會因受到其他星球之影響而產生攝動(perturbation),必須將此現象產生的偏移量加入.
* @param int $yy
* @return boolean|number 返回儒略日历格林威治时间
*/
private function VE($yy) {
if($yy < -8000){
return false;
}
if($yy > 8001){
return false;
}
if ($yy >= 1000 && $yy <= 8001) {
$m = ($yy - 2000) / 1000;
return 2451623.80984 + 365242.37404 * $m + 0.05169 * $m * $m - 0.00411 * $m * $m * $m - 0.00057 * $m * $m * $m * $m;
}
if ($yy >= -8000 && $yy < 1000) {
$m = $yy / 1000;
return 1721139.29189 + 365242.1374 * $m + 0.06134 * $m * $m + 0.00111 * $m * $m * $m - 0.00071 * $m * $m * $m * $m;
}
}
/**
* 地球在繞日运行時會因受到其他星球之影響而產生攝動(perturbation)
* @param float $jd
* @return number 返回某时刻(儒略日历)的攝動偏移量
*/
private function Perturbation($jd) {
$t = ($jd - 2451545) / 36525;
$s = 0;
for ($k = 0; $k <= 23; $k++) {
$s = $s + $this->ptsa[$k] * cos($this->ptsb[$k] * 2 * pi() / 360 + $this->ptsc[$k] * 2 * pi() / 360 * $t);
}
$w = 35999.373 * $t - 2.47;
$l = 1 + 0.0334 * cos($w * 2 * pi() / 360) + 0.0007 * cos(2 * $w * 2 * pi() / 360);
return 0.00001 * $s / $l;
}
/**
* 求∆t
* @param int $yy 年份
* @param int $mm 月份
* @return number
*/
private function DeltaT($yy, $mm) { $y = $yy + ($mm - 0.5) / 12; if ($y <= -500) {
$u = ($y - 1820) / 100;
$dt = ( - 20 + 32 * $u * $u);
} else {
if ($y < 500) {
$u = $y / 100;
$dt = (10583.6 - 1014.41 * $u + 33.78311 * $u * $u - 5.952053 * $u * $u * $u - 0.1798452 * $u * $u * $u * $u + 0.022174192 * $u * $u * $u * $u * $u + 0.0090316521 * $u * $u * $u * $u * $u * $u);
} else {
if ($y < 1600) {
$u = ($y - 1000) / 100;
$dt = (1574.2 - 556.01 * $u + 71.23472 * $u * $u + 0.319781 * $u * $u * $u - 0.8503463 * $u * $u * $u * $u - 0.005050998 * $u * $u * $u * $u * $u + 0.0083572073 * $u * $u * $u * $u * $u * $u);
} else {
if ($y < 1700) {
$t = $y - 1600;
$dt = (120 - 0.9808 * $t - 0.01532 * $t * $t + $t * $t * $t / 7129);
} else {
if ($y < 1800) {
$t = $y - 1700;
$dt = (8.83 + 0.1603 * $t - 0.0059285 * $t * $t + 0.00013336 * $t * $t * $t - $t * $t * $t * $t / 1174000);
} else {
if ($y < 1860) {
$t = $y - 1800;
$dt = (13.72 - 0.332447 * $t + 0.0068612 * $t * $t + 0.0041116 * $t * $t * $t - 0.00037436 * $t * $t * $t * $t + 0.0000121272 * $t * $t * $t * $t * $t - 0.0000001699 * $t * $t * $t * $t * $t * $t + 0.000000000875 * $t * $t * $t * $t * $t * $t * $t);
} else {
if ($y < 1900) {
$t = $y - 1860;
$dt = (7.62 + 0.5737 * $t - 0.251754 * $t * $t + 0.01680668 * $t * $t * $t - 0.0004473624 * $t * $t * $t * $t + $t * $t * $t * $t * $t / 233174);
} else {
if ($y < 1920) {
$t = $y - 1900;
$dt = ( - 2.79 + 1.494119 * $t - 0.0598939 * $t * $t + 0.0061966 * $t * $t * $t - 0.000197 * $t * $t * $t * $t);
} else {
if ($y < 1941) {
$t = $y - 1920;
$dt = (21.2 + 0.84493 * $t - 0.0761 * $t * $t + 0.0020936 * $t * $t * $t);
} else {
if ($y < 1961) {
$t = $y - 1950;
$dt = (29.07 + 0.407 * $t - $t * $t / 233 + $t * $t * $t / 2547);
} else {
if ($y < 1986) {
$t = $y - 1975;
$dt = (45.45 + 1.067 * $t - $t * $t / 260 - $t * $t * $t / 718);
} else {
if ($y < 2005) {
$t = $y - 2000;
$dt = (63.86 + 0.3345 * $t - 0.060374 * $t * $t + 0.0017275 * $t * $t * $t + 0.000651814 * $t * $t * $t * $t + 0.00002373599 * $t * $t * $t * $t * $t);
} else {
if ($y < 2050) {
$t = $y - 2000;
$dt = (62.92 + 0.32217 * $t + 0.005589 * $t * $t);
} else {
if ($y < 2150) {
$u = ($y - 1820) / 100;
$dt = ( - 20 + 32 * $u * $u - 0.5628 * (2150 - $y));
} else {
$u = ($y - 1820) / 100;
$dt = ( - 20 + 32 * $u * $u);
}
}
}
}
}
}
}
}
}
}
}
}
}
} if ($y < 1955 || $y >= 2005){
$dt = $dt - (0.000012932 * ($y - 1955) * ($y - 1955));
}
return $dt / 60; //將秒轉換為分
}
/**
* 获取指定年的春分开始的24节气,另外多取2个确保覆盖完一个公历年
* 大致原理是:先用此方法得到理论值,再用摄动值(Perturbation)和固定参数DeltaT做调整
* @param int $yy
* @return boolean
*/
private function MeanJQJD($yy) {
if(! $jd = $this->VE($yy)){ //该年的春分點
return array();
}
$ty = $this->VE($yy + 1) - $jd; //该年的回歸年長 $num = 24 + 2; //另外多取2个确保覆盖完一个公历年 $ath = 2 * pi() / 24;
$tx = ($jd - 2451545) / 365250;
$e = 0.0167086342 - 0.0004203654 * $tx - 0.0000126734 * $tx * $tx + 0.0000001444 * $tx * $tx * $tx - 0.0000000002 * $tx * $tx * $tx * $tx + 0.0000000003 * $tx * $tx * $tx * $tx * $tx;
$tt = $yy / 1000;
$vp = 111.25586939 - 17.0119934518333 * $tt - 0.044091890166673 * $tt * $tt - 4.37356166661345E-04 * $tt * $tt * $tt + 8.16716666602386E-06 * $tt * $tt * $tt * $tt;
$rvp = $vp * 2 * pi() / 360;
$peri = array();
for ($i = 0; $i < $num; $i++) {
$flag = 0;
$th = $ath * $i + $rvp;
if ($th > pi() && $th <= 3 * pi()) {
$th = 2 * pi() - $th;
$flag = 1;
}
if ($th > 3 * pi()) {
$th = 4 * pi() - $th;
$flag = 2;
}
$f1 = 2 * atan((sqrt((1 - $e) / (1 + $e)) * tan($th / 2)));
$f2 = ($e * sqrt(1 - $e * $e) * sin($th)) / (1 + $e * cos($th));
$f = ($f1 - $f2) * $ty / 2 / pi();
if ($flag == 1){
$f = $ty - $f;
}
if ($flag == 2){
$f = 2 * $ty - $f;
}
$peri[$i] = $f;
}
$jqjd = array();
for ($i = 0; $i < $num; $i++) {
$jqjd[$i] = $jd + $peri[$i] - $peri[0];
} return (array)$jqjd;
}
/**
* 获取指定年的春分开始作Perturbaton調整後的24节气,可以多取2个
* @param int $yy
* @param int $start 0-25
* @param int $end 0-25
* @return array
*/
private function GetAdjustedJQ($yy, $start, $end) {
if($start<0 || $start>25){
return array();
}
if($end<0 || $end>25){
return array();
} $jq = array(); $jqjd = $this->MeanJQJD($yy); //获取该年春分开始的24节气时间点
foreach ($jqjd as $k => $jd){
if($k < $start){
continue;
}
if($k > $end){
continue;
}
$ptb = $this->Perturbation($jd); //取得受perturbation影響所需微調
$dt = $this->DeltaT($yy, floor(($k+1) / 2) + 3); //修正dynamical time to Universal time
$jq[$k] = $jd + $ptb - $dt / 60 / 24; //加上攝動調整值ptb,減去對應的Delta T值(分鐘轉換為日)
$jq[$k] = $jq[$k] + 1 / 3; //因中國時間比格林威治時間先行8小時,即1/3日
}
return (array)$jq;
}
/**
* 求出以某年立春點開始的節(注意:为了方便计算起运数,此处第0位为上一年的小寒)
* @param int $yy
* @return array jq[(2*$k+21)%24]
*/
private function GetPureJQsinceSpring($yy) {
$jdpjq = array(); $dj = $this->GetAdjustedJQ($yy - 1, 19, 23); //求出含指定年立春開始之3個節氣JD值,以前一年的年值代入
foreach ($dj as $k => $v){
if($k < 19){
continue;
}
if($k > 23){
continue;
}
if($k % 2 == 0){
continue;
}
$jdpjq[] = $dj[$k]; //19小寒;20大寒;21立春;22雨水;23惊蛰
} $dj = $this->GetAdjustedJQ($yy, 0, 25); //求出指定年節氣之JD值,從春分開始,到大寒,多取两个确保覆盖一个公历年,也方便计算起运数
foreach ($dj as $k => $v){
if($k % 2 == 0){
continue;
}
$jdpjq[] = $dj[$k];
} return (array)$jdpjq;
}
/**
* 求出自冬至點為起點的連續15個中氣
* @param int $yy
* @return array jq[(2*$k+18)%24]
*/
private function GetZQsinceWinterSolstice($yy) {
$jdzq = array(); $dj = $this->GetAdjustedJQ($yy - 1, 18, 23); //求出指定年冬至開始之節氣JD值,以前一年的值代入
$jdzq[0] = $dj[18]; //冬至
$jdzq[1] = $dj[20]; //大寒
$jdzq[2] = $dj[22]; //雨水 $dj = $this->GetAdjustedJQ($yy, 0, 23); //求出指定年節氣之JD值
foreach ($dj as $k => $v){
if($k%2 != 0){
continue;
}
$jdzq[] = $dj[$k];
} return (array)$jdzq;
}
/**
* 求出實際新月點
* 以2000年初的第一個均值新月點為0點求出的均值新月點和其朔望月之序數 k 代入此副程式來求算實際新月點
* @param unknown $k
* @return number
*/
private function TrueNewMoon($k) {
$jdt = 2451550.09765 + $k * $this->synmonth;
$t = ($jdt - 2451545) / 36525; //2451545為2000年1月1日正午12時的JD
$t2 = $t * $t; //square for frequent use
$t3 = $t2 * $t; //cube for frequent use
$t4 = $t3 * $t; //to the fourth
//mean time of phase
$pt = $jdt + 0.0001337 * $t2 - 0.00000015 * $t3 + 0.00000000073 * $t4;
//Sun's mean anomaly(地球繞太阳运行均值近點角)(從太阳觀察)
$m = 2.5534 + 29.10535669 * $k - 0.0000218 * $t2 - 0.00000011 * $t3;
//Moon's mean anomaly(月球繞地球运行均值近點角)(從地球觀察)
$mprime = 201.5643 + 385.81693528 * $k + 0.0107438 * $t2 + 0.00001239 * $t3 - 0.000000058 * $t4;
//Moon's argument of latitude(月球的緯度參數)
$f = 160.7108 + 390.67050274 * $k - 0.0016341 * $t2 - 0.00000227 * $t3 + 0.000000011 * $t4;
//Longitude of the ascending node of the lunar orbit(月球繞日运行軌道升交點之經度)
$omega = 124.7746 - 1.5637558 * $k + 0.0020691 * $t2 + 0.00000215 * $t3;
//乘式因子
$es = 1 - 0.002516 * $t - 0.0000074 * $t2;
//因perturbation造成的偏移:
$apt1 = -0.4072 * sin((pi() / 180) * $mprime);
$apt1 += 0.17241 * $es * sin((pi() / 180) * $m);
$apt1 += 0.01608 * sin((pi() / 180) * 2 * $mprime);
$apt1 += 0.01039 * sin((pi() / 180) * 2 * $f);
$apt1 += 0.00739 * $es * sin((pi() / 180) * ($mprime - $m));
$apt1 -= 0.00514 * $es * sin((pi() / 180) * ($mprime + $m));
$apt1 += 0.00208 * $es * $es * sin((pi() / 180) * (2 * $m));
$apt1 -= 0.00111 * sin((pi() / 180) * ($mprime - 2 * $f));
$apt1 -= 0.00057 * sin((pi() / 180) * ($mprime + 2 * $f));
$apt1 += 0.00056 * $es * sin((pi() / 180) * (2 * $mprime + $m));
$apt1 -= 0.00042 * sin((pi() / 180) * 3 * $mprime);
$apt1 += 0.00042 * $es * sin((pi() / 180) * ($m + 2 * $f));
$apt1 += 0.00038 * $es * sin((pi() / 180) * ($m - 2 * $f));
$apt1 -= 0.00024 * $es * sin((pi() / 180) * (2 * $mprime - $m));
$apt1 -= 0.00017 * sin((pi() / 180) * $omega);
$apt1 -= 0.00007 * sin((pi() / 180) * ($mprime + 2 * $m));
$apt1 += 0.00004 * sin((pi() / 180) * (2 * $mprime - 2 * $f));
$apt1 += 0.00004 * sin((pi() / 180) * (3 * $m));
$apt1 += 0.00003 * sin((pi() / 180) * ($mprime + $m - 2 * $f));
$apt1 += 0.00003 * sin((pi() / 180) * (2 * $mprime + 2 * $f));
$apt1 -= 0.00003 * sin((pi() / 180) * ($mprime + $m + 2 * $f));
$apt1 += 0.00003 * sin((pi() / 180) * ($mprime - $m + 2 * $f));
$apt1 -= 0.00002 * sin((pi() / 180) * ($mprime - $m - 2 * $f));
$apt1 -= 0.00002 * sin((pi() / 180) * (3 * $mprime + $m));
$apt1 += 0.00002 * sin((pi() / 180) * (4 * $mprime)); $apt2 = 0.000325 * sin((pi() / 180) * (299.77 + 0.107408 * $k - 0.009173 * $t2));
$apt2 += 0.000165 * sin((pi() / 180) * (251.88 + 0.016321 * $k));
$apt2 += 0.000164 * sin((pi() / 180) * (251.83 + 26.651886 * $k));
$apt2 += 0.000126 * sin((pi() / 180) * (349.42 + 36.412478 * $k));
$apt2 += 0.00011 * sin((pi() / 180) * (84.66 + 18.206239 * $k));
$apt2 += 0.000062 * sin((pi() / 180) * (141.74 + 53.303771 * $k));
$apt2 += 0.00006 * sin((pi() / 180) * (207.14 + 2.453732 * $k));
$apt2 += 0.000056 * sin((pi() / 180) * (154.84 + 7.30686 * $k));
$apt2 += 0.000047 * sin((pi() / 180) * (34.52 + 27.261239 * $k));
$apt2 += 0.000042 * sin((pi() / 180) * (207.19 + 0.121824 * $k));
$apt2 += 0.00004 * sin((pi() / 180) * (291.34 + 1.844379 * $k));
$apt2 += 0.000037 * sin((pi() / 180) * (161.72 + 24.198154 * $k));
$apt2 += 0.000035 * sin((pi() / 180) * (239.56 + 25.513099 * $k));
$apt2 += 0.000023 * sin((pi() / 180) * (331.55 + 3.592518 * $k));
return $pt + $apt1 + $apt2;
}
/**
* 對於指定日期時刻所屬的朔望月,求出其均值新月點的月序數
* @param float $jd
* @return int
*/
private function MeanNewMoon($jd) {
//$kn為從2000年1月6日14時20分36秒起至指定年月日之阴曆月數,以synodic month為單位
$kn = floor(($jd - 2451550.09765) / $this->synmonth); //2451550.09765為2000年1月6日14時20分36秒之JD值.
$jdt = 2451550.09765 + $kn * $this->synmonth;
//Time in Julian centuries from 2000 January 0.5.
$t = ($jdt - 2451545) / 36525; //以100年為單位,以2000年1月1日12時為0點
$thejd = $jdt + 0.0001337 * $t * $t - 0.00000015 * $t * $t * $t + 0.00000000073 * $t * $t * $t * $t;
//2451550.09765為2000年1月6日14時20分36秒,此為2000年後的第一個均值新月
return array($kn, $thejd);
}
/**
* 将儒略日历时间转换为公历(格里高利历)时间
* @param float $jd
* @return array(年,月,日,时,分,秒)
*/
private function Julian2Solar($jd) {
$jd = (float)$jd; if ($jd >= 2299160.5) { //1582年10月15日,此日起是儒略日历,之前是儒略历
$y4h = 146097;
$init = 1721119.5;
} else {
$y4h = 146100;
$init = 1721117.5;
}
$jdr = floor($jd - $init);
$yh = $y4h / 4;
$cen = floor(($jdr + 0.75) / $yh);
$d = floor($jdr + 0.75 - $cen * $yh);
$ywl = 1461 / 4;
$jy = floor(($d + 0.75) / $ywl);
$d = floor($d + 0.75 - $ywl * $jy + 1);
$ml = 153 / 5;
$mp = floor(($d - 0.5) / $ml);
$d = floor(($d - 0.5) - 30.6 * $mp + 1);
$y = (100 * $cen) + $jy;
$m = ($mp + 2) % 12 + 1;
if ($m < 3){
$y = $y + 1;
}
$sd = floor(($jd + 0.5 - floor($jd + 0.5)) * 24 * 60 * 60 + 0.00005);
$mt = floor($sd / 60);
$ss = $sd % 60;
$hh = floor($mt / 60);
$mt = $mt % 60;
$yy = floor($y);
$mm = floor($m);
$dd = floor($d); return array($yy, $mm, $dd, $hh, $mt, $ss);
}
/**
* 以比較日期法求算冬月及其餘各月名稱代碼,包含閏月,冬月為0,臘月為1,正月為2,餘類推.閏月多加0.5
* @param int $yy
*/
private function GetZQandSMandLunarMonthCode($yy) {
$mc = array(); $jdzq = $this->GetZQsinceWinterSolstice($yy); //取得以前一年冬至為起點之連續15個中氣
$jdnm = $this->GetSMsinceWinterSolstice($yy, $jdzq[0]); //求出以含冬至中氣為阴曆11月(冬月)開始的連續16個朔望月的新月點
$yz = 0; //設定旗標,0表示未遇到閏月,1表示已遇到閏月
if (floor($jdzq[12] + 0.5) >= floor($jdnm[13] + 0.5)) { //若第13個中氣jdzq(12)大於或等於第14個新月jdnm(13)
for ($i = 1; $i <= 14; $i++) { //表示此兩個冬至之間的11個中氣要放到12個朔望月中,
//至少有一個朔望月不含中氣,第一個不含中氣的月即為閏月
//若阴曆臘月起始日大於冬至中氣日,且阴曆正月起始日小於或等於大寒中氣日,則此月為閏月,其餘同理
if (floor(($jdnm[$i] + 0.5) > floor($jdzq[$i - 1 - $yz] + 0.5) && floor($jdnm[$i + 1] + 0.5) <= floor($jdzq[$i - $yz] + 0.5))) {
$mc[$i] = $i - 0.5;
$yz = 1; //標示遇到閏月
} else {
$mc[$i] = $i - $yz; //遇到閏月開始,每個月號要減1
}
}
} else { //否則表示兩個連續冬至之間只有11個整月,故無閏月
for ($i = 0; $i <= 12; $i++) { //直接賦予這12個月月代碼
$mc[$i] = $i;
}
for ($i = 13; $i <= 14; $i++) { //處理次一置月年的11月與12月,亦有可能含閏月
//若次一阴曆臘月起始日大於附近的冬至中氣日,且阴曆正月起始日小於或等於大寒中氣日,則此月為閏月,次一正月同理.
if (floor(($jdnm[$i] + 0.5) > floor($jdzq[$i - 1 - $yz] + 0.5) && floor($jdnm[$i + 1] + 0.5) <= floor($jdzq[$i - $yz] + 0.5))) {
$mc[$i] = $i - 0.5;
$yz = 1; //標示遇到閏月
} else {
$mc[$i] = $i - $yz; //遇到閏月開始,每個月號要減1
}
}
}
return array($jdzq, $jdnm, $mc);
}
/**
* 求算以含冬至中氣為阴曆11月開始的連續16個朔望月
* @param int $yy 年份
* @param float $jdws 冬至的儒略日历时间
* @return array
*/
private function GetSMsinceWinterSolstice($yy, $jdws) {
$tjd = array();
$jd = $this->Solar2Julian($yy - 1, 11, 1, 0, 0, 0); //求年初前兩個月附近的新月點(即前一年的11月初)
list($kn, $thejd) = $this->MeanNewMoon($jd); //求得自2000年1月起第kn個平均朔望日及其JD值
for ($i = 0; $i <= 19; $i++) { //求出連續20個朔望月
$k = $kn + $i;
$mjd = $thejd + $this->synmonth * $i;
$tjd[$i] = $this->TrueNewMoon($k) + 1 / 3; //以k值代入求瞬時朔望日,因中國比格林威治先行8小時,加1/3天
//下式為修正dynamical time to Universal time
$tjd[$i] = $tjd[$i] - $this->DeltaT($yy, $i - 1) / 1440; //1為1月,0為前一年12月,-1為前一年11月(當i=0時,i-1=-1,代表前一年11月)
}
for ($j = 0; $j <= 18; $j++) {
if (floor($tjd[$j] + 0.5) > floor($jdws + 0.5)) {
break;
} //已超過冬至中氣(比較日期法)
} $jdnm = array();
for ($k = 0; $k <= 15; $k++) { //取上一步的索引值
$jdnm[$k] = $tjd[$j - 1 + $k]; //重排索引,使含冬至朔望月的索引為0
}
return (array)$jdnm;
}
/**
* 將公历时间转换为儒略日历时间
* @param int $yy
* @param int $mm
* @param int $dd
* @param int $hh [0-23]
* @param int $mt [0-59]
* @param int $ss [0-59]
* @return boolean|number
*/
private function Solar2Julian($yy, $mm, $dd, $hh=0, $mt=0, $ss=0) {
if(! $this->ValidDate($yy, $mm, $dd)){
return false;
}
if($hh < 0 || $hh >= 24){
return false;
}
if($mt < 0 || $mt >= 60){
return false;
}
if($ss < 0 || $ss >= 60){
return false;
} $yp = $yy + floor(($mm - 3) / 10);
if (($yy > 1582) || ($yy == 1582 && $mm > 10) || ($yy == 1582 && $mm == 10 && $dd >= 15)) { //这一年有十天是不存在的
$init = 1721119.5;
$jdy = floor($yp * 365.25) - floor($yp / 100) + floor($yp / 400);
}
if (($yy < 1582) || ($yy == 1582 && $mm < 10) || ($yy == 1582 && $mm == 10 && $dd <= 4)) {
$init = 1721117.5;
$jdy = floor($yp * 365.25);
}
if(! $init){
return false;
}
$mp = floor($mm + 9) % 12;
$jdm = $mp * 30 + floor(($mp + 1) * 34 / 57);
$jdd = $dd - 1;
$jdh = ($hh + ($mt + ($ss / 60))/60) / 24;
return $jdy + $jdm + $jdd + $jdh + $init;
}
/**
* 判断公历日期是否有效
* @param int $yy
* @param int $mm
* @param int $dd
* @return boolean
*/
public function ValidDate($yy, $mm, $dd) {
if ($yy < -1000 || $yy > 3000) { //适用于西元-1000年至西元3000年,超出此范围误差较大
return false;
} if ($mm < 1 || $mm > 12) { //月份超出範圍
return false;
} if ($yy == 1582 && $mm == 10 && $dd >= 5 && $dd < 15) { //这段日期不存在.所以1582年10月只有20天
return false;
} $ndf1 = -($yy % 4 == 0); //可被四整除
$ndf2 = (($yy % 400 == 0) - ($yy % 100 == 0)) && ($yy > 1582);
$ndf = $ndf1 + $ndf2;
$dom = 30 + ((abs($mm - 7.5) + 0.5) % 2) - intval($mm == 2) * (2 + $ndf);
if ($dd <= 0 || $dd > $dom) {
if ($ndf == 0 && $mm == 2 && $dd == 29) { //此年無閏月 } else { //日期超出範圍 }
return false;
} return true;
}
/**
* 获取公历某个月有多少天
* @param int $yy
* @param int $mm
* @return number
*/
public function GetSolarDays($yy, $mm){
if ($yy < -1000 || $yy > 3000) { //适用于西元-1000年至西元3000年,超出此范围误差较大
return 0;
} if ($mm < 1 || $mm > 12) { //月份超出範圍
return 0;
}
$ndf1 = -($yy % 4 == 0); //可被四整除
$ndf2 = (($yy % 400 == 0) - ($yy % 100 == 0)) && ($yy > 1582);
$ndf = $ndf1 + $ndf2;
return 30 + ((abs($mm - 7.5) + 0.5) % 2) - intval($mm == 2) * (2 + $ndf);
}
/**
* 获取农历某个月有多少天
* @param int $yy
* @param int $mm
* @param bool $isLeap
* @return number
*/
public function GetLunarDays($yy, $mm, $isLeap){
if ($yy < -1000 || $yy > 3000) { //适用于西元-1000年至西元3000年,超出此范围误差较大
return 0;
}
if ($mm < 1 || $mm > 12){ //輸入月份必須在1-12月之內
return 0;
}
list($jdzq, $jdnm, $mc) = $this->GetZQandSMandLunarMonthCode($yy); $leap = 0; //若閏月旗標為0代表無閏月
for ($j = 1; $j <= 14; $j++) { //確認指定年前一年11月開始各月是否閏月
if ($mc[$j] - floor($mc[$j]) > 0) { //若是,則將此閏月代碼放入閏月旗標內
$leap = floor($mc[$j] + 0.5); //leap=0對應阴曆11月,1對應阴曆12月,2對應阴曆隔年1月,依此類推.
break;
}
} $mm = $mm + 2; //11月對應到1,12月對應到2,1月對應到3,2月對應到4,依此類推 for ($i = 0; $i <= 14; $i++) { //求算阴曆各月之大小,大月30天,小月29天
$nofd[$i] = floor($jdnm[$i + 1] + 0.5) - floor($jdnm[$i] + 0.5); //每月天數,加0.5是因JD以正午起算
} $dy = 0; //当月天数
$er = 0; //若輸入值有錯誤,er值將被設定為非0 if ($isLeap){ //若是閏月
if ($leap < 3) { //而旗標非閏月或非本年閏月,則表示此年不含閏月.leap=0代表無閏月,=1代表閏月為前一年的11月,=2代表閏月為前一年的12月
$er = 1; //此年非閏年
} else { //若本年內有閏月
if ($leap != $mm) { //但不為輸入的月份
$er = 2; //則此輸入的月份非閏月,此月非閏月
} else { //若輸入的月份即為閏月
$dy = $nofd[$mm];
}
}
} else { //若沒有勾選閏月則
if ($leap == 0) { //若旗標非閏月,則表示此年不含閏月(包括前一年的11月起之月份)
$dy = $nofd[$mm - 1];
} else { //若旗標為本年有閏月(包括前一年的11月起之月份) 公式nofd(mx - (mx > leap) - 1)的用意為:若指定月大於閏月,則索引用mx,否則索引用mx-1
$dy = $nofd[$mm + ($mm > $leap) - 1];
}
}
return (int)$dy;
}
/**
* 获取农历某年的闰月,0为无闰月
* @param int $yy
* @return number
*/
public function GetLeap($yy){
list($jdzq, $jdnm, $mc) = $this->GetZQandSMandLunarMonthCode($yy); $leap = 0; //若閏月旗標為0代表無閏月
for ($j = 1; $j <= 14; $j++) { //確認指定年前一年11月開始各月是否閏月
if ($mc[$j] - floor($mc[$j]) > 0) { //若是,則將此閏月代碼放入閏月旗標內
$leap = floor($mc[$j] + 0.5); //leap=0對應阴曆11月,1對應阴曆12月,2對應阴曆隔年1月,依此類推.
break;
}
}
return max(0, $leap-2);
}
/**
* 根据公历月日计算星座下标
* @param int $mm
* @param int $dd
* @return int|false
*/
public function GetZodiac($mm, $dd) {
if($mm < 1 || $mm > 12){
return false;
}
if($dd < 1 || $dd > 31){
return false;
} $dds = array(20,19,21,20,21,22,23,23,23,24,22,22); //星座的起始日期 $kn = $mm - 1; //下标从0开始 if ($dd < $dds[$kn]){ //如果早于该星座起始日期,则往前一个
$kn = (($kn + 12) - 1) % 12; //确保是正数
}
return (int)$kn;
}
/**
* 计算公历的某天是星期几(PHP中的date方法,此处演示儒略日历的转换作用)
* @param int $yy
* @param int $mm
* @param int $dd
*/
public function GetWeek($yy, $mm, $dd){
if(! $jd = $this->Solar2Julian($yy, $mm, $dd, 12)){ //当天12点计算(因为儒略日历是中午12点为起始点)
return false;
} return (((floor($jd+1) % 7)) + 7) % 7; //模數(或餘數)為0代表星期日(因为西元前4713年1月1日12時为星期一).jd加1是因起始日為星期一
}
/**
* 将农历时间转换成公历时间
* @param int $yy
* @param int $mm
* @param int $dd
* @param int $isLeap 是否闰月
* @return false/array(年,月,日)
*/
public function Lunar2Solar($yy, $mm, $dd, $isLeap) {
if ($yy < -7000 || $yy > 7000) { //超出計算能力
return false;
}
if ($yy < -1000 || $yy > 3000) { //适用于西元-1000年至西元3000年,超出此范围误差较大
return false;
}
if ($mm < 1 || $mm > 12){ //輸入月份必須在1-12月之內
return false;
}
if ($dd < 1 || $dd > 30) { //輸入日期必須在1-30日之內
return false;
} list($jdzq, $jdnm, $mc) = $this->GetZQandSMandLunarMonthCode($yy); $leap = 0; //若閏月旗標為0代表無閏月
for ($j = 1; $j <= 14; $j++) { //確認指定年前一年11月開始各月是否閏月
if ($mc[$j] - floor($mc[$j]) > 0) { //若是,則將此閏月代碼放入閏月旗標內
$leap = floor($mc[$j] + 0.5); //leap=0對應阴曆11月,1對應阴曆12月,2對應阴曆隔年1月,依此類推.
break;
}
} $mm = $mm + 2; //11月對應到1,12月對應到2,1月對應到3,2月對應到4,依此類推 for ($i = 0; $i <= 14; $i++) { //求算阴曆各月之大小,大月30天,小月29天
$nofd[$i] = floor($jdnm[$i + 1] + 0.5) - floor($jdnm[$i] + 0.5); //每月天數,加0.5是因JD以正午起算
} $jd = 0; //儒略日历时间
$er = 0; //若輸入值有錯誤,er值將被設定為非0 if ($isLeap){ //若是閏月
if ($leap < 3) { //而旗標非閏月或非本年閏月,則表示此年不含閏月.leap=0代表無閏月,=1代表閏月為前一年的11月,=2代表閏月為前一年的12月
$er = 1; //此年非閏年
} else { //若本年內有閏月
if ($leap != $mm) { //但不為輸入的月份
$er = 2; //則此輸入的月份非閏月,此月非閏月
} else { //若輸入的月份即為閏月
if ($dd <= $nofd[$mm]) { //若輸入的日期不大於當月的天數
$jd = $jdnm[$mm] + $dd - 1; //則將當月之前的JD值加上日期之前的天數
} else { //日期超出範圍
$er = 3;
}
}
}
} else { //若沒有勾選閏月則
if ($leap == 0) { //若旗標非閏月,則表示此年不含閏月(包括前一年的11月起之月份)
if ($dd <= $nofd[$mm - 1]) { //若輸入的日期不大於當月的天數
$jd = $jdnm[$mm - 1] + $dd - 1; //則將當月之前的JD值加上日期之前的天數
} else { //日期超出範圍
$er = 4;
}
} else { //若旗標為本年有閏月(包括前一年的11月起之月份) 公式nofd(mx - (mx > leap) - 1)的用意為:若指定月大於閏月,則索引用mx,否則索引用mx-1
if ($dd <= $nofd[$mm + ($mm > $leap) - 1]) { //若輸入的日期不大於當月的天數
$jd = $jdnm[$mm + ($mm > $leap) - 1] + $dd - 1; //則將當月之前的JD值加上日期之前的天數
} else { //日期超出範圍
$er = 4;
}
}
} return $er ? false : array_slice($this->Julian2Solar($jd), 0, 3);
}
/**
* 将公历时间转换成农历时间
* @param int $yy
* @param int $mm
* @param int $dd
* @return array(年,月,日,是否闰月)
*/
public function Solar2Lunar($yy, $mm, $dd) {
if (! $this->ValidDate($yy, $mm, $dd)) { //驗證輸入日期的正確性
return false;
} $prev = 0; //是否跨年了,跨年了则减一
$isLeap = 0;//是否闰月 list($jdzq, $jdnm, $mc) = $this->GetZQandSMandLunarMonthCode($yy); $jd = $this->Solar2Julian($yy, $mm, $dd, 12, 0, 0); //求出指定年月日之JD值
if (floor($jd) < floor($jdnm[0] + 0.5)) {
$prev = 1;
list($jdzq, $jdnm, $mc) = $this->GetZQandSMandLunarMonthCode($yy - 1);
}
for ($i = 0; $i <= 14; $i++) { //指令中加0.5是為了改為從0時算起而不從正午算起
if (floor($jd) >= floor($jdnm[$i] + 0.5) && floor($jd) < floor($jdnm[$i + 1] + 0.5)) {
$mi = $i;
break;
}
} if ($mc[$mi] < 2 || $prev == 1) { //年
$yy = $yy - 1;
} if (($mc[$mi] - floor($mc[$mi])) * 2 + 1 != 1) { //因mc(mi)=0對應到前一年阴曆11月,mc(mi)=1對應到前一年阴曆12月,mc(mi)=2對應到本年1月,依此類推
$isLeap = 1;
}
$mm = (floor($mc[$mi] + 10) % 12) + 1; //月 $dd = floor($jd) - floor($jdnm[$mi] + 0.5) + 1; //日,此處加1是因為每月初一從1開始而非從0開始 $start = 1901;
$end = $yy;
$x = ($start - $end) % 12;
$value = "";
if ($x == 1 || $x == -11) {$value = "鼠";}
if ($x == 0) { $value = "牛";}
if ($x == 11 || $x == -1) {$value = "虎";}
if ($x == 10 || $x == -2) {$value = "兔";}
if ($x == 9 || $x == -3) {$value = "龙";}
if ($x == 8 || $x == -4) {$value = "蛇";}
if ($x == 7 || $x == -5) {$value = "马";}
if ($x == 6 || $x == -6) {$value = "羊";}
if ($x == 5 || $x == -7) {$value = "猴";}
if ($x == 4 || $x == -8) {$value = "鸡";}
if ($x == 3 || $x == -9) {$value = "狗";}
if ($x == 2 || $x == -10) {$value = "猪";} return array($yy, $mm, $dd, $isLeap,$value);
}
/**
* 求出含某公历年立春點開始的24节气
* @param int $yy
* @return array jq[($k+21)%24]
*/
public function Get24JieQi($yy) { $jq = array(); $dj = $this->GetAdjustedJQ($yy - 1, 21, 23); //求出含指定年立春開始之3個節氣JD值,以前一年的年值代入
foreach ($dj as $k => $v){
if($k < 21){
continue;
}
if($k > 23){
continue;
}
$jq[] = $this->Julian2Solar($dj[$k]); //21立春;22雨水;23惊蛰
} $dj = $this->GetAdjustedJQ($yy, 0, 20); //求出指定年節氣之JD值,從春分開始
foreach ($dj as $k => $v){
$jq[] = $this->Julian2Solar($dj[$k]);
} return (array)$jq;
}
/**
* 四柱計算,分早子时晚子时,传公历
* @param int $yy
* @param int $mm
* @param int $dd
* @param int $hh 时间(0-23)
* @param int $mt 分钟数(0-59),在跨节的时辰上会需要,有的排盘忽略了跨节
* @param int $ss 秒数(0-59)
* @return array(天干, 地支, 对应的儒略日历时间, 对应年的12节+前后N节, 对应时间所处节的索引)
*/
public function GetGanZhi($yy, $mm, $dd, $hh, $mt=0, $ss=0){
if(! $jd = $this->Solar2Julian($yy, $mm, $dd, $hh, $mt, max(1, $ss))){ //多加一秒避免精度问题
return array();
} $tg = $dz = array(); $jq = $this->GetPureJQsinceSpring($yy); //取得自立春開始的节,该数组长度固定为16
if ($jd < $jq[1]) { //jq[1]為立春,約在2月5日前後,
$yy = $yy - 1; //若小於jq[1],則屬於前一個節氣年
$jq = $this->GetPureJQsinceSpring($yy); //取得自立春開始的节
} $ygz = (($yy + 4712 + 24) % 60 + 60) % 60;
$tg[0] = $ygz % 10; //年干
$dz[0] = $ygz % 12; //年支 for ($j = 0; $j <= 15; $j++) { //比較求算節氣月,求出月干支
if ($jq[$j] >= $jd) { //已超過指定時刻,故應取前一個節氣
$ix = $j-1;
break;
}
} $tmm = (($yy + 4712) * 12 + ($ix - 1) + 60) % 60; //数组0为前一年的小寒所以这里再减一
$mgz = ($tmm + 50) % 60;
$tg[1] = $mgz % 10; //月干
$dz[1] = $mgz % 12; //月支 $jda = $jd + 0.5; //計算日柱之干支,加0.5是將起始點從正午改為從0點開始.
$thes = (($jda - floor($jda)) * 86400) + 3600; //將jd的小數部份化為秒,並加上起始點前移的一小時(3600秒),取其整數值
$dayjd = floor($jda) + $thes / 86400; //將秒數化為日數,加回到jd的整數部份
$dgz = (floor($dayjd + 49) % 60 + 60) % 60;
$tg[2] = $dgz % 10; //日干
$dz[2] = $dgz % 12; //日支
if($this->zwz && ($hh >= 23)){ //区分早晚子时,日柱前移一柱
$tg[2] = ($tg[2] + 10 - 1) % 10;
$dz[2] = ($dz[2] + 12 - 1) % 12;
} $dh = $dayjd * 12; //計算時柱之干支
$hgz = (floor($dh + 48) % 60 + 60) % 60;
$tg[3] = $hgz % 10; //時干
$dz[3] = $hgz % 12; //時支 return array($tg, $dz, $jd, $jq, $ix);
} /**
* 公历年排盘
* @param int $gd 0男1女
* @param int $yy
* @param int $mm
* @param int $dd
* @param int $hh 时间(0-23)
* @param int $mt 分钟数(0-59),在跨节的时辰上会需要,有的排盘忽略了跨节
* @param int $ss 秒数(0-59)
* @return array
*/
public function GetInfo($gd, $yy, $mm, $dd, $hh, $mt=0, $ss=0){
if(! in_array($gd, array(0,1))){
return array();
} $ret = array();
$big_tg = $big_dz = array(); //大运 list($tg, $dz, $jd, $jq, $ix) = $this->GetGanZhi($yy, $mm, $dd, $hh, $mt, $ss); $pn = $tg[0] % 2; //起大运.阴阳年干:0阳年1阴年 if(($gd == 0 && $pn == 0) || ($gd == 1 && $pn == 1)) { //起大运时间,阳男阴女顺排
$span = $jq[$ix + 1] - $jd; //往后数一个节,计算时间跨度 for($i = 1; $i <= 12; $i++){ //大运干支
$big_tg[] = ($tg[1] + $i) % 10;
$big_dz[] = ($dz[1] + $i) % 12;
}
} else { // 阴男阳女逆排,往前数一个节
$span = $jd - $jq[$ix]; for($i = 1; $i <= 12; $i++){ //确保是正数
$big_tg[] = ($tg[1] + 20 - $i) % 10;
$big_dz[] = ($dz[1] + 24 - $i) % 12;
}
} $days = intval($span * 4 * 30); //折合成天数:三天折合一年,一天折合四个月,一个时辰折合十天,一个小时折合五天,反推得到一年按360天算,一个月按30天算
$y = intval($days / 360); //三天折合一年
$m = intval($days % 360 / 30); //一天折合四个月
$d = intval($days % 360 % 30); //一个小时折合五天 $ret['tg'] = $tg;
$ret['dz'] = $dz;
$ret['big_tg'] = $big_tg;
$ret['big_dz'] = $big_dz;
$ret['start_desc'] = "{$y}年{$m}月{$d}天起运";
$start_jdtime = $jd + $span * 120; //三天折合一年,一天折合四个月,一个时辰折合十天,一个小时折合五天,反推得到一年按360天算
$ret['start_time'] = $this->Julian2Solar($start_jdtime); //转换成公历形式,注意这里变成了数组 $ret['bazi'] = $ret['big'] = $ret['years'] = ''; //八字,大运,流年的字符表示
$ret['big_start_time'] = array(); //各步大运的起始时间 $ret['xz'] = $this->cxz[$this->GetZodiac($mm, $dd)]; //星座
$ret['sx'] = $this->csa[$dz[0]]; //生肖 for($i = 0; $i <= 3; $i++){
$ret['bazi'] .= $this->ctg[$tg[$i]];
$ret['bazi'] .= $this->cdz[$dz[$i]];
} for($i = 0; $i < 12; $i++){
$ret['big'] .= $this->ctg[$big_tg[$i]];
$ret['big'] .= $this->cdz[$big_dz[$i]];
$ret['big_start_time'][] = $this->Julian2Solar($start_jdtime + $i*10*360);
} for($i=1,$j=0; ;$i++){
if(($yy + $i) < $ret['start_time'][0]){ //还没到起运年
continue;
}
if($j++ >= 120){
break;
} $t = ($tg[1] + $i) % 10;
$d = ($dz[1] + $i) % 12; $ret['years'] .= $this->ctg[$t];
$ret['years'] .= $this->cdz[$d];
if($j%10 == 0){
$ret['years'] .= "\n";
}
} return (array)$ret;
}
} // public function Solar2Lunar($yy, $mm, $dd) { $paihang = new paipan();
$date = $paihang->Solar2Lunar('1990','12','26');
//$date = $paihang->Solar2Lunar('2010','2','1');
//$date = $paihang->Solar2Lunar('2019','2','4');
//$date = $paihang->Solar2Lunar('1969','5','22'); //public function GetGanZhi($yy, $mm, $dd, $hh, $mt=0, $ss=0){ //$date = $paihang->GetGanZhi('1969','5','22','11'); //public function GetInfo($gd, $yy, $mm, $dd, $hh, $mt=0, $ss=0){ //$date = $paihang->GetInfo(1,'1969','5','22','11'); echo '<pre>';
print_r($date);

PHP 农历公历互转,八字排盘,星座,日历,支持从-1000到3000年间的排盘,二十四节气的更多相关文章

  1. 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记

    暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题.资料,群里分享 developing environment:ubuntu 关于u盘启动自己做的操 ...

  2. 大白菜U盘启动制作工具装机维护版V5.0–大白菜U盘下载中心

    大白菜U盘启动制作工具装机维护版V5.0–大白菜U盘下载中心   大白菜U盘启动制作工具装机维护版V5.0

  3. 分区助手里如何从临近盘(如D盘)抽取一定的空间给已经快满了的盘(如E盘)(博主推荐)(图文详解)

    不多说,直接上干货! 分区助手是什么?(博主推荐)(图文详解) 分区助手各版本比较(图文详解) 分区助手官网使用教程(专业版.绿色版和WinPE版)(图文详解) 安装分区助手时出现“分区助手已安装到你 ...

  4. APS高级计划排程系统应该支持的企业应用场景

    APS高级计划排程系统应该支持的企业应用场景 面对工业4.0智能制造的挑战,很多企业希望能够引进APS高级计划排程系统,全自动的.快速的制定精细化的生产计划,准确的计算产线/设备上各种产品型号的加工顺 ...

  5. WinSetupFromUSB - 超简单制作多合一系统安装启动U盘的工具 (支持Win/PE/Linux启动盘)

    很多同学都喜欢将电脑凌乱不堪的系统彻底重装以获得一个"全新的开始",但你会发现如今很多电脑都已经没有光驱了,因此制作一个U盘版的系统安装启动盘备用是非常必要的. 我们之前推荐过 I ...

  6. 还在用慢的要死的百度网盘?来试试这款12.5M下载速度的免费网盘吧!

    我们都知道云存储,如谷歌云端硬盘,苹果的icloud, 微软的OneDrive. 它们是用于数据备份和与多设备同步的云存储. 虽然它被广泛使用,但是还是有一些缺点,以谷歌云端硬盘为例: 1. 如果你需 ...

  7. 免费网盘!无限申请5TB容量并且不限速的网盘!

    鸽了好久没有更新博客了哎…… 前言 这里我先说一下下,本人深受百度网盘坑害,自己上传的文件,16GB下载花了3天时间 最后下载失败? 所以找到的一个新的储存个人文件的方法. 这个网盘是onedrive ...

  8. 制作支持UEFI PC的Server2008 R2系统安装U盘

    下载R2系统 ISO ed2k://|file|cn_windows_server_2008_r2_standard_enterprise_datacenter_and_web_with_sp1_x6 ...

  9. 非常有用的GitHub链接

    平常开发工作中,我经常取Github上搜索项目,Clone下来学习使用,在这个过程中,发现了好多比较好的Github地址,记录下来,分享出去. image 非常有用的GitHub链接(顺序不分先后): ...

随机推荐

  1. 甘特图dhtmlx Gantt入门

    (以下截图来自别人的博客,来源地址已经忘记了,若后期找到会补充上来!) API地址:https://docs.dhtmlx.com/gantt/desktop__guides.html,这是英文的网页 ...

  2. .gitignore文件的配置和生效

    1.配置 a)确保.gitignore文件和.git文件夹在同级目录 b)配置语法 # # 此为注释 – 将被 Git 忽略 *.a # 忽略所有 .a 结尾的文件 !lib.a # 但 lib.a ...

  3. OO第一次博客作业--第一单元总结

    OO第一单元总结 面向对象设计与构造的第一单元,对“面向对象”的概念还根本不理解不熟悉,只觉得需要“分模块”,但不知道怎么分,分多少模块,怎么根据需要的模块的功能建立类.学习的进度又太慢,根本跟不上出 ...

  4. C# DataTable 转 实体类

    C# 中查询结果DataTable转实体类: 比如:List<RtmInterview> rtmList = GetDataById( id); public List<RtmInt ...

  5. kubernetes in action - Volumes

    Volume解决Kubernetes的存储的问题 对于Pod使用的存储,抽象为volume,volume伴随着Pod的创建而创建,消失而同时消失,不能单独的创建 这样的好处,是存储的塑胶不会因为某个c ...

  6. RMAN备份filesperset用法

    用filesperset控制备份集的尺寸 当指定filesperset参数时,rman比较filesperset与自动计算出来的值(对每个已分配通道的文件数目) 并取其中较小的那个值来保证所有的通道被 ...

  7. python生成excel测试数据

    在功能测试时,经常会测到excel文件导入导出的功能,导入与导出时,需要测试系统单次导入大批量数据时是否正常, 如果系统承受不起太大的数据导入,则需要开发限制单次导入的数量,以防止系统服务异常.大量的 ...

  8. webpack摸索笔记

    上一个链接,入门webpack看这篇文章最好:https://segmentfault.com/a/1190000006178770 1.先安装好node 2.建个项目文件 3,.window+r,打 ...

  9. 有几个PAT

    描述 字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T):第二个PAT是第3位(P),第4位(A),第6位(T). 现给定字符串,问一共可以形成多 ...

  10. Random-Forest-Python

    1. 近期目标,实现随机森林进行点云分类 1)学习阶段: [干货]Kaggle 数据挖掘比赛经验分享 Kaggle Machine Learning Competition: Predicting T ...