1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
44:
45:
46: 47: 48: 49: 50: 51:
52: class SimplePie_Parse_Date
53: {
54: 55: 56: 57: 58: 59:
60: var $date;
61:
62: 63: 64: 65: 66: 67:
68: var $day = array(
69:
70: 'mon' => 1,
71: 'monday' => 1,
72: 'tue' => 2,
73: 'tuesday' => 2,
74: 'wed' => 3,
75: 'wednesday' => 3,
76: 'thu' => 4,
77: 'thursday' => 4,
78: 'fri' => 5,
79: 'friday' => 5,
80: 'sat' => 6,
81: 'saturday' => 6,
82: 'sun' => 7,
83: 'sunday' => 7,
84:
85: 'maandag' => 1,
86: 'dinsdag' => 2,
87: 'woensdag' => 3,
88: 'donderdag' => 4,
89: 'vrijdag' => 5,
90: 'zaterdag' => 6,
91: 'zondag' => 7,
92:
93: 'lundi' => 1,
94: 'mardi' => 2,
95: 'mercredi' => 3,
96: 'jeudi' => 4,
97: 'vendredi' => 5,
98: 'samedi' => 6,
99: 'dimanche' => 7,
100:
101: 'montag' => 1,
102: 'dienstag' => 2,
103: 'mittwoch' => 3,
104: 'donnerstag' => 4,
105: 'freitag' => 5,
106: 'samstag' => 6,
107: 'sonnabend' => 6,
108: 'sonntag' => 7,
109:
110: 'lunedì' => 1,
111: 'martedì' => 2,
112: 'mercoledì' => 3,
113: 'giovedì' => 4,
114: 'venerdì' => 5,
115: 'sabato' => 6,
116: 'domenica' => 7,
117:
118: 'lunes' => 1,
119: 'martes' => 2,
120: 'miércoles' => 3,
121: 'jueves' => 4,
122: 'viernes' => 5,
123: 'sábado' => 6,
124: 'domingo' => 7,
125:
126: 'maanantai' => 1,
127: 'tiistai' => 2,
128: 'keskiviikko' => 3,
129: 'torstai' => 4,
130: 'perjantai' => 5,
131: 'lauantai' => 6,
132: 'sunnuntai' => 7,
133:
134: 'hétfő' => 1,
135: 'kedd' => 2,
136: 'szerda' => 3,
137: 'csütörtok' => 4,
138: 'péntek' => 5,
139: 'szombat' => 6,
140: 'vasárnap' => 7,
141:
142: 'Δευ' => 1,
143: 'Τρι' => 2,
144: 'Τετ' => 3,
145: 'Πεμ' => 4,
146: 'Παρ' => 5,
147: 'Σαβ' => 6,
148: 'Κυρ' => 7,
149: );
150:
151: 152: 153: 154: 155: 156:
157: var $month = array(
158:
159: 'jan' => 1,
160: 'january' => 1,
161: 'feb' => 2,
162: 'february' => 2,
163: 'mar' => 3,
164: 'march' => 3,
165: 'apr' => 4,
166: 'april' => 4,
167: 'may' => 5,
168:
169: 'jun' => 6,
170: 'june' => 6,
171: 'jul' => 7,
172: 'july' => 7,
173: 'aug' => 8,
174: 'august' => 8,
175: 'sep' => 9,
176: 'september' => 8,
177: 'oct' => 10,
178: 'october' => 10,
179: 'nov' => 11,
180: 'november' => 11,
181: 'dec' => 12,
182: 'december' => 12,
183:
184: 'januari' => 1,
185: 'februari' => 2,
186: 'maart' => 3,
187: 'april' => 4,
188: 'mei' => 5,
189: 'juni' => 6,
190: 'juli' => 7,
191: 'augustus' => 8,
192: 'september' => 9,
193: 'oktober' => 10,
194: 'november' => 11,
195: 'december' => 12,
196:
197: 'janvier' => 1,
198: 'février' => 2,
199: 'mars' => 3,
200: 'avril' => 4,
201: 'mai' => 5,
202: 'juin' => 6,
203: 'juillet' => 7,
204: 'août' => 8,
205: 'septembre' => 9,
206: 'octobre' => 10,
207: 'novembre' => 11,
208: 'décembre' => 12,
209:
210: 'januar' => 1,
211: 'februar' => 2,
212: 'märz' => 3,
213: 'april' => 4,
214: 'mai' => 5,
215: 'juni' => 6,
216: 'juli' => 7,
217: 'august' => 8,
218: 'september' => 9,
219: 'oktober' => 10,
220: 'november' => 11,
221: 'dezember' => 12,
222:
223: 'gennaio' => 1,
224: 'febbraio' => 2,
225: 'marzo' => 3,
226: 'aprile' => 4,
227: 'maggio' => 5,
228: 'giugno' => 6,
229: 'luglio' => 7,
230: 'agosto' => 8,
231: 'settembre' => 9,
232: 'ottobre' => 10,
233: 'novembre' => 11,
234: 'dicembre' => 12,
235:
236: 'enero' => 1,
237: 'febrero' => 2,
238: 'marzo' => 3,
239: 'abril' => 4,
240: 'mayo' => 5,
241: 'junio' => 6,
242: 'julio' => 7,
243: 'agosto' => 8,
244: 'septiembre' => 9,
245: 'setiembre' => 9,
246: 'octubre' => 10,
247: 'noviembre' => 11,
248: 'diciembre' => 12,
249:
250: 'tammikuu' => 1,
251: 'helmikuu' => 2,
252: 'maaliskuu' => 3,
253: 'huhtikuu' => 4,
254: 'toukokuu' => 5,
255: 'kesäkuu' => 6,
256: 'heinäkuu' => 7,
257: 'elokuu' => 8,
258: 'suuskuu' => 9,
259: 'lokakuu' => 10,
260: 'marras' => 11,
261: 'joulukuu' => 12,
262:
263: 'január' => 1,
264: 'február' => 2,
265: 'március' => 3,
266: 'április' => 4,
267: 'május' => 5,
268: 'június' => 6,
269: 'július' => 7,
270: 'augusztus' => 8,
271: 'szeptember' => 9,
272: 'október' => 10,
273: 'november' => 11,
274: 'december' => 12,
275:
276: 'Ιαν' => 1,
277: 'Φεβ' => 2,
278: 'Μάώ' => 3,
279: 'Μαώ' => 3,
280: 'Απρ' => 4,
281: 'Μάι' => 5,
282: 'Μαϊ' => 5,
283: 'Μαι' => 5,
284: 'Ιούν' => 6,
285: 'Ιον' => 6,
286: 'Ιούλ' => 7,
287: 'Ιολ' => 7,
288: 'Αύγ' => 8,
289: 'Αυγ' => 8,
290: 'Σεπ' => 9,
291: 'Οκτ' => 10,
292: 'Νοέ' => 11,
293: 'Δεκ' => 12,
294: );
295:
296: 297: 298: 299: 300: 301:
302: var $timezone = array(
303: 'ACDT' => 37800,
304: 'ACIT' => 28800,
305: 'ACST' => 34200,
306: 'ACT' => -18000,
307: 'ACWDT' => 35100,
308: 'ACWST' => 31500,
309: 'AEDT' => 39600,
310: 'AEST' => 36000,
311: 'AFT' => 16200,
312: 'AKDT' => -28800,
313: 'AKST' => -32400,
314: 'AMDT' => 18000,
315: 'AMT' => -14400,
316: 'ANAST' => 46800,
317: 'ANAT' => 43200,
318: 'ART' => -10800,
319: 'AZOST' => -3600,
320: 'AZST' => 18000,
321: 'AZT' => 14400,
322: 'BIOT' => 21600,
323: 'BIT' => -43200,
324: 'BOT' => -14400,
325: 'BRST' => -7200,
326: 'BRT' => -10800,
327: 'BST' => 3600,
328: 'BTT' => 21600,
329: 'CAST' => 18000,
330: 'CAT' => 7200,
331: 'CCT' => 23400,
332: 'CDT' => -18000,
333: 'CEDT' => 7200,
334: 'CET' => 3600,
335: 'CGST' => -7200,
336: 'CGT' => -10800,
337: 'CHADT' => 49500,
338: 'CHAST' => 45900,
339: 'CIST' => -28800,
340: 'CKT' => -36000,
341: 'CLDT' => -10800,
342: 'CLST' => -14400,
343: 'COT' => -18000,
344: 'CST' => -21600,
345: 'CVT' => -3600,
346: 'CXT' => 25200,
347: 'DAVT' => 25200,
348: 'DTAT' => 36000,
349: 'EADT' => -18000,
350: 'EAST' => -21600,
351: 'EAT' => 10800,
352: 'ECT' => -18000,
353: 'EDT' => -14400,
354: 'EEST' => 10800,
355: 'EET' => 7200,
356: 'EGT' => -3600,
357: 'EKST' => 21600,
358: 'EST' => -18000,
359: 'FJT' => 43200,
360: 'FKDT' => -10800,
361: 'FKST' => -14400,
362: 'FNT' => -7200,
363: 'GALT' => -21600,
364: 'GEDT' => 14400,
365: 'GEST' => 10800,
366: 'GFT' => -10800,
367: 'GILT' => 43200,
368: 'GIT' => -32400,
369: 'GST' => 14400,
370: 'GST' => -7200,
371: 'GYT' => -14400,
372: 'HAA' => -10800,
373: 'HAC' => -18000,
374: 'HADT' => -32400,
375: 'HAE' => -14400,
376: 'HAP' => -25200,
377: 'HAR' => -21600,
378: 'HAST' => -36000,
379: 'HAT' => -9000,
380: 'HAY' => -28800,
381: 'HKST' => 28800,
382: 'HMT' => 18000,
383: 'HNA' => -14400,
384: 'HNC' => -21600,
385: 'HNE' => -18000,
386: 'HNP' => -28800,
387: 'HNR' => -25200,
388: 'HNT' => -12600,
389: 'HNY' => -32400,
390: 'IRDT' => 16200,
391: 'IRKST' => 32400,
392: 'IRKT' => 28800,
393: 'IRST' => 12600,
394: 'JFDT' => -10800,
395: 'JFST' => -14400,
396: 'JST' => 32400,
397: 'KGST' => 21600,
398: 'KGT' => 18000,
399: 'KOST' => 39600,
400: 'KOVST' => 28800,
401: 'KOVT' => 25200,
402: 'KRAST' => 28800,
403: 'KRAT' => 25200,
404: 'KST' => 32400,
405: 'LHDT' => 39600,
406: 'LHST' => 37800,
407: 'LINT' => 50400,
408: 'LKT' => 21600,
409: 'MAGST' => 43200,
410: 'MAGT' => 39600,
411: 'MAWT' => 21600,
412: 'MDT' => -21600,
413: 'MESZ' => 7200,
414: 'MEZ' => 3600,
415: 'MHT' => 43200,
416: 'MIT' => -34200,
417: 'MNST' => 32400,
418: 'MSDT' => 14400,
419: 'MSST' => 10800,
420: 'MST' => -25200,
421: 'MUT' => 14400,
422: 'MVT' => 18000,
423: 'MYT' => 28800,
424: 'NCT' => 39600,
425: 'NDT' => -9000,
426: 'NFT' => 41400,
427: 'NMIT' => 36000,
428: 'NOVST' => 25200,
429: 'NOVT' => 21600,
430: 'NPT' => 20700,
431: 'NRT' => 43200,
432: 'NST' => -12600,
433: 'NUT' => -39600,
434: 'NZDT' => 46800,
435: 'NZST' => 43200,
436: 'OMSST' => 25200,
437: 'OMST' => 21600,
438: 'PDT' => -25200,
439: 'PET' => -18000,
440: 'PETST' => 46800,
441: 'PETT' => 43200,
442: 'PGT' => 36000,
443: 'PHOT' => 46800,
444: 'PHT' => 28800,
445: 'PKT' => 18000,
446: 'PMDT' => -7200,
447: 'PMST' => -10800,
448: 'PONT' => 39600,
449: 'PST' => -28800,
450: 'PWT' => 32400,
451: 'PYST' => -10800,
452: 'PYT' => -14400,
453: 'RET' => 14400,
454: 'ROTT' => -10800,
455: 'SAMST' => 18000,
456: 'SAMT' => 14400,
457: 'SAST' => 7200,
458: 'SBT' => 39600,
459: 'SCDT' => 46800,
460: 'SCST' => 43200,
461: 'SCT' => 14400,
462: 'SEST' => 3600,
463: 'SGT' => 28800,
464: 'SIT' => 28800,
465: 'SRT' => -10800,
466: 'SST' => -39600,
467: 'SYST' => 10800,
468: 'SYT' => 7200,
469: 'TFT' => 18000,
470: 'THAT' => -36000,
471: 'TJT' => 18000,
472: 'TKT' => -36000,
473: 'TMT' => 18000,
474: 'TOT' => 46800,
475: 'TPT' => 32400,
476: 'TRUT' => 36000,
477: 'TVT' => 43200,
478: 'TWT' => 28800,
479: 'UYST' => -7200,
480: 'UYT' => -10800,
481: 'UZT' => 18000,
482: 'VET' => -14400,
483: 'VLAST' => 39600,
484: 'VLAT' => 36000,
485: 'VOST' => 21600,
486: 'VUT' => 39600,
487: 'WAST' => 7200,
488: 'WAT' => 3600,
489: 'WDT' => 32400,
490: 'WEST' => 3600,
491: 'WFT' => 43200,
492: 'WIB' => 25200,
493: 'WIT' => 32400,
494: 'WITA' => 28800,
495: 'WKST' => 18000,
496: 'WST' => 28800,
497: 'YAKST' => 36000,
498: 'YAKT' => 32400,
499: 'YAPT' => 36000,
500: 'YEKST' => 21600,
501: 'YEKT' => 18000,
502: );
503:
504: 505: 506: 507: 508: 509:
510: var $day_pcre;
511:
512: 513: 514: 515: 516: 517:
518: var $month_pcre;
519:
520: 521: 522: 523: 524: 525:
526: var $built_in = array();
527:
528: 529: 530: 531: 532: 533:
534: var $user = array();
535:
536: 537: 538: 539: 540: 541:
542: public function __construct()
543: {
544: $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')';
545: $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')';
546:
547: static $cache;
548: if (!isset($cache[get_class($this)]))
549: {
550: $all_methods = get_class_methods($this);
551:
552: foreach ($all_methods as $method)
553: {
554: if (strtolower(substr($method, 0, 5)) === 'date_')
555: {
556: $cache[get_class($this)][] = $method;
557: }
558: }
559: }
560:
561: foreach ($cache[get_class($this)] as $method)
562: {
563: $this->built_in[] = $method;
564: }
565: }
566:
567: 568: 569: 570: 571:
572: public static function get()
573: {
574: static $object;
575: if (!$object)
576: {
577: $object = new SimplePie_Parse_Date;
578: }
579: return $object;
580: }
581:
582: 583: 584: 585: 586: 587: 588: 589:
590: public function parse($date)
591: {
592: foreach ($this->user as $method)
593: {
594: if (($returned = call_user_func($method, $date)) !== false)
595: {
596: return $returned;
597: }
598: }
599:
600: foreach ($this->built_in as $method)
601: {
602: if (($returned = call_user_func(array($this, $method), $date)) !== false)
603: {
604: return $returned;
605: }
606: }
607:
608: return false;
609: }
610:
611: 612: 613: 614: 615: 616: 617:
618: public function add_callback($callback)
619: {
620: if (is_callable($callback))
621: {
622: $this->user[] = $callback;
623: }
624: else
625: {
626: trigger_error('User-supplied function must be a valid callback', E_USER_WARNING);
627: }
628: }
629:
630: 631: 632: 633: 634: 635: 636: 637:
638: public function date_w3cdtf($date)
639: {
640: static $pcre;
641: if (!$pcre)
642: {
643: $year = '([0-9]{4})';
644: $month = $day = $hour = $minute = $second = '([0-9]{2})';
645: $decimal = '([0-9]*)';
646: $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))';
647: $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/';
648: }
649: if (preg_match($pcre, $date, $match))
650: {
651: 652: 653: 654: 655: 656: 657: 658: 659: 660: 661: 662: 663: 664:
665:
666:
667: for ($i = count($match); $i <= 3; $i++)
668: {
669: $match[$i] = '1';
670: }
671:
672: for ($i = count($match); $i <= 7; $i++)
673: {
674: $match[$i] = '0';
675: }
676:
677:
678: if (isset($match[9]) && $match[9] !== '')
679: {
680: $timezone = $match[10] * 3600;
681: $timezone += $match[11] * 60;
682: if ($match[9] === '-')
683: {
684: $timezone = 0 - $timezone;
685: }
686: }
687: else
688: {
689: $timezone = 0;
690: }
691:
692:
693: $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
694:
695: return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
696: }
697: else
698: {
699: return false;
700: }
701: }
702:
703: 704: 705: 706: 707: 708: 709:
710: public function remove_rfc2822_comments($string)
711: {
712: $string = (string) $string;
713: $position = 0;
714: $length = strlen($string);
715: $depth = 0;
716:
717: $output = '';
718:
719: while ($position < $length && ($pos = strpos($string, '(', $position)) !== false)
720: {
721: $output .= substr($string, $position, $pos - $position);
722: $position = $pos + 1;
723: if ($string[$pos - 1] !== '\\')
724: {
725: $depth++;
726: while ($depth && $position < $length)
727: {
728: $position += strcspn($string, '()', $position);
729: if ($string[$position - 1] === '\\')
730: {
731: $position++;
732: continue;
733: }
734: elseif (isset($string[$position]))
735: {
736: switch ($string[$position])
737: {
738: case '(':
739: $depth++;
740: break;
741:
742: case ')':
743: $depth--;
744: break;
745: }
746: $position++;
747: }
748: else
749: {
750: break;
751: }
752: }
753: }
754: else
755: {
756: $output .= '(';
757: }
758: }
759: $output .= substr($string, $position);
760:
761: return $output;
762: }
763:
764: 765: 766: 767: 768: 769:
770: public function date_rfc2822($date)
771: {
772: static $pcre;
773: if (!$pcre)
774: {
775: $wsp = '[\x09\x20]';
776: $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)';
777: $optional_fws = $fws . '?';
778: $day_name = $this->day_pcre;
779: $month = $this->month_pcre;
780: $day = '([0-9]{1,2})';
781: $hour = $minute = $second = '([0-9]{2})';
782: $year = '([0-9]{2,4})';
783: $num_zone = '([+\-])([0-9]{2})([0-9]{2})';
784: $character_zone = '([A-Z]{1,5})';
785: $zone = '(?:' . $num_zone . '|' . $character_zone . ')';
786: $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';
787: }
788: if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match))
789: {
790: 791: 792: 793: 794: 795: 796: 797: 798: 799: 800: 801: 802: 803:
804:
805:
806: $month = $this->month[strtolower($match[3])];
807:
808:
809: if ($match[8] !== '')
810: {
811: $timezone = $match[9] * 3600;
812: $timezone += $match[10] * 60;
813: if ($match[8] === '-')
814: {
815: $timezone = 0 - $timezone;
816: }
817: }
818:
819: elseif (isset($this->timezone[strtoupper($match[11])]))
820: {
821: $timezone = $this->timezone[strtoupper($match[11])];
822: }
823:
824: else
825: {
826: $timezone = 0;
827: }
828:
829:
830: if ($match[4] < 50)
831: {
832: $match[4] += 2000;
833: }
834: elseif ($match[4] < 1000)
835: {
836: $match[4] += 1900;
837: }
838:
839:
840: if ($match[7] !== '')
841: {
842: $second = $match[7];
843: }
844: else
845: {
846: $second = 0;
847: }
848:
849: return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone;
850: }
851: else
852: {
853: return false;
854: }
855: }
856:
857: 858: 859: 860: 861: 862:
863: public function date_rfc850($date)
864: {
865: static $pcre;
866: if (!$pcre)
867: {
868: $space = '[\x09\x20]+';
869: $day_name = $this->day_pcre;
870: $month = $this->month_pcre;
871: $day = '([0-9]{1,2})';
872: $year = $hour = $minute = $second = '([0-9]{2})';
873: $zone = '([A-Z]{1,5})';
874: $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i';
875: }
876: if (preg_match($pcre, $date, $match))
877: {
878: 879: 880: 881: 882: 883: 884: 885: 886: 887: 888:
889:
890:
891: $month = $this->month[strtolower($match[3])];
892:
893:
894: if (isset($this->timezone[strtoupper($match[8])]))
895: {
896: $timezone = $this->timezone[strtoupper($match[8])];
897: }
898:
899: else
900: {
901: $timezone = 0;
902: }
903:
904:
905: if ($match[4] < 50)
906: {
907: $match[4] += 2000;
908: }
909: else
910: {
911: $match[4] += 1900;
912: }
913:
914: return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone;
915: }
916: else
917: {
918: return false;
919: }
920: }
921:
922: 923: 924: 925: 926: 927:
928: public function date_asctime($date)
929: {
930: static $pcre;
931: if (!$pcre)
932: {
933: $space = '[\x09\x20]+';
934: $wday_name = $this->day_pcre;
935: $mon_name = $this->month_pcre;
936: $day = '([0-9]{1,2})';
937: $hour = $sec = $min = '([0-9]{2})';
938: $year = '([0-9]{4})';
939: $terminator = '\x0A?\x00?';
940: $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i';
941: }
942: if (preg_match($pcre, $date, $match))
943: {
944: 945: 946: 947: 948: 949: 950: 951: 952: 953:
954:
955: $month = $this->month[strtolower($match[2])];
956: return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]);
957: }
958: else
959: {
960: return false;
961: }
962: }
963:
964: 965: 966: 967: 968: 969:
970: public function date_strtotime($date)
971: {
972: $strtotime = strtotime($date);
973: if ($strtotime === -1 || $strtotime === false)
974: {
975: return false;
976: }
977: else
978: {
979: return $strtotime;
980: }
981: }
982: }
983:
984: