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
21 if(function_exists("date_default_timezone_set") and function_exists("date_default_timezone_get"))
22 @date_default_timezone_set(@date_default_timezone_get());
24 function __date($year, $month, $day)
28 $how = user_date_format();
29 $sep = $dateseps[user_date_sep()];
37 return $month.$sep.$day.$sep.$year;
39 return $day.$sep.$month.$sep.$year;
41 return $year.$sep.$month.$sep.$day;
44 function is_date($date_)
48 if ($date_ == null || $date_ == "")
50 $how = user_date_format();
51 $sep = $dateseps[user_date_sep()];
53 $date_ = trim($date_);
54 $date_ = str_replace($sep, "", $date_);
55 if (strlen($date_) == 6)
59 $day = substr($date_,2,2);
60 $month = substr($date_,0,2);
61 $year = substr($date_,4,2);
65 $day = substr($date_,0,2);
66 $month = substr($date_,2,2);
67 $year = substr($date_,4,2);
71 $day = substr($date_,4,2);
72 $month = substr($date_,2,2);
73 $year = substr($date_,0,2);
76 elseif (strlen($date_) == 8)
80 $day = substr($date_,2,2);
81 $month = substr($date_,0,2);
82 $year = substr($date_,4,4);
86 $day = substr($date_,0,2);
87 $month = substr($date_,2,2);
88 $year = substr($date_,4,4);
92 $day = substr($date_,6,2);
93 $month = substr($date_,4,2);
94 $year = substr($date_,0,4);
97 if (!isset($year)|| (int)$year > 9999)
103 if (is_long((int)$day) && is_long((int)$month) && is_long((int)$year))
106 if ($date_system == 1)
107 list($year, $month, $day) = jalali_to_gregorian($year, $month, $day);
108 else if ($date_system == 2)
109 list($year, $month, $day) = islamic_to_gregorian($year, $month, $day);
110 if (checkdate((int)$month, (int)$day, (int)$year))
120 { /*Can't be in an appropriate DefaultDateFormat */
123 } //end of is_date function
132 if ($date_system == 1)
133 list($year, $month, $day) = gregorian_to_jalali($year, $month, $day);
134 else if ($date_system == 2)
135 list($year, $month, $day) = gregorian_to_islamic($year, $month, $day);
136 return __date($year, $month, $day);
141 if (user_date_format() == 0)
142 return date("h:i a");
147 // Retrieve and optionaly set default date for new document.
149 function new_doc_date($date=null)
152 $_SESSION['_default_date'] = $date;
154 if (!isset($_SESSION['_default_date']) || !sticky_doc_date())
155 $_SESSION['_default_date'] = Today();
157 return $_SESSION['_default_date'];
160 function is_date_in_fiscalyear($date, $convert=false)
162 global $path_to_root;
163 include_once($path_to_root . "/admin/db/company_db.inc");
165 $myrow = get_current_fiscalyear();
166 if ($myrow['closed'] == 1)
169 $date2 = sql2date($date);
172 $begin = sql2date($myrow['begin']);
173 $end = sql2date($myrow['end']);
174 if (date1_greater_date2($begin, $date2) || date1_greater_date2($date2, $end))
181 function begin_fiscalyear()
183 global $path_to_root;
184 include_once($path_to_root . "/admin/db/company_db.inc");
186 $myrow = get_current_fiscalyear();
187 return sql2date($myrow['begin']);
190 function end_fiscalyear()
192 global $path_to_root;
193 include_once($path_to_root . "/admin/db/company_db.inc");
195 $myrow = get_current_fiscalyear();
196 return sql2date($myrow['end']);
199 function begin_month($date)
202 list($day, $month, $year) = explode_date_to_dmy($date);
203 if ($date_system == 1)
204 list($year, $month, $day) = gregorian_to_jalali($year, $month, $day);
205 else if ($date_system == 2)
206 list($year, $month, $day) = gregorian_to_islamic($year, $month, $day);
207 return __date($year, $month, 1);
210 function end_month($date)
213 list($day, $month, $year) = explode_date_to_dmy($date);
214 if ($date_system == 1)
216 list($year, $month, $day) = gregorian_to_jalali($year, $month, $day);
217 $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));
219 else if ($date_system == 2)
221 list($year, $month, $day) = gregorian_to_islamic($year, $month, $day);
222 $days_in_month = array(30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, (((((11 * $year) + 14) % 30) < 11) ? 30 : 29));
224 else // gregorian date
225 $days_in_month = array(31, ((!($year % 4 ) && (($year % 100) || !($year % 400)))?29:28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
226 return __date($year, $month, $days_in_month[$month - 1]);
229 function add_days($date, $days) // accepts negative values as well
232 list($day, $month, $year) = explode_date_to_dmy($date);
233 $timet = Mktime(0,0,0, $month, $day + $days, $year);
234 if ($date_system == 1 || $date_system == 2)
236 if ($date_system == 1)
237 list($year, $month, $day) = gregorian_to_jalali(date("Y", $timet), date("n", $timet), date("j", $timet));
238 else if ($date_system == 2)
239 list($year, $month, $day) = gregorian_to_islamic(date("Y", $timet), date("n", $timet), date("j", $timet));
240 return __date($year, $month, $day);
242 return date(user_date_display(), $timet);
245 function add_months($date, $months) // accepts negative values as well
248 list($day, $month, $year) = explode_date_to_dmy($date);
249 $timet = Mktime(0,0,0, $month + $months, $day, $year);
250 if ($date_system == 1 || $date_system == 2)
252 if ($date_system == 1)
253 list($year, $month, $day) = gregorian_to_jalali(date("Y", $timet), date("n", $timet), date("j", $timet));
254 else if ($date_system == 2)
255 list($year, $month, $day) = gregorian_to_islamic(date("Y", $timet), date("n", $timet), date("j", $timet));
256 return __date($year, $month, $day);
258 return date(user_date_display(), $timet);
261 function add_years($date, $years) // accepts negative values as well
264 list($day, $month, $year) = explode_date_to_dmy($date);
265 $timet = Mktime(0,0,0, $month, $day, $year + $years);
266 if ($date_system == 1 || $date_system == 2)
268 if ($date_system == 1)
269 list($year, $month, $day) = gregorian_to_jalali(date("Y", $timet), date("n", $timet), date("j", $timet));
270 else if ($date_system == 2)
271 list($year, $month, $day) = gregorian_to_islamic(date("Y", $timet), date("n", $timet), date("j", $timet));
272 return __date($year, $month, $day);
274 return date(user_date_display(), $timet);
277 //_______________________________________________________________
279 function sql2date($date_)
283 //for MySQL dates are in the format YYYY-mm-dd
284 if ($date_ == null || strlen($date_) == 0)
287 if (strpos($date_, "/"))
288 { // In MySQL it could be either / or -
289 list($year, $month, $day) = explode("/", $date_);
291 elseif (strpos ($date_, "-"))
293 list($year, $month, $day) = explode("-", $date_);
296 if (strlen($day) > 4)
297 { /*chop off the time stuff */
298 $day = substr($day, 0, 2);
300 if ($date_system == 1)
301 list($year, $month, $day) = gregorian_to_jalali($year, $month, $day);
302 else if ($date_system == 2)
303 list($year, $month, $day) = gregorian_to_islamic($year, $month, $day);
304 return __date($year, $month, $day);
305 } // end function sql2date
308 function date2sql($date_)
310 global $dateseps, $date_system;
311 /* takes a date in a the format specified in $DefaultDateFormat
312 and converts to a yyyy/mm/dd format */
314 $how = user_date_format();
315 $sep = $dateseps[user_date_sep()];
317 if ($date_ == null || strlen($date_) == 0)
320 $date_ = trim($date_);
321 $date_ = str_replace($sep, "", $date_);
323 if (strlen($date_) == 6)
327 $day = substr($date_,2,2);
328 $month = substr($date_,0,2);
329 $year = substr($date_,4,2);
333 $day = substr($date_,0,2);
334 $month = substr($date_,2,2);
335 $year = substr($date_,4,2);
339 $day = substr($date_,4,2);
340 $month = substr($date_,2,2);
341 $year = substr($date_,0,2);
344 elseif (strlen($date_) == 8)
348 $day = substr($date_,2,2);
349 $month = substr($date_,0,2);
350 $year = substr($date_,4,4);
354 $day = substr($date_,0,2);
355 $month = substr($date_,2,2);
356 $year = substr($date_,4,4);
360 $day = substr($date_,6,2);
361 $month = substr($date_,4,2);
362 $year = substr($date_,0,4);
366 $year = $month = $day = 0;
368 //to modify assumption in 2030
369 if ($date_system == 0)
375 elseif ((int)$year > 59 && (int)$year < 100)
380 if ((int)$year > 9999)
384 if ($date_system == 1)
385 list($year, $month, $day) = jalali_to_gregorian($year, $month, $day);
386 else if ($date_system == 2)
387 list($year, $month, $day) = islamic_to_gregorian($year, $month, $day);
388 return $year."-".$month."-".$day;
391 function date1_greater_date2 ($date1, $date2)
394 /* returns 1 true if date1 is greater than date_ 2 */
396 $date1 = date2sql($date1);
397 $date2 = date2sql($date2);
398 list($year1, $month1, $day1) = explode("-", $date1);
399 list($year2, $month2, $day2) = explode("-", $date2);
405 elseif ($year1 == $year2)
407 if ($month1 > $month2)
411 elseif ($month1 == $month2)
423 function date_diff2 ($date1, $date2, $period)
426 /* expects dates in the format specified in $DefaultDateFormat - period can be one of 'd','w','y','m'
427 months are assumed to be 30 days and years 365.25 days This only works
428 provided that both dates are after 1970. Also only works for dates up to the year 2035 ish */
430 $date1 = date2sql($date1);
431 $date2 = date2sql($date2);
432 list($year1, $month1, $day1) = explode("-", $date1);
433 list($year2, $month2, $day2) = explode("-", $date2);
435 $stamp1 = mktime(0,0,0, (int)$month1, (int)$day1, (int)$year1);
436 $stamp2 = mktime(0,0,0, (int)$month2, (int)$day2, (int)$year2);
437 $difference = $stamp1 - $stamp2;
439 /* difference is the number of seconds between each date negative if date_ 2 > date_ 1 */
444 return (int)($difference / (24 * 60 * 60));
446 return (int)($difference / (24 * 60 * 60 * 7));
448 return (int)($difference / (24 * 60 * 60 * 30));
452 return (int)($difference / (24 * 60 * 60 * 365.25));
458 function explode_date_to_dmy($date_)
460 $date = date2sql($date_);
463 $disp = user_date_display();
464 echo "<br>Dates must be entered in the format $disp. Sent was $date_<br>";
467 list($year, $month, $day) = explode("-", $date);
468 return array($day, $month, $year);
473 return (int) ($a / $b);
475 /* Based on convertor to and from Gregorian and Jalali calendars.
476 Copyright (C) 2000 Roozbeh Pournader and Mohammad Toossi
477 Released under GNU General Public License */
479 function gregorian_to_jalali ($g_y, $g_m, $g_d)
481 $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
482 $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
488 $g_day_no = 365 * $gy + div($gy + 3, 4) - div($gy + 99, 100) + div($gy + 399, 400);
490 for ($i = 0; $i < $gm; ++$i)
491 $g_day_no += $g_days_in_month[$i];
492 if ($gm > 1 && (($gy % 4 == 0 && $gy % 100 != 0) || ($gy % 400 == 0)))
493 /* leap and after Feb */
496 $j_day_no = $g_day_no - 79;
498 $j_np = div($j_day_no, 12053); /* 12053 = 365*33 + 32/4 */
501 $jy = 979 + 33 * $j_np + 4 * div($j_day_no, 1461); /* 1461 = 365*4 + 4/4 */
505 if ($j_day_no >= 366)
507 $jy += div($j_day_no - 1, 365);
508 $j_day_no = ($j_day_no - 1) % 365;
511 for ($i = 0; $i < 11 && $j_day_no >= $j_days_in_month[$i]; ++$i)
512 $j_day_no -= $j_days_in_month[$i];
516 return array($jy, $jm, $jd);
519 function jalali_to_gregorian($j_y, $j_m, $j_d)
521 $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
522 $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
528 $j_day_no = 365 * $jy + div($jy, 33) * 8 + div($jy % 33 + 3, 4);
529 for ($i = 0; $i < $jm; ++$i)
530 $j_day_no += $j_days_in_month[$i];
534 $g_day_no = $j_day_no + 79;
536 $gy = 1600 + 400 * div($g_day_no, 146097); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */
540 if ($g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */
543 $gy += 100 * div($g_day_no, 36524); /* 36524 = 365*100 + 100/4 - 100/100 */
546 if ($g_day_no >= 365)
552 $gy += 4 * div($g_day_no, 1461); /* 1461 = 365*4 + 4/4 */
555 if ($g_day_no >= 366)
560 $gy += div($g_day_no, 365);
564 for ($i = 0; $g_day_no >= $g_days_in_month[$i] + ($i == 1 && $leap); $i++)
565 $g_day_no -= $g_days_in_month[$i] + ($i == 1 && $leap);
569 return array($gy, $gm, $gd);
571 /* Based on Hidri Date Script
572 Released under GNU General Public License */
573 function gregorian_to_islamic($g_y, $g_m, $g_d)
578 if (($y > 1582) || (($y == 1582) && ($m > 10)) || (($y == 1582) &&
579 ($m == 10) && ($d > 14)))
581 $jd = (int)((1461 * ($y + 4800 + (int)(($m - 14) / 12)))/ 4) +
582 (int)((367 * ($m - 2 - 12 * ((int)(($m - 14) / 12)))) / 12) -
583 (int)((3 * ((int)(($y + 4900 + (int)(($m - 14) / 12)) / 100))) / 4) + $d - 32075;
587 $jd = 367 * $y - (int)((7 * ($y + 5001 + (int)(($m - 9) / 7))) / 4) +
588 (int)((275 * $m) / 9) + $d + 1729777;
590 $l = $jd - 1948440 + 10632;
591 $n = (int)(($l - 1) / 10631);
592 $l = $l - 10631 * $n + 354;
593 $j = ((int)((10985 - $l) / 5316)) * ((int)((50 * $l) / 17719)) +
594 ((int)($l / 5670)) * ((int)((43 * $l) / 15238));
595 $l = $l - ((int)((30 - $j) / 15)) * ((int)((17719 * $j) / 50)) -
596 ((int)($j / 16)) * ((int)((15238 * $j) / 43)) + 29;
597 $m = (int)((24 * $l) / 709);
598 $d = $l - (int)((709 * $m) / 24);
599 $y = 30 * $n + $j - 30;
600 return array($y, $m, $d);
603 function islamic_to_gregorian($i_y, $i_m, $i_d)
609 $jd = (int)((11 * $y + 3) / 30) + 354 * $y + 30 * $m - (int)(($m - 1) / 2) + $d + 1948440 - 385;
613 $n = (int)((4 * $l) / 146097);
614 $l = $l - (int)((146097 * $n + 3) / 4);
615 $i = (int)((4000 * ($l + 1)) / 1461001);
616 $l = $l - (int)((1461 * $i) / 4) + 31;
617 $j = (int)((80 * $l) / 2447);
618 $d = $l - (int)((2447 * $j) / 80);
620 $m = $j + 2 - 12 * $l;
621 $y = 100 * ($n - 49) + $i + $l;
626 $k = (int)(($j - 1) / 1461);
628 $n = (int)(($l - 1) / 365) - (int)($l / 1461);
629 $i = $l - 365 * $n + 30;
630 $j = (int)((80 * $i) / 2447);
631 $d = $i - (int)((2447 * $j) / 80);
633 $m = $j + 2 - 12 * $i;
634 $y = 4 * $k + $n + $i - 4716;
636 return array($y, $m, $d);