2 /**********************************************************************
3 Copyright (C) FrontAccounting, LLC.
4 Released under the terms of the GNU General Public License, GPL,
5 as published by the Free Software Foundation, either version 3
6 of the License, or (at your option) any later version.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
11 ***********************************************************************/
13 date validation and parsing functions
15 These functions refer to the global variable defining the date format
16 The date format is defined in config.php called DefaultDateFormat
17 this can be a string either "d/m/Y" for UK/Australia/New Zealand dates or
18 "m/d/Y" for US/Canada format dates
22 function __date($year, $month, $day)
26 $how = user_date_format();
27 $sep = $dateseps[user_date_sep()];
35 return $month.$sep.$day.$sep.$year;
37 return $day.$sep.$month.$sep.$year;
39 return $year.$sep.$month.$sep.$day;
42 function is_date($date_)
46 if ($date_ == null || $date_ == "")
48 $how = user_date_format();
49 $sep = $dateseps[user_date_sep()];
51 $date_ = trim($date_);
52 $date_ = str_replace($sep, "", $date_);
53 if (strlen($date_) == 6)
57 $day = substr($date_,2,2);
58 $month = substr($date_,0,2);
59 $year = substr($date_,4,2);
63 $day = substr($date_,0,2);
64 $month = substr($date_,2,2);
65 $year = substr($date_,4,2);
69 $day = substr($date_,4,2);
70 $month = substr($date_,2,2);
71 $year = substr($date_,0,2);
74 elseif (strlen($date_) == 8)
78 $day = substr($date_,2,2);
79 $month = substr($date_,0,2);
80 $year = substr($date_,4,4);
84 $day = substr($date_,0,2);
85 $month = substr($date_,2,2);
86 $year = substr($date_,4,4);
90 $day = substr($date_,6,2);
91 $month = substr($date_,4,2);
92 $year = substr($date_,0,4);
95 if (!isset($year)|| (int)$year > 9999)
101 if (is_long((int)$day) && is_long((int)$month) && is_long((int)$year))
104 if ($date_system == 1)
105 list($year, $month, $day) = jalali_to_gregorian($year, $month, $day);
106 else if ($date_system == 2)
107 list($year, $month, $day) = islamic_to_gregorian($year, $month, $day);
108 if (checkdate((int)$month, (int)$day, (int)$year))
118 { /*Can't be in an appropriate DefaultDateFormat */
121 } //end of is_date function
130 if ($date_system == 1)
131 list($year, $month, $day) = gregorian_to_jalali($year, $month, $day);
132 else if ($date_system == 2)
133 list($year, $month, $day) = gregorian_to_islamic($year, $month, $day);
134 return __date($year, $month, $day);
139 if (user_date_format() == 0)
140 return date("h:i a");
145 function is_date_in_fiscalyear($date, $convert=false)
147 global $path_to_root;
148 include_once($path_to_root . "/admin/db/company_db.inc");
150 $myrow = get_current_fiscalyear();
151 if ($myrow['closed'] == 1)
154 $date2 = sql2date($date);
157 $begin = sql2date($myrow['begin']);
158 $end = sql2date($myrow['end']);
159 if (date1_greater_date2($begin, $date2) || date1_greater_date2($date2, $end))
166 function begin_fiscalyear()
168 global $path_to_root;
169 include_once($path_to_root . "/admin/db/company_db.inc");
171 $myrow = get_current_fiscalyear();
172 return sql2date($myrow['begin']);
175 function end_fiscalyear()
177 global $path_to_root;
178 include_once($path_to_root . "/admin/db/company_db.inc");
180 $myrow = get_current_fiscalyear();
181 return sql2date($myrow['end']);
184 function begin_month($date)
187 list($day, $month, $year) = explode_date_to_dmy($date);
188 if ($date_system == 1)
189 list($year, $month, $day) = gregorian_to_jalali($year, $month, $day);
190 else if ($date_system == 2)
191 list($year, $month, $day) = gregorian_to_islamic($year, $month, $day);
192 return __date($year, $month, 1);
195 function end_month($date)
198 list($day, $month, $year) = explode_date_to_dmy($date);
199 if ($date_system == 1)
201 list($year, $month, $day) = gregorian_to_jalali($year, $month, $day);
202 $days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, ((((((($year - (($year > 0) ? 474 : 473)) % 2820) + 474) + 38) * 682) % 2816) < 682 ? 30 : 29));
204 else if ($date_system == 2)
206 list($year, $month, $day) = gregorian_to_islamic($year, $month, $day);
207 $days_in_month = array(30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, (((((11 * $year) + 14) % 30) < 11) ? 30 : 29));
209 else // gregorian date
210 $days_in_month = array(31, ((!($year % 4 ) && (($year % 100) || !($year % 400)))?29:28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
211 return __date($year, $month, $days_in_month[$month - 1]);
214 function add_days($date, $days) // accepts negative values as well
217 list($day, $month, $year) = explode_date_to_dmy($date);
218 $timet = Mktime(0,0,0, $month, $day + $days, $year);
219 if ($date_system == 1 || $date_system == 2)
221 if ($date_system == 1)
222 list($year, $month, $day) = gregorian_to_jalali(date("Y", $timet), date("n", $timet), date("j", $timet));
223 else if ($date_system == 2)
224 list($year, $month, $day) = gregorian_to_islamic(date("Y", $timet), date("n", $timet), date("j", $timet));
225 return __date($year, $month, $day);
227 return date(user_date_display(), $timet);
230 function add_months($date, $months) // accepts negative values as well
233 list($day, $month, $year) = explode_date_to_dmy($date);
234 $timet = Mktime(0,0,0, $month + $months, $day, $year);
235 if ($date_system == 1 || $date_system == 2)
237 if ($date_system == 1)
238 list($year, $month, $day) = gregorian_to_jalali(date("Y", $timet), date("n", $timet), date("j", $timet));
239 else if ($date_system == 2)
240 list($year, $month, $day) = gregorian_to_islamic(date("Y", $timet), date("n", $timet), date("j", $timet));
241 return __date($year, $month, $day);
243 return date(user_date_display(), $timet);
246 function add_years($date, $years) // accepts negative values as well
249 list($day, $month, $year) = explode_date_to_dmy($date);
250 $timet = Mktime(0,0,0, $month, $day, $year + $years);
251 if ($date_system == 1 || $date_system == 2)
253 if ($date_system == 1)
254 list($year, $month, $day) = gregorian_to_jalali(date("Y", $timet), date("n", $timet), date("j", $timet));
255 else if ($date_system == 2)
256 list($year, $month, $day) = gregorian_to_islamic(date("Y", $timet), date("n", $timet), date("j", $timet));
257 return __date($year, $month, $day);
259 return date(user_date_display(), $timet);
262 //_______________________________________________________________
264 function sql2date($date_)
268 //for MySQL dates are in the format YYYY-mm-dd
269 if ($date_ == null || strlen($date_) == 0)
272 if (strpos($date_, "/"))
273 { // In MySQL it could be either / or -
274 list($year, $month, $day) = explode("/", $date_);
276 elseif (strpos ($date_, "-"))
278 list($year, $month, $day) = explode("-", $date_);
281 if (strlen($day) > 4)
282 { /*chop off the time stuff */
283 $day = substr($day, 0, 2);
285 if ($date_system == 1)
286 list($year, $month, $day) = gregorian_to_jalali($year, $month, $day);
287 else if ($date_system == 2)
288 list($year, $month, $day) = gregorian_to_islamic($year, $month, $day);
289 return __date($year, $month, $day);
290 } // end function sql2date
293 function date2sql($date_)
295 global $dateseps, $date_system;
296 /* takes a date in a the format specified in $DefaultDateFormat
297 and converts to a yyyy/mm/dd format */
299 $how = user_date_format();
300 $sep = $dateseps[user_date_sep()];
302 if ($date_ == null || strlen($date_) == 0)
305 $date_ = trim($date_);
306 $date_ = str_replace($sep, "", $date_);
308 if (strlen($date_) == 6)
312 $day = substr($date_,2,2);
313 $month = substr($date_,0,2);
314 $year = substr($date_,4,2);
318 $day = substr($date_,0,2);
319 $month = substr($date_,2,2);
320 $year = substr($date_,4,2);
324 $day = substr($date_,4,2);
325 $month = substr($date_,2,2);
326 $year = substr($date_,0,2);
329 elseif (strlen($date_) == 8)
333 $day = substr($date_,2,2);
334 $month = substr($date_,0,2);
335 $year = substr($date_,4,4);
339 $day = substr($date_,0,2);
340 $month = substr($date_,2,2);
341 $year = substr($date_,4,4);
345 $day = substr($date_,6,2);
346 $month = substr($date_,4,2);
347 $year = substr($date_,0,4);
351 //to modify assumption in 2030
352 if ($date_system == 0)
358 elseif ((int)$year > 59 && (int)$year < 100)
363 if ((int)$year > 9999)
367 if ($date_system == 1)
368 list($year, $month, $day) = jalali_to_gregorian($year, $month, $day);
369 else if ($date_system == 2)
370 list($year, $month, $day) = islamic_to_gregorian($year, $month, $day);
371 return $year."-".$month."-".$day;
374 function date1_greater_date2 ($date1, $date2)
377 /* returns 1 true if date1 is greater than date_ 2 */
379 $date1 = date2sql($date1);
380 $date2 = date2sql($date2);
381 list($year1, $month1, $day1) = explode("-", $date1);
382 list($year2, $month2, $day2) = explode("-", $date2);
388 elseif ($year1 == $year2)
390 if ($month1 > $month2)
394 elseif ($month1 == $month2)
406 function date_diff ($date1, $date2, $period)
409 /* expects dates in the format specified in $DefaultDateFormat - period can be one of 'd','w','y','m'
410 months are assumed to be 30 days and years 365.25 days This only works
411 provided that both dates are after 1970. Also only works for dates up to the year 2035 ish */
413 $date1 = date2sql($date1);
414 $date2 = date2sql($date2);
415 list($year1, $month1, $day1) = explode("-", $date1);
416 list($year2, $month2, $day2) = explode("-", $date2);
418 $stamp1 = mktime(0,0,0, (int)$month1, (int)$day1, (int)$year1);
419 $stamp2 = mktime(0,0,0, (int)$month2, (int)$day2, (int)$year2);
420 $difference = $stamp1 - $stamp2;
422 /* difference is the number of seconds between each date negative if date_ 2 > date_ 1 */
427 return (int)($difference / (24 * 60 * 60));
429 return (int)($difference / (24 * 60 * 60 * 7));
431 return (int)($difference / (24 * 60 * 60 * 30));
435 return (int)($difference / (24 * 60 * 60 * 365.25));
441 function explode_date_to_dmy($date_)
443 $date = date2sql($date_);
446 $disp = user_date_display();
447 echo "<br>Dates must be entered in the format $disp. Sent was $date_<br>";
450 list($year, $month, $day) = explode("-", $date);
451 return array($day, $month, $year);
456 return (int) ($a / $b);
458 /* Based on convertor to and from Gregorian and Jalali calendars.
459 Copyright (C) 2000 Roozbeh Pournader and Mohammad Toossi
460 Released under GNU General Public License */
462 function gregorian_to_jalali ($g_y, $g_m, $g_d)
464 $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
465 $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
471 $g_day_no = 365 * $gy + div($gy + 3, 4) - div($gy + 99, 100) + div($gy + 399, 400);
473 for ($i = 0; $i < $gm; ++$i)
474 $g_day_no += $g_days_in_month[$i];
475 if ($gm > 1 && (($gy % 4 == 0 && $gy % 100 != 0) || ($gy % 400 == 0)))
476 /* leap and after Feb */
479 $j_day_no = $g_day_no - 79;
481 $j_np = div($j_day_no, 12053); /* 12053 = 365*33 + 32/4 */
484 $jy = 979 + 33 * $j_np + 4 * div($j_day_no, 1461); /* 1461 = 365*4 + 4/4 */
488 if ($j_day_no >= 366)
490 $jy += div($j_day_no - 1, 365);
491 $j_day_no = ($j_day_no - 1) % 365;
494 for ($i = 0; $i < 11 && $j_day_no >= $j_days_in_month[$i]; ++$i)
495 $j_day_no -= $j_days_in_month[$i];
499 return array($jy, $jm, $jd);
502 function jalali_to_gregorian($j_y, $j_m, $j_d)
504 $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
505 $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
511 $j_day_no = 365 * $jy + div($jy, 33) * 8 + div($jy % 33 + 3, 4);
512 for ($i = 0; $i < $jm; ++$i)
513 $j_day_no += $j_days_in_month[$i];
517 $g_day_no = $j_day_no + 79;
519 $gy = 1600 + 400 * div($g_day_no, 146097); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */
523 if ($g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */
526 $gy += 100 * div($g_day_no, 36524); /* 36524 = 365*100 + 100/4 - 100/100 */
529 if ($g_day_no >= 365)
535 $gy += 4 * div($g_day_no, 1461); /* 1461 = 365*4 + 4/4 */
538 if ($g_day_no >= 366)
543 $gy += div($g_day_no, 365);
547 for ($i = 0; $g_day_no >= $g_days_in_month[$i] + ($i == 1 && $leap); $i++)
548 $g_day_no -= $g_days_in_month[$i] + ($i == 1 && $leap);
552 return array($gy, $gm, $gd);
554 /* Based on Hidri Date Script
555 Released under GNU General Public License */
556 function gregorian_to_islamic($g_y, $g_m, $g_d)
561 if (($y > 1582) || (($y == 1582) && ($m > 10)) || (($y == 1582) &&
562 ($m == 10) && ($d > 14)))
564 $jd = (int)((1461 * ($y + 4800 + (int)(($m - 14) / 12)))/ 4) +
565 (int)((367 * ($m - 2 - 12 * ((int)(($m - 14) / 12)))) / 12) -
566 (int)((3 * ((int)(($y + 4900 + (int)(($m - 14) / 12)) / 100))) / 4) + $d - 32075;
570 $jd = 367 * $y - (int)((7 * ($y + 5001 + (int)(($m - 9) / 7))) / 4) +
571 (int)((275 * $m) / 9) + $d + 1729777;
573 $l = $jd - 1948440 + 10632;
574 $n = (int)(($l - 1) / 10631);
575 $l = $l - 10631 * $n + 354;
576 $j = ((int)((10985 - $l) / 5316)) * ((int)((50 * $l) / 17719)) +
577 ((int)($l / 5670)) * ((int)((43 * $l) / 15238));
578 $l = $l - ((int)((30 - $j) / 15)) * ((int)((17719 * $j) / 50)) -
579 ((int)($j / 16)) * ((int)((15238 * $j) / 43)) + 29;
580 $m = (int)((24 * $l) / 709);
581 $d = $l - (int)((709 * $m) / 24);
582 $y = 30 * $n + $j - 30;
583 return array($y, $m, $d);
586 function islamic_to_gregorian($i_y, $i_m, $i_d)
592 $jd = (int)((11 * $y + 3) / 30) + 354 * $y + 30 * $m - (int)(($m - 1) / 2) + $d + 1948440 - 385;
596 $n = (int)((4 * $l) / 146097);
597 $l = $l - (int)((146097 * $n + 3) / 4);
598 $i = (int)((4000 * ($l + 1)) / 1461001);
599 $l = $l - (int)((1461 * $i) / 4) + 31;
600 $j = (int)((80 * $l) / 2447);
601 $d = $l - (int)((2447 * $j) / 80);
603 $m = $j + 2 - 12 * $l;
604 $y = 100 * ($n - 49) + $i + $l;
609 $k = (int)(($j - 1) / 1461);
611 $n = (int)(($l - 1) / 365) - (int)($l / 1461);
612 $i = $l - 365 * $n + 30;
613 $j = (int)((80 * $i) / 2447);
614 $d = $i - (int)((2447 * $j) / 80);
616 $m = $j + 2 - 12 * $i;
617 $y = 4 * $k + $n + $i - 4716;
619 return array($y, $m, $d);