|
Calendar FunctionsThe calendar extension presents a series of functions to simplify converting between different calendar formats. The intermediary or standard it is based on is the Julian Day Count. The Julian Day Count is a count of days starting from January 1st, 4713 B.C. To convert between calendar systems, you must first convert to Julian Day Count, then to the calendar system of your choice. Julian Day Count is very different from the Julian Calendar! For more information on Julian Day Count, visit » http://www.hermetic.ch/cal_stud/jdn.htm. For more information on calendar systems visit » http://www.fourmilab.ch/documents/calendar/. Excerpts from this page are included in these instructions, and are in quotes.
To get these functions to work, you have to compile PHP with
The windows version of PHP has built in support for this extension. You do not need to load any additional extension in order to use these functions. The constants below are defined by this extension, and will only be available when the extension has either been compiled into PHP or dynamically loaded at runtime.
The following constants are available since PHP 4.3.0 :
The following constants are available since PHP 5.0.0 :
Table of Contents
Code Examples / Notes » ref.calendarcarlj
Why not do something like this, to find the number of days in a month? $monthNum = date("n"); // or any value from 1-12 $year = date("Y"); // or any value >= 1 $numDays = date("t",mktime(0,0,0,$monthNum,1,$year)) This will tell you if there is 28-31 days in a month simon
Well this is the second part, well more the second calendar of Maya the Tikal there is two of them one for long count, one for general date seeding, this is using an implementation of floating point time (roun). <?php $maya = MayanTikalCalendar(time(),0); print_r($maya); $poffset = '2012-12-21 8:24 PM', $pweight = '-1872000.22222222223', $defiency='nonedeficient', $timeset= array("hours" => 24, "minutes" => 60, "seconds" => 60)) { // Code Segment 1 â Calculate Floating Point $tme = $unix_time; if ($gmt>0){ $gmt=-$gmt; } else { $gmt=abs($gmt); } $ptime = strtotime($poffset)+(60*60*gmt); $maya_xa = ($tme)/(24*60*60); $maya_ya = $ptime/(24*60*60); $maya = (($maya_xa -$maya_ya) - $pweight)+(microtime/999999); // Code Segment 2 â Set month day arrays $nonedeficient = array( "seq1" => array(20,20,20,20,20,20,20,20,20, 20,20,20,20,20,20,20,20,20,5)); $monthnames = array("seq1" => array( 'Pop', 'Uo', 'Zip', 'Zot\'z', 'Tzec', 'Xul', 'Yaxkin', 'Mol', 'Ch\'en', 'Yax', 'Zac', 'Ceh', 'Mac', 'Kankin', 'Muan', 'Pax', 'Kayab', 'Cumku', 'Uayeb')); $daynames = array("seq1" => array( 'Imix', 'Ik', 'Akbal', 'Kan', 'Chicchan', 'Cimi','Manik', 'Lamat', 'Muluc', 'Oc', 'Chuen', 'Eb', 'Ben', 'Ix', 'Men', 'Cib', 'Caban', 'Etz\'nab', 'Cauac', 'Ahau')); $monthusage = isset($defiency) ? ${$defiency} : $deficient; // Code Segment 3 â Calculate month number, day numbers etc foreach($monthusage as $key => $item){ $i++; foreach($item as $numdays){ $ttl_num=$ttl_num+$numdays; $ttl_num_months++; } } $revolutionsperyear = $ttl_num / $i; $numyears = (round((floor($maya) / $revolutionsperyear),0)); $avg_num_month = $ttl_num_months/$i; $jtl = abs(abs($maya) - ceil($revolutionsperyear*($numyears+1))); while($month==0){ $day=0; $u=0; foreach($monthusage as $key => $item){ $t=0; foreach($item as $numdays){ $t++; $tt=0; for($sh=1;$sh<=$numdays;$sh++){ $ii=$ii+1; $tt++; if ($ii==floor($jtl)){ if ($maya>0){ $daynum = $tt; $month = $t; } else { $daynum = $numdays-$tt; $month = $avg_num_month-$t; } $sequence = $key; $nodaycount=true; } } if ($nodaycount==false) $day++; } $u++; } } $timer = substr($maya, strpos($maya,'.')+1, strlen($maya)-strpos($maya,'.')-1); $maya_out= $numyears.'/'.$month.'/'.$daynum.' '.$day.'.'. floor(intval(substr($timer,0,2))/100*$timeset['hours']).':'. floor(intval(substr($timer,2,2))/100*$timeset['minutes']).':'. floor(intval(substr($timer,4,2))/100*$timeset['seconds']).'.'. substr($timer,6,strlen($timer)-6); $maya_obj = array( 'longcount'=>MayanLongCount($tme),'year'=>abs($numyears), 'month'=>$month, 'mname' => $monthnames[$sequence][$month-1], 'day'=>$daynum, 'dayname'=>$daynames[$sequence][$daynum-1], 'day'=>$daynum, 'jtl'=>$jtl, 'day_count'=>$day, 'hours'=> floor(intval(substr($timer,0,2))/100 *$timeset['hours']), 'minute'=> floor(intval(substr($timer,2,2))/100 *$timeset['minutes']), 'seconds'=>floor(intval(substr($timer,4,2))/100 *$timeset['seconds']), 'microtime'=>substr($timer,6,strlen($timer)-6), 'strout'=>$maya_out); return $maya_obj; } ?> martin lindhe
To calculate NTP timestamp from unix timestamp: <? function ntptime() { return 2208988800 + time(); } ?> NTP timestamps are represented as a 64-bit unsigned fixed- point number, in seconds relative to 0h on 1 January 1900. simon
This will return the mayan long count calendar which cycle reaches 13.0.0.0.0 in 2012, I have had to compress the changemaya function for this code library so if you want to space it out your more than welcome. It works with unix time. To call the routine use the following syntax. The mayan calendar is a day count that is around 5000 years old, it tracks our cestial position in the galaxy <?php echo MayanLongCount(time()); function MayanLongCount($tme){ $config = array('ppo' => array(13,0,0,0,0), 'epoch' => strtotime('2012-12-21')); $diff=(($tme-$config['epoch'])/(60*60*24)); $ppo = changemaya($config['ppo'],ceil($diff)); return $ppo[0].'.'.$ppo[1].'.'.$ppo[2].'.'.$ppo[3].'.'.$ppo[4]; } function changemaya($ppo,$diff){ if ($diff>0) { $amount=1; } else { $amount=-1; } for ($sh=1;$sh<abs($diff);$sh++){ if ($ppo[4]+$amount>20){ if ($ppo[3]+$amount>20){ if ($ppo[2]+$amount>20){ if ($ppo[1]+$amount>20){ if ($ppo[0]+$amount>20){ $ppo[0]=0; $ppo[1]=0; $ppo[2]=0; $ppo[3]=0; $ppo[4]=0; } else { $ppo[1]=0; $ppo[0]=$ppo[0]+$amount;} } else { $ppo[2]=0; $ppo[1]=$ppo[1]+$amount; } } else {$ppo[3]=0; $ppo[2]=$ppo[2]+$amount; } } else { $ppo[4]=0; $ppo[3]=$ppo[3]+$amount; } } elseif ($ppo[4]+$amount<0){ if ($ppo[3]+$amount<0){ if ($ppo[2]+$amount<0){ if ($ppo[1]+$amount<0){ if ($ppo[0]+$amount<0){ $ppo[0]=20; $ppo[1]=0; $ppo[2]=0; $ppo[3]=0; $ppo[4]=0; } else { $ppo[1]=20; $ppo[0]=$ppo[0]+$amount; } } else { $ppo[2]=20; $ppo[1]=$ppo[1]+$amount; } } else { $ppo[3]=20; $ppo[2]=$ppo[2]+$amount; } } else { $ppo[4]=20; $ppo[3]=$ppo[3]+$amount; } } else { $ppo[4]=$ppo[4]+$amount;}} return $ppo; } ?> Thanks!! mikebabcock
There are two world calculations for the date of Easter. The Easter date function should account for this; one used (generally) by the Western world and one (generally) used by the Eastern (the official date used by the East Orthodox Church).
fray ferguson
The following is a light reimplimentation of some of these functions wich can be used in an include file to work around the lack of --with-calendar in php implimentations. <?php /* IMPLEMENTS SUBSET OF PHP CALENDAR FUNCTIONS ON SYSTEMS COMPILED W/O --enable-calendar */ if (!function_exists('cal_days_in_month')){ function cal_days_in_month($a_null, $a_month, $a_year) { return date('t', mktime(0, 0, 0, $a_month+1, 0, $a_year)); } } if (!function_exists('cal_to_jd')){ function cal_to_jd($a_null, $a_month, $a_day, $a_year){ if ( $a_month <= 2 ){ $a_month = $a_month + 12 ; $a_year = $a_year - 1 ; } $A = intval($a_year/100); $B = intval($A/4) ; $C = 2-$A+$B ; $E = intval(365.25*($a_year+4716)) ; $F = intval(30.6001*($a_month+1)); return intval($C+$a_day+$E+$F-1524) ; } } if (!function_exists('get_jd_dmy')) { function get_jd_dmy($a_jd){ $W = intval(($a_jd - 1867216.25)/36524.25) ; $X = intval($W/4) ; $A = $a_jd+1+$W-$X ; $B = $A+1524 ; $C = intval(($B-122.1)/365.25) ; $D = intval(365.25*$C) ; $E = intval(($B-$D)/30.6001) ; $F = intval(30.6001*$E) ; $a_day = $B-$D-$F ; if ( $E > 13 ) { $a_month=$E-13 ; $a_year = $C-4715 ; } else { $a_month=$E-1 ; $a_year=$C-4716 ; } return array($a_month, $a_day, $a_year) ; } } if (!function_exists('jdmonthname')) { function jdmonthname($a_jd,$a_mode){ $tmp = get_jd_dmy($a_jd) ; $a_time = "$tmp[0]/$tmp[1]/$tmp[2]" ; switch($a_mode) { case 0: return strftime("%b",strtotime("$a_time")) ; case 1: return strftime("%B",strtotime("$a_time")) ; } } } if (!function_exists('jddayofweek')) { function jddayofweek($a_jd,$a_mode){ $tmp = get_jd_dmy($a_jd) ; $a_time = "$tmp[0]/$tmp[1]/$tmp[2]" ; switch($a_mode) { case 1: return strftime("%A",strtotime("$a_time")) ; case 2: return strftime("%a",strtotime("$a_time")) ; default: return strftime("%w",strtotime("$a_time")) ; } } } ?> kmcm
if, like me, you don't have a PHP build that includes the cal functions, you may want to use this function for sorting out leap year. function days_in_feb($year){ //$year must be YYYY //[gregorian] leap year math : if ($year < 0) $year++; $year += 4800; if ( ($year % 4) == 0) { if (($year % 100) == 0) { if (($year % 400) == 0) { return(29); } else { return(28); } } else { return(29); } } else { return(28); } } of course the next leap year isn't until the end of the century but this makes for timeless code I guess ...or if you are using 2000 in your dates or are going far back in time, etc, it is necessary. curlee
I solved a problem with Julian dates that are used in the JD Edwards ERP package (running on AS/400). The Julian format for this system is as follows: CYYDDD Where C is 0 for 1900 and 1 for 2000 DDD is the day of the year count I used the mktime built-in php function to convert dates to the normal DD/MM/YYYY format. This function will convert dates that are between 1970 and 2038 (limitation of unix timestamps and the mktime function) The $jde_date var needs to be a 6 len STRING.... if you use a numeric var type it will drop the leading 0 for any date that represents 1900.... this will botch the substr functions and thus make the whole thing wrong. function jde_date_conv($jde_date) { $ct = substr($jde_date,0,1); $yr = substr($jde_date,1,2); $dy = substr($jde_date,3,3); if($ct == 0) $yr_pfx = 19; if($ct == 1) $yr_pfx = 20; $tlt_yr = $yr_pfx.$yr; $base_time = mktime(0,0,0,1,0,$tlt_yr); $unix_time = ($dy * 86400) + $base_time; return date("m/d/Y" , $unix_time); } david dot scourfield
I created this function a while ago and needed it again recently, so had to trawl through some old files to find it. Thought I'd post it here in case anyone else finds it useful. <?php /* * Function to calculate which days are British bank holidays (England & Wales) for a given year. * * Created by David Scourfield, 07 August 2006, and released into the public domain. * Anybody may use and/or modify this code. * * USAGE: * * array calculateBankHolidays(int $yr) * * ARGUMENTS * * $yr = 4 digit numeric representation of the year (eg 1997). * * RETURN VALUE * * Returns an array of strings where each string is a date of a bank holiday in the format "yyyy-mm-dd". * * See example below * */ function calculateBankHolidays($yr) { $bankHols = Array(); // New year's: switch ( date("w", strtotime("$yr-01-01 12:00:00")) ) { case 6: $bankHols[] = "$yr-01-03"; break; case 0: $bankHols[] = "$yr-01-02"; break; default: $bankHols[] = "$yr-01-01"; } // Good friday: $bankHols[] = date("Y-m-d", strtotime( "+".(easter_days($yr) - 2)." days", strtotime("$yr-03-21 12:00:00") )); // Easter Monday: $bankHols[] = date("Y-m-d", strtotime( "+".(easter_days($yr) + 1)." days", strtotime("$yr-03-21 12:00:00") )); // May Day: if ($yr == 1995) { $bankHols[] = "1995-05-08"; // VE day 50th anniversary year exception } else { switch (date("w", strtotime("$yr-05-01 12:00:00"))) { case 0: $bankHols[] = "$yr-05-02"; break; case 1: $bankHols[] = "$yr-05-01"; break; case 2: $bankHols[] = "$yr-05-07"; break; case 3: $bankHols[] = "$yr-05-06"; break; case 4: $bankHols[] = "$yr-05-05"; break; case 5: $bankHols[] = "$yr-05-04"; break; case 6: $bankHols[] = "$yr-05-03"; break; } } // Whitsun: if ($yr == 2002) { // exception year $bankHols[] = "2002-06-03"; $bankHols[] = "2002-06-04"; } else { switch (date("w", strtotime("$yr-05-31 12:00:00"))) { case 0: $bankHols[] = "$yr-05-25"; break; case 1: $bankHols[] = "$yr-05-31"; break; case 2: $bankHols[] = "$yr-05-30"; break; case 3: $bankHols[] = "$yr-05-29"; break; case 4: $bankHols[] = "$yr-05-28"; break; case 5: $bankHols[] = "$yr-05-27"; break; case 6: $bankHols[] = "$yr-05-26"; break; } } // Summer Bank Holiday: switch (date("w", strtotime("$yr-08-31 12:00:00"))) { case 0: $bankHols[] = "$yr-08-25"; break; case 1: $bankHols[] = "$yr-08-31"; break; case 2: $bankHols[] = "$yr-08-30"; break; case 3: $bankHols[] = "$yr-08-29"; break; case 4: $bankHols[] = "$yr-08-28"; break; case 5: $bankHols[] = "$yr-08-27"; break; case 6: $bankHols[] = "$yr-08-26"; break; } // Christmas: switch ( date("w", strtotime("$yr-12-25 12:00:00")) ) { case 5: $bankHols[] = "$yr-12-25"; $bankHols[] = "$yr-12-28"; break; case 6: $bankHols[] = "$yr-12-27"; $bankHols[] = "$yr-12-28"; break; case 0: $bankHols[] = "$yr-12-26"; $bankHols[] = "$yr-12-27"; break; default: $bankHols[] = "$yr-12-25"; $bankHols[] = "$yr-12-26"; } // Millenium eve if ($yr == 1999) { $bankHols[] = "1999-12-31"; } return $bankHols; } /* * EXAMPLE: * */ header("Content-type: text/plain"); $bankHolsThisYear = calculateBankHolidays(2007); print_r($bankHolsThisYear); ?> Will output this result: Array ( [0] => 2007-01-01 [1] => 2007-04-06 [2] => 2007-04-09 [3] => 2007-05-07 [4] => 2007-05-28 [5] => 2007-08-27 [6] => 2007-12-25 [7] => 2007-12-26 ) jthome
Had a similar problem as curlee, except I needed to create a JDE_ERP date. [format is CYYDDD] <?php function jde_date_create($month, $day, $year){ /* * NOTE: $month and $day CANNOT have leading zeroes, * $year must be'YYYY' format */ $jde_year_prefix = substr($year, 0, 1) - 1; $jde_year_suffix = substr($year, -2); //note that valid years for mktime are 1902-2037 $timestamp = mktime(0,0,0,$month, $day, $year); $baseline_timestamp = mktime(0,0,0,1,0,$year); $day_count = round(($timestamp - $baseline_timestamp)/86400); $day_count_padded = str_pad($day_count,3,"0",STR_PAD_LEFT); return ($jde_year_prefix . $jde_year_suffix . $day_count_padded); } echo jde_date_create(6,25,2000);// will return '103176' ?> -- Jim schotm29
fRay Fergusons light reimplimentation doesn't work all of the time, because of the inaccuracy in the calculations (it is quite accurate but not accurate enough for a live web app)
dy64
Best performance: /* * Find the number of days in a month * Year is between 1 and 32767 inclusive * Month is between 1 and 12 inclusive */ function DayInMonth($month, $year) { var $daysInMonth = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); if ($month != 2) return $daysInMonth[$month - 1]; return (checkdate($month, 29, $year)) ? 29 : 28; } amichauer
<?php class HijriCalendar { function monthName($i) // $i = 1..12 { static $month = array( "Möxärräm", "Safar", "Rabig-äl-Äwwäl", "Rabig-äl-Axír", "Cömäd-äl-Äwwäl", "Cömäd-äl-Axír", "Racäb", "Þäðbän", "Ramazan", "Þäwäl", "Zö-äl-Qäðdä", "Zö-äl-Xiccä" ); return $month[$i-1]; } function GregorianToHijri($time = null) { if ($time === null) $time = time(); $m = date('m', $time); $d = date('d', $time); $y = date('Y', $time); return HijriCalendar::JDToHijri( cal_to_jd(CAL_GREGORIAN, $m, $d, $y)); } function HijriToGregorian($m, $d, $y) { return jd_to_cal(CAL_GREGORIAN, HijriCalendar::HijriToJD($m, $d, $y)); } # Julian Day Count To Hijri function JDToHijri($jd) { $jd = $jd - 1948440 + 10632; $n = (int)(($jd - 1) / 10631); $jd = $jd - 10631 * $n + 354; $j = ((int)((10985 - $jd) / 5316)) * ((int)(50 * $jd / 17719)) + ((int)($jd / 5670)) * ((int)(43 * $jd / 15238)); $jd = $jd - ((int)((30 - $j) / 15)) * ((int)((17719 * $j) / 50)) - ((int)($j / 16)) * ((int)((15238 * $j) / 43)) + 29; $m = (int)(24 * $jd / 709); $d = $jd - (int)(709 * $m / 24); $y = 30*$n + $j - 30; return array($m, $d, $y); } # Hijri To Julian Day Count function HijriToJD($m, $d, $y) { return (int)((11 * $y + 3) / 30) + 354 * $y + 30 * $m - (int)(($m - 1) / 2) + $d + 1948440 - 385; } }; $hijri = HijriCalendar::GregorianToHijri( time() ); echo $hijri[1].'. '.HijriCalendar::monthName($hijri[0]).' '.$hijri[2]; ?> |
Change Language.NET Functions Apache-specific Functions Alternative PHP Cache Advanced PHP debugger Array Functions Aspell functions [deprecated] BBCode Functions BCMath Arbitrary Precision Mathematics Functions PHP bytecode Compiler Bzip2 Compression Functions Calendar Functions CCVS API Functions [deprecated] Class/Object Functions Classkit Functions ClibPDF Functions [deprecated] COM and .Net (Windows) Crack Functions Character Type Functions CURL Cybercash Payment Functions Credit Mutuel CyberMUT functions Cyrus IMAP administration Functions Date and Time Functions DB++ Functions Database (dbm-style) Abstraction Layer Functions dBase Functions DBM Functions [deprecated] dbx Functions Direct IO Functions Directory Functions DOM Functions DOM XML Functions enchant Functions Error Handling and Logging Functions Exif Functions Expect Functions File Alteration Monitor Functions Forms Data Format Functions Fileinfo Functions filePro Functions Filesystem Functions Filter Functions Firebird/InterBase Functions Firebird/Interbase Functions (PDO_FIREBIRD) FriBiDi Functions FrontBase Functions FTP Functions Function Handling Functions GeoIP Functions Gettext Functions GMP Functions gnupg Functions Net_Gopher Haru PDF Functions hash Functions HTTP Hyperwave Functions Hyperwave API Functions i18n Functions IBM Functions (PDO_IBM) IBM DB2 iconv Functions ID3 Functions IIS Administration Functions Image Functions Imagick Image Library IMAP Informix Functions Informix Functions (PDO_INFORMIX) Ingres II Functions IRC Gateway Functions PHP / Java Integration JSON Functions KADM5 LDAP Functions libxml Functions Lotus Notes Functions LZF Functions Mail Functions Mailparse Functions Mathematical Functions MaxDB PHP Extension MCAL Functions Mcrypt Encryption Functions MCVE (Monetra) Payment Functions Memcache Functions Mhash Functions Mimetype Functions Ming functions for Flash Miscellaneous Functions mnoGoSearch Functions Microsoft SQL Server Functions Microsoft SQL Server and Sybase Functions (PDO_DBLIB) Mohawk Software Session Handler Functions mSQL Functions Multibyte String Functions muscat Functions MySQL Functions MySQL Functions (PDO_MYSQL) MySQL Improved Extension Ncurses Terminal Screen Control Functions Network Functions Newt Functions NSAPI-specific Functions Object Aggregation/Composition Functions Object property and method call overloading Oracle Functions ODBC Functions (Unified) ODBC and DB2 Functions (PDO_ODBC) oggvorbis OpenAL Audio Bindings OpenSSL Functions Oracle Functions [deprecated] Oracle Functions (PDO_OCI) Output Control Functions Ovrimos SQL Functions Paradox File Access Parsekit Functions Process Control Functions Regular Expression Functions (Perl-Compatible) PDF Functions PDO Functions Phar archive stream and classes PHP Options&Information POSIX Functions Regular Expression Functions (POSIX Extended) PostgreSQL Functions PostgreSQL Functions (PDO_PGSQL) Printer Functions Program Execution Functions PostScript document creation Pspell Functions qtdom Functions Radius Rar Functions GNU Readline GNU Recode Functions RPM Header Reading Functions runkit Functions SAM - Simple Asynchronous Messaging Satellite CORBA client extension [deprecated] SCA Functions SDO Functions SDO XML Data Access Service Functions SDO Relational Data Access Service Functions Semaphore SESAM Database Functions PostgreSQL Session Save Handler Session Handling Functions Shared Memory Functions SimpleXML functions SNMP Functions SOAP Functions Socket Functions Standard PHP Library (SPL) Functions SQLite Functions SQLite Functions (PDO_SQLITE) Secure Shell2 Functions Statistics Functions Stream Functions String Functions Subversion Functions Shockwave Flash Functions Swish Functions Sybase Functions TCP Wrappers Functions Tidy Functions Tokenizer Functions Unicode Functions URL Functions Variable Handling Functions Verisign Payflow Pro Functions vpopmail Functions W32api Functions WDDX Functions win32ps Functions win32service Functions xattr Functions xdiff Functions XML Parser Functions XML-RPC Functions XMLReader functions XMLWriter Functions XSL functions XSLT Functions YAZ Functions YP/NIS Functions Zip File Functions Zlib Compression Functions |