Latest News
Đẩy log exception của spring boot lên elasticsearch
  • About
  • EmEditor
  • Register Google Adsense

Love Coding

Note anything I want

  • Home
  • Web Development
    • HTML
    • Javascript
    • jQuery
    • CSS
    • PHP
    • ASP
    • JSP
    • Fix Bug
  • Other Development
    • Desktop Java
    • Mobile J2ME
    • VBS
  • Operating System
    • Windows
    • Linux
  • Database
    • MySQL
    • Oracle
  • Software
Home » PHP » Love Coding: Hàm chuyển từ ngày dương lịch sang âm lịch (PHP)

Hàm chuyển từ ngày dương lịch sang âm lịch (PHP)

HuyPV
Add Comment
PHP
Monday, November 2, 2009
<?php
function INT($d) {
    return floor($d);
}

function jdFromDate($dd, $mm, $yy) {
    $a = INT((14 - $mm) / 12);
    $y = $yy + 4800 - $a;
    $m = $mm + 12 * $a - 3;
    $jd = $dd + INT((153 * $m + 2) / 5) + 365 * $y + INT($y / 4) - INT($y / 100) + INT($y / 400) - 32045;
    if ($jd < 2299161) {
        $jd = $dd + INT((153* $m + 2)/5) + 365 * $y + INT($y / 4) - 32083;
    }
    return $jd;
}

function jdToDate($jd) {
    if ($jd > 2299160) { // After 5/10/1582, Gregorian calendar
        $a = $jd + 32044;
        $b = INT((4*$a+3)/146097);
        $c = $a - INT(($b*146097)/4);
    } else {
        $b = 0;
        $c = $jd + 32082;
    }
    $d = INT((4*$c+3)/1461);
    $e = $c - INT((1461*$d)/4);
    $m = INT((5*$e+2)/153);
    $day = $e - INT((153*$m+2)/5) + 1;
    $month = $m + 3 - 12*INT($m/10);
    $year = $b*100 + $d - 4800 + INT($m/10);
    //echo "day = $day, month = $month, year = $year\n";
    return array($day, $month, $year);
}

function getNewMoonDay($k, $timeZone) {
    $T = $k/1236.85; // Time in Julian centuries from 1900 January 0.5
    $T2 = $T * $T;
    $T3 = $T2 * $T;
    $dr = M_PI/180;
    $Jd1 = 2415020.75933 + 29.53058868*$k + 0.0001178*$T2 - 0.000000155*$T3;
    $Jd1 = $Jd1 + 0.00033*sin((166.56 + 132.87*$T - 0.009173*$T2)*$dr); // Mean new moon
    $M = 359.2242 + 29.10535608*$k - 0.0000333*$T2 - 0.00000347*$T3; // Sun's mean anomaly
    $Mpr = 306.0253 + 385.81691806*$k + 0.0107306*$T2 + 0.00001236*$T3; // Moon's mean anomaly
    $F = 21.2964 + 390.67050646*$k - 0.0016528*$T2 - 0.00000239*$T3; // Moon's argument of latitude
    $C1=(0.1734 - 0.000393*$T)*sin($M*$dr) + 0.0021*sin(2*$dr*$M);
    $C1 = $C1 - 0.4068*sin($Mpr*$dr) + 0.0161*sin($dr*2*$Mpr);
    $C1 = $C1 - 0.0004*sin($dr*3*$Mpr);
    $C1 = $C1 + 0.0104*sin($dr*2*$F) - 0.0051*sin($dr*($M+$Mpr));
    $C1 = $C1 - 0.0074*sin($dr*($M-$Mpr)) + 0.0004*sin($dr*(2*$F+$M));
    $C1 = $C1 - 0.0004*sin($dr*(2*$F-$M)) - 0.0006*sin($dr*(2*$F+$Mpr));
    $C1 = $C1 + 0.0010*sin($dr*(2*$F-$Mpr)) + 0.0005*sin($dr*(2*$Mpr+$M));
    if ($T < -11) {
        $deltat= 0.001 + 0.000839*$T + 0.0002261*$T2 - 0.00000845*$T3 - 0.000000081*$T*$T3;
    } else {
        $deltat= -0.000278 + 0.000265*$T + 0.000262*$T2;
    };
    $JdNew = $Jd1 + $C1 - $deltat;
    //echo "JdNew = $JdNew\n";
    return INT($JdNew + 0.5 + $timeZone/24);
}

function getSunLongitude($jdn, $timeZone) {
    $T = ($jdn - 2451545.5 - $timeZone/24) / 36525; // Time in Julian centuries from 2000-01-01 12:00:00 GMT
    $T2 = $T * $T;
    $dr = M_PI/180; // degree to radian
    $M = 357.52910 + 35999.05030*$T - 0.0001559*$T2 - 0.00000048*$T*$T2; // mean anomaly, degree
    $L0 = 280.46645 + 36000.76983*$T + 0.0003032*$T2; // mean longitude, degree
    $DL = (1.914600 - 0.004817*$T - 0.000014*$T2)*sin($dr*$M);
    $DL = $DL + (0.019993 - 0.000101*$T)*sin($dr*2*$M) + 0.000290*sin($dr*3*$M);
    $L = $L0 + $DL; // true longitude, degree
    //echo "\ndr = $dr, M = $M, T = $T, DL = $DL, L = $L, L0 = $L0\n";
    $L = $L*$dr;
    $L = $L - M_PI*2*(INT($L/(M_PI*2))); // Normalize to (0, 2*PI)
    return INT($L/M_PI*6);
}

function getLunarMonth11($yy, $timeZone) {
    $off = jdFromDate(31, 12, $yy) - 2415021;
    $k = INT($off / 29.530588853);
    $nm = getNewMoonDay($k, $timeZone);
    $sunLong = getSunLongitude($nm, $timeZone); // sun longitude at local midnight
    if ($sunLong >= 9) {
        $nm = getNewMoonDay($k-1, $timeZone);
    }
    return $nm;
}

function getLeapMonthOffset($a11, $timeZone) {
    $k = INT(($a11 - 2415021.076998695) / 29.530588853 + 0.5);
    $last = 0;
    $i = 1; // We start with the month following lunar month 11
    $arc = getSunLongitude(getNewMoonDay($k + $i, $timeZone), $timeZone);
    do {
        $last = $arc;
        $i = $i + 1;
        $arc = getSunLongitude(getNewMoonDay($k + $i, $timeZone), $timeZone);
    } while ($arc != $last && $i < 14);
    return $i - 1;
}

/* Comvert solar date dd/mm/yyyy to the corresponding lunar date */
function convertSolar2Lunar($dd, $mm, $yy, $timeZone) {
    $dayNumber = jdFromDate($dd, $mm, $yy);
    $k = INT(($dayNumber - 2415021.076998695) / 29.530588853);
    $monthStart = getNewMoonDay($k+1, $timeZone);
    if ($monthStart > $dayNumber) {
        $monthStart = getNewMoonDay($k, $timeZone);
    }
    $a11 = getLunarMonth11($yy, $timeZone);
    $b11 = $a11;
    if ($a11 >= $monthStart) {
        $lunarYear = $yy;
        $a11 = getLunarMonth11($yy-1, $timeZone);
    } else {
        $lunarYear = $yy+1;
        $b11 = getLunarMonth11($yy+1, $timeZone);
    }
    $lunarDay = $dayNumber - $monthStart + 1;
    $diff = INT(($monthStart - $a11)/29);
    $lunarLeap = 0;
    $lunarMonth = $diff + 11;
    if ($b11 - $a11 > 365) {
        $leapMonthDiff = getLeapMonthOffset($a11, $timeZone);
        if ($diff >= $leapMonthDiff) {
            $lunarMonth = $diff + 10;
            if ($diff == $leapMonthDiff) {
                $lunarLeap = 1;
            }
        }
    }
    if ($lunarMonth > 12) {
        $lunarMonth = $lunarMonth - 12;
    }
    if ($lunarMonth >= 11 && $diff < 4) {
        $lunarYear -= 1;
    }
    return array($lunarDay, $lunarMonth, $lunarYear, $lunarLeap);
}

/* Convert a lunar date to the corresponding solar date */
function convertLunar2Solar($lunarDay, $lunarMonth, $lunarYear, $lunarLeap, $timeZone) {
    if ($lunarMonth < 11) {
        $a11 = getLunarMonth11($lunarYear-1, $timeZone);
        $b11 = getLunarMonth11($lunarYear, $timeZone);
    } else {
        $a11 = getLunarMonth11($lunarYear, $timeZone);
        $b11 = getLunarMonth11($lunarYear+1, $timeZone);
    }
    $k = INT(0.5 + ($a11 - 2415021.076998695) / 29.530588853);
    $off = $lunarMonth - 11;
    if ($off < 0) {
        $off += 12;
    }
    if ($b11 - $a11 > 365) {
        $leapOff = getLeapMonthOffset($a11, $timeZone);
        $leapMonth = $leapOff - 2;
        if ($leapMonth < 0) {
            $leapMonth += 12;
        }
        if ($lunarLeap != 0 && $lunarMonth != $leapMonth) {
            return array(0, 0, 0);
        } else if ($lunarLeap != 0 || $off >= $leapOff) {
            $off += 1;
        }
    }
    $monthStart = getNewMoonDay($k + $off, $timeZone);
    return jdToDate($monthStart + $lunarDay - 1);
}

function alhn() {
    $arr = array_slice(convertSolar2Lunar(date('d'), date('m'), date('Y'), 7), 0, 3);
    $arr[0] = str_pad($arr[0], 2, '0', STR_PAD_LEFT);
    $arr[1] = str_pad($arr[1], 2, '0', STR_PAD_LEFT);
    return implode("/", $arr);
}

// Âm lịch ngày hôm nay là
echo alhn();
?>
Tweet
Hàm chuyển từ ngày dương lịch sang âm lịch (PHP) Title: Hàm chuyển từ ngày dương lịch sang âm lịch (PHP)
Description: <?php function INT($d) {     return floor($d); } function jdFromDate($dd, $mm, $yy) {     $a = INT((14 - $mm) / 12);     $y = $yy + 4800 ... ...
Rating: 4

1 comment :

  1. me09112001January 25, 2020 at 12:40 PM

    Cảm ơn bạn đã chia sẻ! Chúc mừng năm mới!

    ReplyDelete
    Replies
      Reply
Add comment
Load more...

Newer Post Older Post Home
Subscribe to: Post Comments ( Atom )
Quảng cáo

Popular Posts

  • Check Laravel version
    Đối tác bảo đang code và dùng Laravel, giờ muốn biết version Laravel tương ứng là bao nhiêu để xem mà code theo. Làm sao check? Cách 1: Sử...
  • VBS - Upload file HTTP Post
    Source: http://www.ericphelps.com/scripting/samples/Reference/Web/HTTP_POST.txt   Sub Upload(strUploadUrl, strFilePath, strFileField, strD...
  • Add other collapse div to your forum
    Collapse <div style="height: 16px; padding-right: 4px; font-weight: bold;" class="blockhead"> <span style=...
  • Trong laravel thì queue:work với queue:listen khác nhau thế nào?
    Trong laravel thì queue:work với queue:listen đều chạy jobs trong queue. Vậy 2 cái này cũng phải có gì đó khác nhau chứ, nếu ko thì nó là ...
  • Hàm chuyển từ ngày dương lịch sang âm lịch (PHP)
    <?php function INT($d) {     return floor($d); } function jdFromDate($dd, $mm, $yy) {     $a = INT((14 - $mm) / 12);     $y = $yy + 4800 ...
  • Use the YouTube API with PHP
    Process and integrate data from YouTube into your PHP application with PHP's SimpleXML extension Summary:   The YouTube vide...
  • Character Set và Collation trong MySQL là gì? Tạo DB thì để UTF8_GENERAL_CI hay UTF8_BIN
    Character Set là một tập các ký tự và dạng số hóa của các ký tự đó Collation là một tập các luật để so sánh các xâu được sinh ra từ các ký ...
  • git checkout file from other branch
    Đang làm trên nhánh dev. Muốn lấy 1 file, ví dụ: xxx/helper.php ở trên nhánh master về dev thì làm thế nào? Cách 1: nông dân nhiều bước nh...
  • mysql_error: Undeclared variable: INF
    mysql_error: Undeclared variable: INF PHP Code: $limit = 10; $page = isset($_GET['p']) ? $_GET['p'] : 1; $offset = ($pa...
  • Download media files (video, audio) from VnExpress.Net
    Download media files (video, audio) from VnExpress.Net Example: http://vnexpress.net/GL/Vi-tinh/Giai-tri/2010/02/3BA18A0E/page_4.asp htt...
Back to top!
Copyright 2010 Love Coding - All Rights Reserved Design by Newbie_PC - Powered by Blogger