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;
 | 
						||
	}
 | 
						||
}
 |