001 /*
002 * Copyright 1999,2004 The Apache Software Foundation.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.apache.commons.feedparser.tools;
018
019 import java.text.SimpleDateFormat;
020 import java.util.Date;
021 import java.util.Locale;
022 import java.util.TimeZone;
023
024 /**
025 *
026 * RFC 822 date parsing utility. Designed for parsing the ISO subset used in
027 * Dublin Core, RSS 1.0, and Atom.
028 *
029 *
030 http://asg.web.cmu.edu/rfc/rfc822.html#sec-5
031 *
032 5.1 SYNTAX
033 *
034 * date-time = [ day "," ] date time ; dd mm yy
035 * ; hh:mm:ss zzz
036 *
037 * day = "Mon" / "Tue" / "Wed" / "Thu"
038 * / "Fri" / "Sat" / "Sun"
039 *
040 * date = 1*2DIGIT month 2DIGIT ; day month year
041 * ; e.g. 20 Jun 82
042 *
043 * month = "Jan" / "Feb" / "Mar" / "Apr"
044 * / "May" / "Jun" / "Jul" / "Aug"
045 * / "Sep" / "Oct" / "Nov" / "Dec"
046 *
047 * time = hour zone ; ANSI and Military
048 *
049 * hour = 2DIGIT ":" 2DIGIT [":" 2DIGIT]
050 * ; 00:00:00 - 23:59:59
051 *
052 * zone = "UT" / "GMT" ; Universal Time
053 * ; North American : UT
054 * / "EST" / "EDT" ; Eastern: - 5/ - 4
055 * / "CST" / "CDT" ; Central: - 6/ - 5
056 * / "MST" / "MDT" ; Mountain: - 7/ - 6
057 * / "PST" / "PDT" ; Pacific: - 8/ - 7
058 * / 1ALPHA ; Military: Z = UT;
059 * ; A:-1; (J not used)
060 * ; M:-12; N:+1; Y:+12
061 * / ( ("+" / "-") 4DIGIT ) ; Local differential
062 * ; hours+min. (HHMM)
063 *
064 5.2 SEMANTICS
065 *
066 * If included, day-of-week must be the day implied by the date specification.
067 *
068 * Time zone may be indicated in several ways. "UT" is Univer- sal Time
069 * (formerly called "Greenwich Mean Time"); "GMT" is per- mitted as a reference
070 * to Universal Time. The military standard uses a single character for each
071 * zone. "Z" is Universal Time. "A" indicates one hour earlier, and "M"
072 * indicates 12 hours ear- lier; "N" is one hour later, and "Y" is 12 hours
073 * later. The letter "J" is not used. The other remaining two forms are taken
074 * from ANSI standard X3.51-1975. One allows explicit indication of the amount
075 * of offset from UT; the other uses common 3-character strings for indicating
076 * time zones in North America.
077 *
078 *
079 *
080 * @author <a href="mailto:burton@apache.org">Kevin A. Burton (burtonator)</a>
081 * @version $Id: RFC822DateParser.java 373572 2006-01-30 19:28:41Z mvdb $
082 */
083 public class RFC822DateParser {
084
085 private static SimpleDateFormat df
086 = new SimpleDateFormat( "EEE, dd MMM yyyy hh:mm:ss z", Locale.ENGLISH );
087
088 public static Date parse( String input ) throws java.text.ParseException {
089
090 //NOTE: SimpleDateFormat uses GMT[-+]hh:mm for the TZ which breaks
091 //things a bit. Before we go on we have to repair this.
092
093 return df.parse( input );
094
095 }
096
097 public static String toString( Date date, TimeZone tz ) {
098
099 df.setTimeZone( tz );
100
101 return df.format( date );
102
103 }
104
105 }
106