1026 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1026 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
| <?php
 | ||
| /**
 | ||
|  * SimplePie
 | ||
|  *
 | ||
|  * A PHP-Based RSS and Atom Feed Framework.
 | ||
|  * Takes the hard work out of managing a complete RSS/Atom solution.
 | ||
|  *
 | ||
|  * Copyright (c) 2004-2016, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
 | ||
|  * All rights reserved.
 | ||
|  *
 | ||
|  * Redistribution and use in source and binary forms, with or without modification, are
 | ||
|  * permitted provided that the following conditions are met:
 | ||
|  *
 | ||
|  * 	* Redistributions of source code must retain the above copyright notice, this list of
 | ||
|  * 	  conditions and the following disclaimer.
 | ||
|  *
 | ||
|  * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 | ||
|  * 	  of conditions and the following disclaimer in the documentation and/or other materials
 | ||
|  * 	  provided with the distribution.
 | ||
|  *
 | ||
|  * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 | ||
|  * 	  to endorse or promote products derived from this software without specific prior
 | ||
|  * 	  written permission.
 | ||
|  *
 | ||
|  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 | ||
|  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 | ||
|  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 | ||
|  * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | ||
|  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 | ||
|  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | ||
|  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 | ||
|  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | ||
|  * POSSIBILITY OF SUCH DAMAGE.
 | ||
|  *
 | ||
|  * @package SimplePie
 | ||
|  * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
 | ||
|  * @author Ryan Parman
 | ||
|  * @author Sam Sneddon
 | ||
|  * @author Ryan McCue
 | ||
|  * @link http://simplepie.org/ SimplePie
 | ||
|  * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 | ||
|  */
 | ||
| 
 | ||
| 
 | ||
| /**
 | ||
|  * Date Parser
 | ||
|  *
 | ||
|  * @package SimplePie
 | ||
|  * @subpackage Parsing
 | ||
|  */
 | ||
| class SimplePie_Parse_Date
 | ||
| {
 | ||
| 	/**
 | ||
| 	 * Input data
 | ||
| 	 *
 | ||
| 	 * @access protected
 | ||
| 	 * @var string
 | ||
| 	 */
 | ||
| 	var $date;
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * List of days, calendar day name => ordinal day number in the week
 | ||
| 	 *
 | ||
| 	 * @access protected
 | ||
| 	 * @var array
 | ||
| 	 */
 | ||
| 	var $day = array(
 | ||
| 		// English
 | ||
| 		'mon' => 1,
 | ||
| 		'monday' => 1,
 | ||
| 		'tue' => 2,
 | ||
| 		'tuesday' => 2,
 | ||
| 		'wed' => 3,
 | ||
| 		'wednesday' => 3,
 | ||
| 		'thu' => 4,
 | ||
| 		'thursday' => 4,
 | ||
| 		'fri' => 5,
 | ||
| 		'friday' => 5,
 | ||
| 		'sat' => 6,
 | ||
| 		'saturday' => 6,
 | ||
| 		'sun' => 7,
 | ||
| 		'sunday' => 7,
 | ||
| 		// Dutch
 | ||
| 		'maandag' => 1,
 | ||
| 		'dinsdag' => 2,
 | ||
| 		'woensdag' => 3,
 | ||
| 		'donderdag' => 4,
 | ||
| 		'vrijdag' => 5,
 | ||
| 		'zaterdag' => 6,
 | ||
| 		'zondag' => 7,
 | ||
| 		// French
 | ||
| 		'lundi' => 1,
 | ||
| 		'mardi' => 2,
 | ||
| 		'mercredi' => 3,
 | ||
| 		'jeudi' => 4,
 | ||
| 		'vendredi' => 5,
 | ||
| 		'samedi' => 6,
 | ||
| 		'dimanche' => 7,
 | ||
| 		// German
 | ||
| 		'montag' => 1,
 | ||
| 		'mo' => 1,
 | ||
| 		'dienstag' => 2,
 | ||
| 		'di' => 2,
 | ||
| 		'mittwoch' => 3,
 | ||
| 		'mi' => 3,
 | ||
| 		'donnerstag' => 4,
 | ||
| 		'do' => 4,
 | ||
| 		'freitag' => 5,
 | ||
| 		'fr' => 5,
 | ||
| 		'samstag' => 6,
 | ||
| 		'sa' => 6,
 | ||
| 		'sonnabend' => 6,
 | ||
| 		// AFAIK no short form for sonnabend
 | ||
| 		'so' => 7,
 | ||
| 		'sonntag' => 7,
 | ||
| 		// Italian
 | ||
| 		'lunedì' => 1,
 | ||
| 		'martedì' => 2,
 | ||
| 		'mercoledì' => 3,
 | ||
| 		'giovedì' => 4,
 | ||
| 		'venerdì' => 5,
 | ||
| 		'sabato' => 6,
 | ||
| 		'domenica' => 7,
 | ||
| 		// Spanish
 | ||
| 		'lunes' => 1,
 | ||
| 		'martes' => 2,
 | ||
| 		'miércoles' => 3,
 | ||
| 		'jueves' => 4,
 | ||
| 		'viernes' => 5,
 | ||
| 		'sábado' => 6,
 | ||
| 		'domingo' => 7,
 | ||
| 		// Finnish
 | ||
| 		'maanantai' => 1,
 | ||
| 		'tiistai' => 2,
 | ||
| 		'keskiviikko' => 3,
 | ||
| 		'torstai' => 4,
 | ||
| 		'perjantai' => 5,
 | ||
| 		'lauantai' => 6,
 | ||
| 		'sunnuntai' => 7,
 | ||
| 		// Hungarian
 | ||
| 		'hétfő' => 1,
 | ||
| 		'kedd' => 2,
 | ||
| 		'szerda' => 3,
 | ||
| 		'csütörtok' => 4,
 | ||
| 		'péntek' => 5,
 | ||
| 		'szombat' => 6,
 | ||
| 		'vasárnap' => 7,
 | ||
| 		// Greek
 | ||
| 		'Δευ' => 1,
 | ||
| 		'Τρι' => 2,
 | ||
| 		'Τετ' => 3,
 | ||
| 		'Πεμ' => 4,
 | ||
| 		'Παρ' => 5,
 | ||
| 		'Σαβ' => 6,
 | ||
| 		'Κυρ' => 7,
 | ||
| 		// Russian
 | ||
| 		'Пн.' => 1,
 | ||
| 		'Вт.' => 2,
 | ||
| 		'Ср.' => 3,
 | ||
| 		'Чт.' => 4,
 | ||
| 		'Пт.' => 5,
 | ||
| 		'Сб.' => 6,
 | ||
| 		'Вс.' => 7,
 | ||
| 	);
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * List of months, calendar month name => calendar month number
 | ||
| 	 *
 | ||
| 	 * @access protected
 | ||
| 	 * @var array
 | ||
| 	 */
 | ||
| 	var $month = array(
 | ||
| 		// English
 | ||
| 		'jan' => 1,
 | ||
| 		'january' => 1,
 | ||
| 		'feb' => 2,
 | ||
| 		'february' => 2,
 | ||
| 		'mar' => 3,
 | ||
| 		'march' => 3,
 | ||
| 		'apr' => 4,
 | ||
| 		'april' => 4,
 | ||
| 		'may' => 5,
 | ||
| 		// No long form of May
 | ||
| 		'jun' => 6,
 | ||
| 		'june' => 6,
 | ||
| 		'jul' => 7,
 | ||
| 		'july' => 7,
 | ||
| 		'aug' => 8,
 | ||
| 		'august' => 8,
 | ||
| 		'sep' => 9,
 | ||
| 		'september' => 9,
 | ||
| 		'oct' => 10,
 | ||
| 		'october' => 10,
 | ||
| 		'nov' => 11,
 | ||
| 		'november' => 11,
 | ||
| 		'dec' => 12,
 | ||
| 		'december' => 12,
 | ||
| 		// Dutch
 | ||
| 		'januari' => 1,
 | ||
| 		'februari' => 2,
 | ||
| 		'maart' => 3,
 | ||
| 		'april' => 4,
 | ||
| 		'mei' => 5,
 | ||
| 		'juni' => 6,
 | ||
| 		'juli' => 7,
 | ||
| 		'augustus' => 8,
 | ||
| 		'september' => 9,
 | ||
| 		'oktober' => 10,
 | ||
| 		'november' => 11,
 | ||
| 		'december' => 12,
 | ||
| 		// French
 | ||
| 		'janvier' => 1,
 | ||
| 		'février' => 2,
 | ||
| 		'mars' => 3,
 | ||
| 		'avril' => 4,
 | ||
| 		'mai' => 5,
 | ||
| 		'juin' => 6,
 | ||
| 		'juillet' => 7,
 | ||
| 		'août' => 8,
 | ||
| 		'septembre' => 9,
 | ||
| 		'octobre' => 10,
 | ||
| 		'novembre' => 11,
 | ||
| 		'décembre' => 12,
 | ||
| 		// German
 | ||
| 		'januar' => 1,
 | ||
| 		'jan' => 1,
 | ||
| 		'februar' => 2,
 | ||
| 		'feb' => 2,
 | ||
| 		'märz' => 3,
 | ||
| 		'mär' => 3,
 | ||
| 		'april' => 4,
 | ||
| 		'apr' => 4,
 | ||
| 		'mai' => 5, // no short form for may
 | ||
| 		'juni' => 6,
 | ||
| 		'jun' => 6,
 | ||
| 		'juli' => 7,
 | ||
| 		'jul' => 7,
 | ||
| 		'august' => 8,
 | ||
| 		'aug' => 8,
 | ||
| 		'september' => 9,
 | ||
| 		'sep' => 9,
 | ||
| 		'oktober' => 10,
 | ||
| 		'okt' => 10,
 | ||
| 		'november' => 11,
 | ||
| 		'nov' => 11,
 | ||
| 		'dezember' => 12,
 | ||
| 		'dez' => 12,
 | ||
| 		// Italian
 | ||
| 		'gennaio' => 1,
 | ||
| 		'febbraio' => 2,
 | ||
| 		'marzo' => 3,
 | ||
| 		'aprile' => 4,
 | ||
| 		'maggio' => 5,
 | ||
| 		'giugno' => 6,
 | ||
| 		'luglio' => 7,
 | ||
| 		'agosto' => 8,
 | ||
| 		'settembre' => 9,
 | ||
| 		'ottobre' => 10,
 | ||
| 		'novembre' => 11,
 | ||
| 		'dicembre' => 12,
 | ||
| 		// Spanish
 | ||
| 		'enero' => 1,
 | ||
| 		'febrero' => 2,
 | ||
| 		'marzo' => 3,
 | ||
| 		'abril' => 4,
 | ||
| 		'mayo' => 5,
 | ||
| 		'junio' => 6,
 | ||
| 		'julio' => 7,
 | ||
| 		'agosto' => 8,
 | ||
| 		'septiembre' => 9,
 | ||
| 		'setiembre' => 9,
 | ||
| 		'octubre' => 10,
 | ||
| 		'noviembre' => 11,
 | ||
| 		'diciembre' => 12,
 | ||
| 		// Finnish
 | ||
| 		'tammikuu' => 1,
 | ||
| 		'helmikuu' => 2,
 | ||
| 		'maaliskuu' => 3,
 | ||
| 		'huhtikuu' => 4,
 | ||
| 		'toukokuu' => 5,
 | ||
| 		'kesäkuu' => 6,
 | ||
| 		'heinäkuu' => 7,
 | ||
| 		'elokuu' => 8,
 | ||
| 		'suuskuu' => 9,
 | ||
| 		'lokakuu' => 10,
 | ||
| 		'marras' => 11,
 | ||
| 		'joulukuu' => 12,
 | ||
| 		// Hungarian
 | ||
| 		'január' => 1,
 | ||
| 		'február' => 2,
 | ||
| 		'március' => 3,
 | ||
| 		'április' => 4,
 | ||
| 		'május' => 5,
 | ||
| 		'június' => 6,
 | ||
| 		'július' => 7,
 | ||
| 		'augusztus' => 8,
 | ||
| 		'szeptember' => 9,
 | ||
| 		'október' => 10,
 | ||
| 		'november' => 11,
 | ||
| 		'december' => 12,
 | ||
| 		// Greek
 | ||
| 		'Ιαν' => 1,
 | ||
| 		'Φεβ' => 2,
 | ||
| 		'Μάώ' => 3,
 | ||
| 		'Μαώ' => 3,
 | ||
| 		'Απρ' => 4,
 | ||
| 		'Μάι' => 5,
 | ||
| 		'Μαϊ' => 5,
 | ||
| 		'Μαι' => 5,
 | ||
| 		'Ιούν' => 6,
 | ||
| 		'Ιον' => 6,
 | ||
| 		'Ιούλ' => 7,
 | ||
| 		'Ιολ' => 7,
 | ||
| 		'Αύγ' => 8,
 | ||
| 		'Αυγ' => 8,
 | ||
| 		'Σεπ' => 9,
 | ||
| 		'Οκτ' => 10,
 | ||
| 		'Νοέ' => 11,
 | ||
| 		'Δεκ' => 12,		
 | ||
| 		// Russian
 | ||
| 		'Янв' => 1,
 | ||
| 		'января' => 1,
 | ||
| 		'Фев' => 2,
 | ||
| 		'февраля' => 2,
 | ||
| 		'Мар' => 3,
 | ||
| 		'марта' => 3,
 | ||
| 		'Апр' => 4,
 | ||
| 		'апреля' => 4,
 | ||
| 		'Май' => 5,
 | ||
| 		'мая' => 5,
 | ||
| 		'Июн' => 6,
 | ||
| 		'июня' => 6,
 | ||
| 		'Июл' => 7,
 | ||
| 		'июля' => 7,
 | ||
| 		'Авг' => 8,
 | ||
| 		'августа' => 8,
 | ||
| 		'Сен' => 9,
 | ||
| 		'сентября' => 9,
 | ||
| 		'Окт' => 10,
 | ||
| 		'октября' => 10,
 | ||
| 		'Ноя' => 11,
 | ||
| 		'ноября' => 11,
 | ||
| 		'Дек' => 12,
 | ||
| 		'декабря' => 12,
 | ||
| 
 | ||
| 	);
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * List of timezones, abbreviation => offset from UTC
 | ||
| 	 *
 | ||
| 	 * @access protected
 | ||
| 	 * @var array
 | ||
| 	 */
 | ||
| 	var $timezone = array(
 | ||
| 		'ACDT' => 37800,
 | ||
| 		'ACIT' => 28800,
 | ||
| 		'ACST' => 34200,
 | ||
| 		'ACT' => -18000,
 | ||
| 		'ACWDT' => 35100,
 | ||
| 		'ACWST' => 31500,
 | ||
| 		'AEDT' => 39600,
 | ||
| 		'AEST' => 36000,
 | ||
| 		'AFT' => 16200,
 | ||
| 		'AKDT' => -28800,
 | ||
| 		'AKST' => -32400,
 | ||
| 		'AMDT' => 18000,
 | ||
| 		'AMT' => -14400,
 | ||
| 		'ANAST' => 46800,
 | ||
| 		'ANAT' => 43200,
 | ||
| 		'ART' => -10800,
 | ||
| 		'AZOST' => -3600,
 | ||
| 		'AZST' => 18000,
 | ||
| 		'AZT' => 14400,
 | ||
| 		'BIOT' => 21600,
 | ||
| 		'BIT' => -43200,
 | ||
| 		'BOT' => -14400,
 | ||
| 		'BRST' => -7200,
 | ||
| 		'BRT' => -10800,
 | ||
| 		'BST' => 3600,
 | ||
| 		'BTT' => 21600,
 | ||
| 		'CAST' => 18000,
 | ||
| 		'CAT' => 7200,
 | ||
| 		'CCT' => 23400,
 | ||
| 		'CDT' => -18000,
 | ||
| 		'CEDT' => 7200,
 | ||
| 		'CEST' => 7200,
 | ||
| 		'CET' => 3600,
 | ||
| 		'CGST' => -7200,
 | ||
| 		'CGT' => -10800,
 | ||
| 		'CHADT' => 49500,
 | ||
| 		'CHAST' => 45900,
 | ||
| 		'CIST' => -28800,
 | ||
| 		'CKT' => -36000,
 | ||
| 		'CLDT' => -10800,
 | ||
| 		'CLST' => -14400,
 | ||
| 		'COT' => -18000,
 | ||
| 		'CST' => -21600,
 | ||
| 		'CVT' => -3600,
 | ||
| 		'CXT' => 25200,
 | ||
| 		'DAVT' => 25200,
 | ||
| 		'DTAT' => 36000,
 | ||
| 		'EADT' => -18000,
 | ||
| 		'EAST' => -21600,
 | ||
| 		'EAT' => 10800,
 | ||
| 		'ECT' => -18000,
 | ||
| 		'EDT' => -14400,
 | ||
| 		'EEST' => 10800,
 | ||
| 		'EET' => 7200,
 | ||
| 		'EGT' => -3600,
 | ||
| 		'EKST' => 21600,
 | ||
| 		'EST' => -18000,
 | ||
| 		'FJT' => 43200,
 | ||
| 		'FKDT' => -10800,
 | ||
| 		'FKST' => -14400,
 | ||
| 		'FNT' => -7200,
 | ||
| 		'GALT' => -21600,
 | ||
| 		'GEDT' => 14400,
 | ||
| 		'GEST' => 10800,
 | ||
| 		'GFT' => -10800,
 | ||
| 		'GILT' => 43200,
 | ||
| 		'GIT' => -32400,
 | ||
| 		'GST' => 14400,
 | ||
| 		'GST' => -7200,
 | ||
| 		'GYT' => -14400,
 | ||
| 		'HAA' => -10800,
 | ||
| 		'HAC' => -18000,
 | ||
| 		'HADT' => -32400,
 | ||
| 		'HAE' => -14400,
 | ||
| 		'HAP' => -25200,
 | ||
| 		'HAR' => -21600,
 | ||
| 		'HAST' => -36000,
 | ||
| 		'HAT' => -9000,
 | ||
| 		'HAY' => -28800,
 | ||
| 		'HKST' => 28800,
 | ||
| 		'HMT' => 18000,
 | ||
| 		'HNA' => -14400,
 | ||
| 		'HNC' => -21600,
 | ||
| 		'HNE' => -18000,
 | ||
| 		'HNP' => -28800,
 | ||
| 		'HNR' => -25200,
 | ||
| 		'HNT' => -12600,
 | ||
| 		'HNY' => -32400,
 | ||
| 		'IRDT' => 16200,
 | ||
| 		'IRKST' => 32400,
 | ||
| 		'IRKT' => 28800,
 | ||
| 		'IRST' => 12600,
 | ||
| 		'JFDT' => -10800,
 | ||
| 		'JFST' => -14400,
 | ||
| 		'JST' => 32400,
 | ||
| 		'KGST' => 21600,
 | ||
| 		'KGT' => 18000,
 | ||
| 		'KOST' => 39600,
 | ||
| 		'KOVST' => 28800,
 | ||
| 		'KOVT' => 25200,
 | ||
| 		'KRAST' => 28800,
 | ||
| 		'KRAT' => 25200,
 | ||
| 		'KST' => 32400,
 | ||
| 		'LHDT' => 39600,
 | ||
| 		'LHST' => 37800,
 | ||
| 		'LINT' => 50400,
 | ||
| 		'LKT' => 21600,
 | ||
| 		'MAGST' => 43200,
 | ||
| 		'MAGT' => 39600,
 | ||
| 		'MAWT' => 21600,
 | ||
| 		'MDT' => -21600,
 | ||
| 		'MESZ' => 7200,
 | ||
| 		'MEZ' => 3600,
 | ||
| 		'MHT' => 43200,
 | ||
| 		'MIT' => -34200,
 | ||
| 		'MNST' => 32400,
 | ||
| 		'MSDT' => 14400,
 | ||
| 		'MSST' => 10800,
 | ||
| 		'MST' => -25200,
 | ||
| 		'MUT' => 14400,
 | ||
| 		'MVT' => 18000,
 | ||
| 		'MYT' => 28800,
 | ||
| 		'NCT' => 39600,
 | ||
| 		'NDT' => -9000,
 | ||
| 		'NFT' => 41400,
 | ||
| 		'NMIT' => 36000,
 | ||
| 		'NOVST' => 25200,
 | ||
| 		'NOVT' => 21600,
 | ||
| 		'NPT' => 20700,
 | ||
| 		'NRT' => 43200,
 | ||
| 		'NST' => -12600,
 | ||
| 		'NUT' => -39600,
 | ||
| 		'NZDT' => 46800,
 | ||
| 		'NZST' => 43200,
 | ||
| 		'OMSST' => 25200,
 | ||
| 		'OMST' => 21600,
 | ||
| 		'PDT' => -25200,
 | ||
| 		'PET' => -18000,
 | ||
| 		'PETST' => 46800,
 | ||
| 		'PETT' => 43200,
 | ||
| 		'PGT' => 36000,
 | ||
| 		'PHOT' => 46800,
 | ||
| 		'PHT' => 28800,
 | ||
| 		'PKT' => 18000,
 | ||
| 		'PMDT' => -7200,
 | ||
| 		'PMST' => -10800,
 | ||
| 		'PONT' => 39600,
 | ||
| 		'PST' => -28800,
 | ||
| 		'PWT' => 32400,
 | ||
| 		'PYST' => -10800,
 | ||
| 		'PYT' => -14400,
 | ||
| 		'RET' => 14400,
 | ||
| 		'ROTT' => -10800,
 | ||
| 		'SAMST' => 18000,
 | ||
| 		'SAMT' => 14400,
 | ||
| 		'SAST' => 7200,
 | ||
| 		'SBT' => 39600,
 | ||
| 		'SCDT' => 46800,
 | ||
| 		'SCST' => 43200,
 | ||
| 		'SCT' => 14400,
 | ||
| 		'SEST' => 3600,
 | ||
| 		'SGT' => 28800,
 | ||
| 		'SIT' => 28800,
 | ||
| 		'SRT' => -10800,
 | ||
| 		'SST' => -39600,
 | ||
| 		'SYST' => 10800,
 | ||
| 		'SYT' => 7200,
 | ||
| 		'TFT' => 18000,
 | ||
| 		'THAT' => -36000,
 | ||
| 		'TJT' => 18000,
 | ||
| 		'TKT' => -36000,
 | ||
| 		'TMT' => 18000,
 | ||
| 		'TOT' => 46800,
 | ||
| 		'TPT' => 32400,
 | ||
| 		'TRUT' => 36000,
 | ||
| 		'TVT' => 43200,
 | ||
| 		'TWT' => 28800,
 | ||
| 		'UYST' => -7200,
 | ||
| 		'UYT' => -10800,
 | ||
| 		'UZT' => 18000,
 | ||
| 		'VET' => -14400,
 | ||
| 		'VLAST' => 39600,
 | ||
| 		'VLAT' => 36000,
 | ||
| 		'VOST' => 21600,
 | ||
| 		'VUT' => 39600,
 | ||
| 		'WAST' => 7200,
 | ||
| 		'WAT' => 3600,
 | ||
| 		'WDT' => 32400,
 | ||
| 		'WEST' => 3600,
 | ||
| 		'WFT' => 43200,
 | ||
| 		'WIB' => 25200,
 | ||
| 		'WIT' => 32400,
 | ||
| 		'WITA' => 28800,
 | ||
| 		'WKST' => 18000,
 | ||
| 		'WST' => 28800,
 | ||
| 		'YAKST' => 36000,
 | ||
| 		'YAKT' => 32400,
 | ||
| 		'YAPT' => 36000,
 | ||
| 		'YEKST' => 21600,
 | ||
| 		'YEKT' => 18000,
 | ||
| 	);
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Cached PCRE for SimplePie_Parse_Date::$day
 | ||
| 	 *
 | ||
| 	 * @access protected
 | ||
| 	 * @var string
 | ||
| 	 */
 | ||
| 	var $day_pcre;
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Cached PCRE for SimplePie_Parse_Date::$month
 | ||
| 	 *
 | ||
| 	 * @access protected
 | ||
| 	 * @var string
 | ||
| 	 */
 | ||
| 	var $month_pcre;
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Array of user-added callback methods
 | ||
| 	 *
 | ||
| 	 * @access private
 | ||
| 	 * @var array
 | ||
| 	 */
 | ||
| 	var $built_in = array();
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Array of user-added callback methods
 | ||
| 	 *
 | ||
| 	 * @access private
 | ||
| 	 * @var array
 | ||
| 	 */
 | ||
| 	var $user = array();
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Create new SimplePie_Parse_Date object, and set self::day_pcre,
 | ||
| 	 * self::month_pcre, and self::built_in
 | ||
| 	 *
 | ||
| 	 * @access private
 | ||
| 	 */
 | ||
| 	public function __construct()
 | ||
| 	{
 | ||
| 		$this->day_pcre = '(' . implode('|', array_keys($this->day)) . ')';
 | ||
| 		$this->month_pcre = '(' . implode('|', array_keys($this->month)) . ')';
 | ||
| 
 | ||
| 		static $cache;
 | ||
| 		if (!isset($cache[get_class($this)]))
 | ||
| 		{
 | ||
| 			$all_methods = get_class_methods($this);
 | ||
| 
 | ||
| 			foreach ($all_methods as $method)
 | ||
| 			{
 | ||
| 				if (strtolower(substr($method, 0, 5)) === 'date_')
 | ||
| 				{
 | ||
| 					$cache[get_class($this)][] = $method;
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		foreach ($cache[get_class($this)] as $method)
 | ||
| 		{
 | ||
| 			$this->built_in[] = $method;
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Get the object
 | ||
| 	 *
 | ||
| 	 * @access public
 | ||
| 	 */
 | ||
| 	public static function get()
 | ||
| 	{
 | ||
| 		static $object;
 | ||
| 		if (!$object)
 | ||
| 		{
 | ||
| 			$object = new SimplePie_Parse_Date;
 | ||
| 		}
 | ||
| 		return $object;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Parse a date
 | ||
| 	 *
 | ||
| 	 * @final
 | ||
| 	 * @access public
 | ||
| 	 * @param string $date Date to parse
 | ||
| 	 * @return int Timestamp corresponding to date string, or false on failure
 | ||
| 	 */
 | ||
| 	public function parse($date)
 | ||
| 	{
 | ||
| 		foreach ($this->user as $method)
 | ||
| 		{
 | ||
| 			if (($returned = call_user_func($method, $date)) !== false)
 | ||
| 			{
 | ||
| 				return $returned;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		foreach ($this->built_in as $method)
 | ||
| 		{
 | ||
| 			if (($returned = call_user_func(array($this, $method), $date)) !== false)
 | ||
| 			{
 | ||
| 				return $returned;
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		return false;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Add a callback method to parse a date
 | ||
| 	 *
 | ||
| 	 * @final
 | ||
| 	 * @access public
 | ||
| 	 * @param callback $callback
 | ||
| 	 */
 | ||
| 	public function add_callback($callback)
 | ||
| 	{
 | ||
| 		if (is_callable($callback))
 | ||
| 		{
 | ||
| 			$this->user[] = $callback;
 | ||
| 		}
 | ||
| 		else
 | ||
| 		{
 | ||
| 			trigger_error('User-supplied function must be a valid callback', E_USER_WARNING);
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as
 | ||
| 	 * well as allowing any of upper or lower case "T", horizontal tabs, or
 | ||
| 	 * spaces to be used as the time separator (including more than one))
 | ||
| 	 *
 | ||
| 	 * @access protected
 | ||
| 	 * @return int Timestamp
 | ||
| 	 */
 | ||
| 	public function date_w3cdtf($date)
 | ||
| 	{
 | ||
| 		static $pcre;
 | ||
| 		if (!$pcre)
 | ||
| 		{
 | ||
| 			$year = '([0-9]{4})';
 | ||
| 			$month = $day = $hour = $minute = $second = '([0-9]{2})';
 | ||
| 			$decimal = '([0-9]*)';
 | ||
| 			$zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))';
 | ||
| 			$pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/';
 | ||
| 		}
 | ||
| 		if (preg_match($pcre, $date, $match))
 | ||
| 		{
 | ||
| 			/*
 | ||
| 			Capturing subpatterns:
 | ||
| 			1: Year
 | ||
| 			2: Month
 | ||
| 			3: Day
 | ||
| 			4: Hour
 | ||
| 			5: Minute
 | ||
| 			6: Second
 | ||
| 			7: Decimal fraction of a second
 | ||
| 			8: Zulu
 | ||
| 			9: Timezone ±
 | ||
| 			10: Timezone hours
 | ||
| 			11: Timezone minutes
 | ||
| 			*/
 | ||
| 
 | ||
| 			// Fill in empty matches
 | ||
| 			for ($i = count($match); $i <= 3; $i++)
 | ||
| 			{
 | ||
| 				$match[$i] = '1';
 | ||
| 			}
 | ||
| 
 | ||
| 			for ($i = count($match); $i <= 7; $i++)
 | ||
| 			{
 | ||
| 				$match[$i] = '0';
 | ||
| 			}
 | ||
| 
 | ||
| 			// Numeric timezone
 | ||
| 			if (isset($match[9]) && $match[9] !== '')
 | ||
| 			{
 | ||
| 				$timezone = $match[10] * 3600;
 | ||
| 				$timezone += $match[11] * 60;
 | ||
| 				if ($match[9] === '-')
 | ||
| 				{
 | ||
| 					$timezone = 0 - $timezone;
 | ||
| 				}
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				$timezone = 0;
 | ||
| 			}
 | ||
| 
 | ||
| 			// Convert the number of seconds to an integer, taking decimals into account
 | ||
| 			$second = round((int)$match[6] + (int)$match[7] / (10 ** strlen($match[7])));
 | ||
| 
 | ||
| 			return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
 | ||
| 		}
 | ||
| 
 | ||
| 		return false;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Remove RFC822 comments
 | ||
| 	 *
 | ||
| 	 * @access protected
 | ||
| 	 * @param string $data Data to strip comments from
 | ||
| 	 * @return string Comment stripped string
 | ||
| 	 */
 | ||
| 	public function remove_rfc2822_comments($string)
 | ||
| 	{
 | ||
| 		$string = (string) $string;
 | ||
| 		$position = 0;
 | ||
| 		$length = strlen($string);
 | ||
| 		$depth = 0;
 | ||
| 
 | ||
| 		$output = '';
 | ||
| 
 | ||
| 		while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
 | ||
| 		{
 | ||
| 			$output .= substr($string, $position, $pos - $position);
 | ||
| 			$position = $pos + 1;
 | ||
| 			if ($pos === 0 || $string[$pos - 1] !== '\\')
 | ||
| 			{
 | ||
| 				$depth++;
 | ||
| 				while ($depth && $position < $length)
 | ||
| 				{
 | ||
| 					$position += strcspn($string, '()', $position);
 | ||
| 					if ($string[$position - 1] === '\\')
 | ||
| 					{
 | ||
| 						$position++;
 | ||
| 						continue;
 | ||
| 					}
 | ||
| 					elseif (isset($string[$position]))
 | ||
| 					{
 | ||
| 						switch ($string[$position])
 | ||
| 						{
 | ||
| 							case '(':
 | ||
| 								$depth++;
 | ||
| 								break;
 | ||
| 
 | ||
| 							case ')':
 | ||
| 								$depth--;
 | ||
| 								break;
 | ||
| 						}
 | ||
| 						$position++;
 | ||
| 					}
 | ||
| 					else
 | ||
| 					{
 | ||
| 						break;
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				$output .= '(';
 | ||
| 			}
 | ||
| 		}
 | ||
| 		$output .= substr($string, $position);
 | ||
| 
 | ||
| 		return $output;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Parse RFC2822's date format
 | ||
| 	 *
 | ||
| 	 * @access protected
 | ||
| 	 * @return int Timestamp
 | ||
| 	 */
 | ||
| 	public function date_rfc2822($date)
 | ||
| 	{
 | ||
| 		static $pcre;
 | ||
| 		if (!$pcre)
 | ||
| 		{
 | ||
| 			$wsp = '[\x09\x20]';
 | ||
| 			$fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)';
 | ||
| 			$optional_fws = $fws . '?';
 | ||
| 			$day_name = $this->day_pcre;
 | ||
| 			$month = $this->month_pcre;
 | ||
| 			$day = '([0-9]{1,2})';
 | ||
| 			$hour = $minute = $second = '([0-9]{2})';
 | ||
| 			$year = '([0-9]{2,4})';
 | ||
| 			$num_zone = '([+\-])([0-9]{2})([0-9]{2})';
 | ||
| 			$character_zone = '([A-Z]{1,5})';
 | ||
| 			$zone = '(?:' . $num_zone . '|' . $character_zone . ')';
 | ||
| 			$pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i';
 | ||
| 		}
 | ||
| 		if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match))
 | ||
| 		{
 | ||
| 			/*
 | ||
| 			Capturing subpatterns:
 | ||
| 			1: Day name
 | ||
| 			2: Day
 | ||
| 			3: Month
 | ||
| 			4: Year
 | ||
| 			5: Hour
 | ||
| 			6: Minute
 | ||
| 			7: Second
 | ||
| 			8: Timezone ±
 | ||
| 			9: Timezone hours
 | ||
| 			10: Timezone minutes
 | ||
| 			11: Alphabetic timezone
 | ||
| 			*/
 | ||
| 
 | ||
| 			// Find the month number
 | ||
| 			$month = $this->month[strtolower($match[3])];
 | ||
| 
 | ||
| 			// Numeric timezone
 | ||
| 			if ($match[8] !== '')
 | ||
| 			{
 | ||
| 				$timezone = $match[9] * 3600;
 | ||
| 				$timezone += $match[10] * 60;
 | ||
| 				if ($match[8] === '-')
 | ||
| 				{
 | ||
| 					$timezone = 0 - $timezone;
 | ||
| 				}
 | ||
| 			}
 | ||
| 			// Character timezone
 | ||
| 			elseif (isset($this->timezone[strtoupper($match[11])]))
 | ||
| 			{
 | ||
| 				$timezone = $this->timezone[strtoupper($match[11])];
 | ||
| 			}
 | ||
| 			// Assume everything else to be -0000
 | ||
| 			else
 | ||
| 			{
 | ||
| 				$timezone = 0;
 | ||
| 			}
 | ||
| 
 | ||
| 			// Deal with 2/3 digit years
 | ||
| 			if ($match[4] < 50)
 | ||
| 			{
 | ||
| 				$match[4] += 2000;
 | ||
| 			}
 | ||
| 			elseif ($match[4] < 1000)
 | ||
| 			{
 | ||
| 				$match[4] += 1900;
 | ||
| 			}
 | ||
| 
 | ||
| 			// Second is optional, if it is empty set it to zero
 | ||
| 			if ($match[7] !== '')
 | ||
| 			{
 | ||
| 				$second = $match[7];
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				$second = 0;
 | ||
| 			}
 | ||
| 
 | ||
| 			return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone;
 | ||
| 		}
 | ||
| 
 | ||
| 		return false;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Parse RFC850's date format
 | ||
| 	 *
 | ||
| 	 * @access protected
 | ||
| 	 * @return int Timestamp
 | ||
| 	 */
 | ||
| 	public function date_rfc850($date)
 | ||
| 	{
 | ||
| 		static $pcre;
 | ||
| 		if (!$pcre)
 | ||
| 		{
 | ||
| 			$space = '[\x09\x20]+';
 | ||
| 			$day_name = $this->day_pcre;
 | ||
| 			$month = $this->month_pcre;
 | ||
| 			$day = '([0-9]{1,2})';
 | ||
| 			$year = $hour = $minute = $second = '([0-9]{2})';
 | ||
| 			$zone = '([A-Z]{1,5})';
 | ||
| 			$pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i';
 | ||
| 		}
 | ||
| 		if (preg_match($pcre, $date, $match))
 | ||
| 		{
 | ||
| 			/*
 | ||
| 			Capturing subpatterns:
 | ||
| 			1: Day name
 | ||
| 			2: Day
 | ||
| 			3: Month
 | ||
| 			4: Year
 | ||
| 			5: Hour
 | ||
| 			6: Minute
 | ||
| 			7: Second
 | ||
| 			8: Timezone
 | ||
| 			*/
 | ||
| 
 | ||
| 			// Month
 | ||
| 			$month = $this->month[strtolower($match[3])];
 | ||
| 
 | ||
| 			// Character timezone
 | ||
| 			if (isset($this->timezone[strtoupper($match[8])]))
 | ||
| 			{
 | ||
| 				$timezone = $this->timezone[strtoupper($match[8])];
 | ||
| 			}
 | ||
| 			// Assume everything else to be -0000
 | ||
| 			else
 | ||
| 			{
 | ||
| 				$timezone = 0;
 | ||
| 			}
 | ||
| 
 | ||
| 			// Deal with 2 digit year
 | ||
| 			if ($match[4] < 50)
 | ||
| 			{
 | ||
| 				$match[4] += 2000;
 | ||
| 			}
 | ||
| 			else
 | ||
| 			{
 | ||
| 				$match[4] += 1900;
 | ||
| 			}
 | ||
| 
 | ||
| 			return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone;
 | ||
| 		}
 | ||
| 
 | ||
| 		return false;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Parse C99's asctime()'s date format
 | ||
| 	 *
 | ||
| 	 * @access protected
 | ||
| 	 * @return int Timestamp
 | ||
| 	 */
 | ||
| 	public function date_asctime($date)
 | ||
| 	{
 | ||
| 		static $pcre;
 | ||
| 		if (!$pcre)
 | ||
| 		{
 | ||
| 			$space = '[\x09\x20]+';
 | ||
| 			$wday_name = $this->day_pcre;
 | ||
| 			$mon_name = $this->month_pcre;
 | ||
| 			$day = '([0-9]{1,2})';
 | ||
| 			$hour = $sec = $min = '([0-9]{2})';
 | ||
| 			$year = '([0-9]{4})';
 | ||
| 			$terminator = '\x0A?\x00?';
 | ||
| 			$pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i';
 | ||
| 		}
 | ||
| 		if (preg_match($pcre, $date, $match))
 | ||
| 		{
 | ||
| 			/*
 | ||
| 			Capturing subpatterns:
 | ||
| 			1: Day name
 | ||
| 			2: Month
 | ||
| 			3: Day
 | ||
| 			4: Hour
 | ||
| 			5: Minute
 | ||
| 			6: Second
 | ||
| 			7: Year
 | ||
| 			*/
 | ||
| 
 | ||
| 			$month = $this->month[strtolower($match[2])];
 | ||
| 			return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]);
 | ||
| 		}
 | ||
| 
 | ||
| 		return false;
 | ||
| 	}
 | ||
| 
 | ||
| 	/**
 | ||
| 	 * Parse dates using strtotime()
 | ||
| 	 *
 | ||
| 	 * @access protected
 | ||
| 	 * @return int Timestamp
 | ||
| 	 */
 | ||
| 	public function date_strtotime($date)
 | ||
| 	{
 | ||
| 		$strtotime = strtotime($date);
 | ||
| 		if ($strtotime === -1 || $strtotime === false)
 | ||
| 		{
 | ||
| 			return false;
 | ||
| 		}
 | ||
| 
 | ||
| 		return $strtotime;
 | ||
| 	}
 | ||
| }
 |