$result .= '%' . $type; } } else { $result .= $par; } $i ++; } if ($fanum) return ztjalali_persian_num($result); return $result; } /* =================================================================== */ /** * return Unix timestamp for a date (jalali equivalent of php mktime() function) * @param int $hour [optional] max : 23 * @param int $minute [optional] max : 59 * @param int $second [optional] max: 59 * @param int $month [optional] max: 12 * @param int $day [optional] max: 31 * @param int $year [optional] * @param int $is_dst [optional] * @return timestamp * @since 5.0.0 */ function jmktime($hour = 0, $minute = 0, $second = 0, $month = 0, $day = 0, $year = 0, $is_dst = -1) { if (($hour == 0) && ($minute == 0) && ($second == 0) && ($month == 0) && ($day == 0) && ($year == 0)) { return time(); } list($year, $month, $day) = jalali_to_gregorian($year, $month, $day); return mktime($hour, $minute, $second, $month, $day, $year, $is_dst); } /* =================================================================== */ /** * validate a jalali date (jalali equivalent of php checkdate() function) * @param int $month * @param int $day * @param int $year * @return int * @since 5.0.0 */ function jcheckdate($month, $day, $year) { if (($month < 1) || ($month > 12) || ($year < 1) || ($year > 32767) || ($day < 1)) { return 0; } static $jdate_month_days = array(0, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29); if ($day > $jdate_month_days[$month]) { if (($month != 12) || ($day != 30) || !is_jalali_leap_year($year)) { return 0; } } return 1; } /* =================================================================== */ /** * Get date/time information (jalali equivalent of php getdate() function) * @param timestamp $timestamp * @return array * @since 5.0.0 */ function jgetdate($timestamp = NULL) { if (!$timestamp) { $timestamp = mktime(); } list($seconds, $minutes, $hours, $mday, $wday, $mon, $year, $yday, $weekday, $month) = explode('-', jdate('s-i-G-j-w-n-Y-z-l-F', $timestamp, false, false)); return array(0 => $timestamp, 'seconds' => $seconds, 'minutes' => $minutes, 'hours' => $hours, 'mday' => $mday, 'wday' => $wday, 'mon' => $mon, 'year' => $year, 'yday' => $yday, 'weekday' => $weekday, 'month' => $month); } /* =================================================================== */ /** * gregorian to jalali convertion * @staticvar array $g_days_in_month * @staticvar array $j_days_in_month * @param int $g_y * @param int $g_m * @param int $g_d * @return array * @since 5.0.0 */ function gregorian_to_jalali($g_y, $g_m, $g_d) { static $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); static $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29); $gy = $g_y - 1600; $gm = $g_m - 1; $g_day_no = (365 * $gy + int_div($gy + 3, 4) - int_div($gy + 99, 100) + int_div($gy + 399, 400)); for ($i = 0; $i < $gm; ++$i) { $g_day_no += $g_days_in_month[$i]; } if ($gm > 1 && (($gy % 4 == 0 && $gy % 100 != 0) || ($gy % 400 == 0))) # leap and after Feb $g_day_no ++; $g_day_no += $g_d - 1; $j_day_no = $g_day_no - 79; $j_np = int_div($j_day_no, 12053); # 12053 = (365 * 33 + 32 / 4) $j_day_no = $j_day_no % 12053; $jy = (979 + 33 * $j_np + 4 * int_div($j_day_no, 1461)); # 1461 = (365 * 4 + 4 / 4) $j_day_no %= 1461; if ($j_day_no >= 366) { $jy += int_div($j_day_no - 1, 365); $j_day_no = ($j_day_no - 1) % 365; } for ($i = 0; ($i < 11 && $j_day_no >= $j_days_in_month[$i]); ++$i) { $j_day_no -= $j_days_in_month[$i]; } return array($jy, $i + 1, $j_day_no + 1); } /* =================================================================== */ /** * jalali to gregorian convertion * @staticvar array $g_days_in_month * @staticvar array $j_days_in_month * @param int $j_y * @param int $j_m * @param int $j_d * @return array * @since 5.0.0 */ function jalali_to_gregorian($j_y, $j_m, $j_d) { static $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); static $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29); $jy = $j_y - 979; $jm = $j_m - 1; $j_day_no = (365 * $jy + int_div($jy, 33) * 8 + int_div($jy % 33 + 3, 4)); for ($i = 0; $i < $jm; ++$i) { $j_day_no += $j_days_in_month[$i]; } $j_day_no += $j_d - 1; $g_day_no = $j_day_no + 79; $gy = (1600 + 400 * int_div($g_day_no, 146097)); # 146097 = (365 * 400 + 400 / 4 - 400 / 100 + 400 / 400) $g_day_no = $g_day_no % 146097; $leap = 1; if ($g_day_no >= 36525) { # 36525 = (365 * 100 + 100 / 4) $g_day_no --; $gy += (100 * int_div($g_day_no, 36524)); # 36524 = (365 * 100 + 100 / 4 - 100 / 100) $g_day_no = $g_day_no % 36524; if ($g_day_no >= 365) { $g_day_no ++; } else { $leap = 0; } } $gy += (4 * int_div($g_day_no, 1461)); # 1461 = (365 * 4 + 4 / 4) $g_day_no %= 1461; if ($g_day_no >= 366) { $leap = 0; $g_day_no --; $gy += int_div($g_day_no, 365); $g_day_no = ($g_day_no % 365); } for ($i = 0; $g_day_no >= ($g_days_in_month[$i] + ($i == 1 && $leap)); $i ++) { $g_day_no -= ($g_days_in_month[$i] + ($i == 1 && $leap)); } return array($gy, $i + 1, $g_day_no + 1); } /* =================================================================== */ /** * integer division * @param int $a * @param int $b * @return type * @since 5.0.0 */ function int_div($a, $b) { return (int) ($a / $b); } /* =================================================================== */ /** * return day number from first day of year * @param int $pMonth * @param int $pDay * @return type * @since 5.0.0 */ function jday_of_year($pMonth, $pDay) { static $jdate_month_days = array(0, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29); $days = 0; for ($i = 1; $i < $pMonth; $i ++) { $days += $jdate_month_days[$i]; } return ($days + $pDay); } /* =================================================================== */ /** * check jalali year is leap(kabise) * @param int $year * @return int * @since 5.0.0 */ function is_jalali_leap_year($year) { $mod = ($year % 33); if (($mod == 1) or ( $mod == 5) or ( $mod == 9) or ( $mod == 13) or ( $mod == 17) or ( $mod == 22) or ( $mod == 26) or ( $mod == 30)) { return 1; } return 0; } /* =================================================================== */ /** * return last day of month * @param int $year * @param int $month * @return int number of day in month * @since 5.0.0 */ function jday_of_month($year,$month) { static $jdate_month_days = array(0, 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29); if(is_jalali_leap_year($year) && ($month == 12)) return 30; $month = (int)$month; return $jdate_month_days[$month]; } /* =================================================================== */ /** * return jalali name of month from month number * @global array $jdate_month_name * @param int $month * @return string * @since 5.0.0 */ function monthname($month) { global $jdate_month_name; $month = (int)$month; return $jdate_month_name[$month]; } /* =================================================================== */