1bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook/****************************************************************
2bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Licensed to the Apache Software Foundation (ASF) under one   *
3bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * or more contributor license agreements.  See the NOTICE file *
4bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * distributed with this work for additional information        *
5bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * regarding copyright ownership.  The ASF licenses this file   *
6bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * to you under the Apache License, Version 2.0 (the            *
7bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * "License"); you may not use this file except in compliance   *
8bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * with the License.  You may obtain a copy of the License at   *
9bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *                                                              *
10bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *   http://www.apache.org/licenses/LICENSE-2.0                 *
11bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook *                                                              *
12bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * Unless required by applicable law or agreed to in writing,   *
13bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * software distributed under the License is distributed on an  *
14bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
15bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * KIND, either express or implied.  See the License for the    *
16bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * specific language governing permissions and limitations      *
17bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook * under the License.                                           *
18bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook ****************************************************************/
19bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
20bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookpackage org.apache.james.mime4j.field.datetime;
21bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
22bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport org.apache.james.mime4j.field.datetime.parser.DateTimeParser;
23bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport org.apache.james.mime4j.field.datetime.parser.ParseException;
24bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport org.apache.james.mime4j.field.datetime.parser.TokenMgrError;
25bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
26bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.util.Date;
27bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.util.Calendar;
28bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.util.TimeZone;
29bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.util.GregorianCalendar;
30bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookimport java.io.StringReader;
31bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
32bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrookpublic class DateTime {
33bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private final Date date;
34bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private final int year;
35bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private final int month;
36bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private final int day;
37bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private final int hour;
38bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private final int minute;
39bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private final int second;
40bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private final int timeZone;
41bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
42bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public DateTime(String yearString, int month, int day, int hour, int minute, int second, int timeZone) {
43bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        this.year = convertToYear(yearString);
44bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        this.date = convertToDate(year, month, day, hour, minute, second, timeZone);
45bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        this.month = month;
46bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        this.day = day;
47bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        this.hour = hour;
48bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        this.minute = minute;
49bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        this.second = second;
50bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        this.timeZone = timeZone;
51bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
52bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
53bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    private int convertToYear(String yearString) {
54bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        int year = Integer.parseInt(yearString);
55bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        switch (yearString.length()) {
56bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            case 1:
57bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            case 2:
58bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                if (year >= 0 && year < 50)
59bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    return 2000 + year;
60bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                else
61bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                    return 1900 + year;
62bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            case 3:
63bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                return 1900 + year;
64bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            default:
65bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook                return year;
66bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
67bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
68bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
69bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static Date convertToDate(int year, int month, int day, int hour, int minute, int second, int timeZone) {
70bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT+0"));
71bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        c.set(year, month - 1, day, hour, minute, second);
72bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        c.set(Calendar.MILLISECOND, 0);
73bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
74bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        if (timeZone != Integer.MIN_VALUE) {
75bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            int minutes = ((timeZone / 100) * 60) + timeZone % 100;
76bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            c.add(Calendar.MINUTE, -1 * minutes);
77bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
78bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
79bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return c.getTime();
80bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
81bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
82bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public Date getDate() {
83bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return date;
84bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
85bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
86bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public int getYear() {
87bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return year;
88bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
89bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
90bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public int getMonth() {
91bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return month;
92bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
93bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
94bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public int getDay() {
95bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return day;
96bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
97bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
98bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public int getHour() {
99bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return hour;
100bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
101bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
102bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public int getMinute() {
103bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return minute;
104bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
105bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
106bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public int getSecond() {
107bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return second;
108bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
109bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
110bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public int getTimeZone() {
111bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        return timeZone;
112bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
113bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
114bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public void print() {
115bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        System.out.println(getYear() + " " + getMonth() + " " + getDay() + "; " + getHour() + " " + getMinute() + " " + getSecond() + " " + getTimeZone());
116bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
117bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
118bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook
119bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    public static DateTime parse(String dateString) throws ParseException {
120bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        try {
121bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            return new DateTimeParser(new StringReader(dateString)).parseAll();
122bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
123bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        catch (TokenMgrError err) {
124bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook            throw new ParseException(err.getMessage());
125bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook        }
126bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook    }
127bc47398187c6ffd132435e51d8d61e6ec79a79dbPaul Westbrook}
128