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