PHP Classes
elePHPant
Icontem

File: date.class.php

Recommend this page to a friend!
  Classes of Taha Paksu  >  Ultimate Date Parser  >  date.class.php  >  Download  
File: date.class.php
Role: Class source
Content type: text/plain
Description: main class
Class: Ultimate Date Parser
Parse and manipulate dates
Author: By
Last change: changed class name, Added Glenn Plas' modifications.
Date: 5 years ago
Size: 10,846 bytes
 

Contents

Class file image Download
<?

/**
 * Converts string date to date array by using date patterns.
 * 
 * Example usage : $sd->parseDate("Y-m-d H:i:s","2008-4-24 20:28:34");
 * Returns : array(	"Year"=>2008,
 * 					"Month"=>4,
 * 					"Day"=>24,
 * 					"Hour"=>20,
 *					"Minute"=>28,
 * 					"Second"=>34,
 * 					"Timezone"=>"+0300"
 * 					);
 * 
 */

class dateparser{
	
	var $date;
	var $tempdate;
	var $patrVal;
	var $timezone;
	var $days3 = array("Mon","Tue","Wed","Thu","Fri","Sat","Sun");
	var $days = array("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday");
	var $month3 = array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
	var $month = array("January","February","March","April","May","June","July","August","September","October","November","December");
	var $types=array(
		"d"=>"([0-9]{2})",
		"D"=>"([a-zA-z]{3})",
		"j"=>"([0-9]{1,2})",
		"l"=>"([A-Z][a-z]{4,7})",
		"N"=>"([1-7])",
		"S"=>"(st|nd|rd|th)",
		"w"=>"([0-6])",
		"z"=>"([0-9]{3})",
		"W"=>"([0-9]{2})",
		"F"=>"([A-Z][a-z]{2,8})",
		"m"=>"([0-9]{2})",
		"M"=>"([A-Za-z]{3})",
		"n"=>"([0-9]{1,2})",
		"t"=>"(28|29|30|31)",
		"L"=>"(1|0)",
		"o"=>"([0-9]{4})",
		"Y"=>"([0-9]{4})",
		"y"=>"([0-9]{2})",
		"a"=>"(am|pm)",
		"A"=>"(AM|PM)",
		"B"=>"([0-9]{3})",
		"g"=>"([1-12])",
		"G"=>"([0-9]|1[0-9]|2[0-3])",   // Contributor: MadMind
		"h"=>"([0-9]{2})",
		"H"=>"([0-9]{2})",
		"i"=>"([0-9]{2})",
		"s"=>"([0-9]{2})",
		"u"=>"([0-9]{1,5})",
		"e"=>"([A-Za-z0-9_]{3,})",
		"I"=>"(1|0)",
		"O"=>"(\+[0-9]{4})",
		"P"=>"(\+[0-9]{2}:[0-9]{2})",
		"T"=>"([A-Z]{1,4})",
		"Z"=>"(-?[0-9]{1,5})",
		"c"=>"(\d\d\d\d)(?:-?(\d\d)(?:-?(\d\d)(?:[T](\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(?:Z|(?:([-+])(\d\d)(?::?(\d\d))?)?)?)?)?)?",
		"r"=>"([a-zA-Z]{2,}),\040(\d{1,})\040([a-zA-Z]{2,})\040([0-9]{4})\040([0-9]{2}):([0-9]{2}):([0-9]{2})\040([+-][0-9]{4})",
		"U"=>"(\d+)"
	);
	

	 /**
	 * function which tests regex pattern for validity :
	 * Test regexes and throw exception if they don't parse well
	 *
	 * @param string $regex
	 * @return true/throw exception
	 * Contributor : Glenn Plas
	 */
	
	 function preg_test($regex) {
		 if (sprintf("%s",@preg_match($regex,'')) == '') {
			 $error = error_get_last();
			 throw new Exception(substr($error['message'],70));
		 } else {
			 return true;
		 }
	 }

	#	0-7		Day
	#	8		Week
	#	9-13	Month
	#	14-17	Year
	#	18-27	Time
	#	28-33	Timezone


	/**
	 * Internal function which generates regex pattern from date pattern
	 *
	 * @param string $dateformat
	 * @return string
	 */
	function generatePattern($dateformat){
		$k=0;
		$datearray = preg_split("//",$dateformat);
		$patternkey = array();
		for($i=0;$i<count($datearray);$i++){ 
			if($datearray[$i-1]=="@"){ $patternkey[$i]=$datearray[$i];}
			elseif($datearray[$i]=="@"){$patternkey[$i]="";}
			elseif($datearray[$i]==" "){$patternkey[$i]="\040";}
			elseif(in_array($datearray[$i],array_keys($this->types))){
				$patternkey[$i]=$this->types[$datearray[$i]];
				$this->patrVal[$k] = array_search($datearray[$i],array_keys($this->types));
				$k++;
			}else{$patternkey[$i]=$datearray[$i];}
		}
		$patternkey = implode("",$patternkey);
		return "/".$patternkey."/";
	}

	/**
	 * Converts the string date to array by using the pattern generated by generatePattern() function
	 *
	 * @param string $dateformat
	 * @param string $date
	 * @param boolean $localize
	 * @return array
	 */
	function parseDate($dateformat,$date,$localize=false){
		$newdate="";
		$dateformat = str_replace(array("\\","\t"),array("@","@t"),$dateformat);
		$pattern = $this->generatePattern($dateformat);
		$this->preg_test($pattern);
		// Exception will be thrown here when its trying to match a non-valid regex (which Glenn Plas fixed)
		preg_match_all($pattern,$date,$newdate);
		$newdate = array_slice($newdate,1);		
		if($this->patrVal[0]==34){
			$resultvar = array("Year"=>$newdate[0],
			"Year"=>$newdate[0][0],
			"Month"=>$newdate[1][0],
			"Day"=>$newdate[2][0],
			"Hour"=>$newdate[3][0],
			"Minute"=>$newdate[4][0],
			"Second"=>$newdate[5][0],
			"Timezone"=>$newdate[6][0].$newdate[7][0].$newdate[8][0]);
		}elseif($this->patrVal[0]==35){
			$resultvar = array("Year"=>$newdate[0],
			"Year"=>$newdate[3][0],
			"Month"=>(array_search($newdate[2][0],$this->month3)+1),
			"Day"=>$newdate[1][0],
			"Hour"=>$newdate[4][0],
			"Minute"=>$newdate[5][0],
			"Second"=>$newdate[6][0],
			"Timezone"=>$newdate[7][0]);
		}elseif($this->patrVal[0]==36){
			$result = getdate(mktime($newdate));
			$resultvar = array(
			"Year"=>$result["year"],
			"Month"=>array_search($result["month"],$this->month)+1,
			"Day"=>$result["mday"],
			"Hour"=>$result["hours"],
			"Minute"=>$result["minutes"],
			"Second"=>$result["seconds"],
			"Timezone"=>date("O"));
		}else{
			$labels = array_keys($this->types);
			for($i=0;$i<count($newdate);$i++)$result[$labels[$this->patrVal[$i]]]=$newdate[$i][0];
			if($result["F"]) $month = array_search($result["F"],$this->month)+1;
			elseif($result["M"]) $month = array_search($result["M"],$this->month3)+1;
			elseif($result["m"]) $month = $result["m"];
			elseif($result["n"]) $month = $result["n"];
			if($result["d"]) $day = $result["d"];
			elseif($result["j"]) $day = $result["j"];
			if($result["Y"]) $year = $result["Y"];
			elseif($result["o"]) $year = $result["o"];
			elseif($result["y"]) $year = ($result["y"]>substr(date("Y",time()),2,2))?(substr(date("Y",time()),0,2)-1).$result["y"]:substr(date("Y",time()),0,2).$result["y"];
			if($result["l"]) $weekday = array_search($result["l"],$this->days)+1;
			elseif($result["D"]) $weekday = array_search($result["D"],$this->days3)+1;
			elseif($result["N"]) $weekday = $result["N"];
			elseif($result["w"]) $weekday = $result["w"];
			else $weekday = @date("w",mktime(0,0,0,$month,$day,$year));
			if($result["H"]) $hour = $result["H"];
			elseif ($result["G"]) $hour = $result["G"];
			elseif ($result["h"]) $hour = ($result["A"]=="PM"|$result["a"]=="pm")?($result["h"]+12):($result["h"]);
			elseif ($result["g"]) $hour = ($result["A"]=="PM"|$result["a"]=="pm")?($result["g"]+12):($result["g"]);
			//--
			if($result["P"]) {
				$timezone = $result["P"] ;
			} 
			elseif($result["O"]) {
				$timezone = $result["O"] ;
			} 
			elseif ($result["Z"]) {
				$timezone = ($result["Z"]/3600);
			} 
			else {
				$timezone = date("O");
			}
			//--
			$minutes = $result["i"];
			$seconds = $result["s"];
			
			$resultvar = array(
			"Year"=>$year,
			"Month"=>$month,
			"Day"=>$day,
			"WeekDay"=>$weekday,
			"Hour"=>$hour,
			"Minute"=>$minutes,
			"Second"=>$seconds,
			"Timezone"=>$timezone);
		}
		
		//set unset value (Contributor : Babbo Naria)
		if(is_null($resultvar["Hour"])) {
		$resultvar["Hour"]=0;
		}
		if(is_null($resultvar["Minute"])) {
		$resultvar["Minute"]=0;
		}
		if(is_null($resultvar["Second"])) {
		$resultvar["Second"]=0;
		}
		if(is_null($resultvar["Year"])) {
		$resultvar["Year"]=1970;
		}
		if(is_null($resultvar["Month"])) {
		$resultvar["Month"]=01;
		}
		if(is_null($resultvar["Day"])) {
		$resultvar["Day"]=01;
		}

		return ($localize)?$this->Localize($resultvar):$resultvar;
	}
	/**
	 * Returns the difference between two days as datetime array
	 *
	 * @param string $pattern1
	 * @param string $date1
	 * @param string $pattern2
	 * @param string $date2
	 * @return array
	 */
	function diffDate($pattern1,$date1,$pattern2,$date2){
		$pdate1 = $this->parseDate($pattern1,$date1);
		$pdate2 = $this->parseDate($pattern2,$date2);
		$compare = $this->Compare($pdate1,$pdate2);
		if($compare==1){
			$ndate = $pdate1;
			$odate = $pdate2;
		}elseif($compare==-1){
			$ndate = $pdate2;
			$odate = $pdate1;
		}else{
			return array("Year"=>0,"Month"=>0,"Day"=>0,"Hour"=>0,"Minute"=>0,"Second"=>0);
		}
		$hour = intval($ndate["Hour"])-intval($odate["Hour"]);
		$minute = intval($ndate["Minute"])-intval($odate["Minute"]);
		$second = intval($ndate["Second"])-intval($odate["Second"]);
		$month = intval($ndate["Month"])-intval($odate["Month"]);
		$day = intval($ndate["Day"])-intval($odate["Day"]);
		$year = intval($ndate["Year"])-intval($odate["Year"]);
		$difference = mktime($hour,$minute,$second,($month+1),($day+1),($year+1970));
		$result = getdate($difference);
			$resultvar = array(
			"Year"=>$result["year"]-1970,
			"Month"=>array_search($result["month"],$this->month),
			"Day"=>$result["mday"]-1,
			"Hour"=>$result["hours"],
			"Minute"=>$result["minutes"],
			"Second"=>$result["seconds"],
			"Timezone"=>$this->timezone);
		return $resultvar;
	}
	/**
	 * Reformats the given date as same as the first date() function variable.
	 *
	 * @param string $patternTo
	 * @param string $patternFrom
	 * @param string $date
	 * @return string
	 */
	function Format($patternTo,$patternFrom,$date){
		$temp = $this->parseDate($patternFrom,$date);
		return date($patternTo,mktime($temp["Hour"],$temp["Minute"],$temp["Second"],$temp["Month"],$temp["Day"],$temp["Year"]));
	}
	
	/**
	 * Not Completed localization function. Adds time to result which is defined by user in $this->timezone,
	 *
	 * @param array $date
	 * @return array
	 */
	function Localize($date){
		$zonehour = $date["Hour"] + intval(substr($this->timezone,0,1).substr($this->timezone,1,2));
		$zonemin = $date["Minute"] + intval(substr($this->timezone,3,2));
		$newdate = mktime($zonehour,$zonemin,intval($date["Second"]),intval($date["Month"]),intval($date["Day"]),intval($date["Year"])); //Burada bir hata oldu.
		$result = getdate($newdate);
			$resultvar = array(
			"Year"=>$result["year"],
			"Month"=>array_search($result["month"],$this->month)+1,
			"Day"=>$result["mday"],
			"Hour"=>$result["hours"],
			"Minute"=>$result["minutes"],
			"Second"=>$result["seconds"],
			"Timezone"=>"");
		return $resultvar;
	}
	/**
	 * Compares two date, returns 1 if first is bigger, -1 if second is bigger and 0 if they are same
	 *
	 * @param array $date1
	 * @param array $date2
	 * @return int
	 */
	function Compare($date1,$date2){
		if($date1["Year"]>$date2["Year"]) return 1;
		if($date1["Year"]<$date2["Year"]) return -1;
		if($date1["Month"]>$date2["Month"]) return 1;
		if($date1["Month"]<$date2["Month"]) return -1;
		if($date1["Day"]>$date2["Day"]) return 1;
		if($date1["Day"]<$date2["Day"]) return -1;
		if($date1["Hour"]>$date2["Hour"]) return 1;
		if($date1["Hour"]<$date2["Hour"]) return -1;
		if($date1["Minute"]>$date2["Minute"]) return 1;
		if($date1["Minute"]<$date2["Minute"]) return -1;
		if($date1["Second"]>$date2["Second"]) return 1;
		if($date1["Second"]<$date2["Second"]) return -1;
		return 0;
	}
}

?>