001    /****************************************************************
002     * Licensed to the Apache Software Foundation (ASF) under one   *
003     * or more contributor license agreements.  See the NOTICE file *
004     * distributed with this work for additional information        *
005     * regarding copyright ownership.  The ASF licenses this file   *
006     * to you under the Apache License, Version 2.0 (the            *
007     * "License"); you may not use this file except in compliance   *
008     * with the License.  You may obtain a copy of the License at   *
009     *                                                              *
010     *   http://www.apache.org/licenses/LICENSE-2.0                 *
011     *                                                              *
012     * Unless required by applicable law or agreed to in writing,   *
013     * software distributed under the License is distributed on an  *
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
015     * KIND, either express or implied.  See the License for the    *
016     * specific language governing permissions and limitations      *
017     * under the License.                                           *
018     ****************************************************************/
019    
020    package org.apache.james.mime4j.field.datetime;
021    
022    import java.util.Calendar;
023    import java.util.Date;
024    import java.util.GregorianCalendar;
025    import java.util.TimeZone;
026    
027    public class DateTime {
028        private final Date date;
029        private final int year;
030        private final int month;
031        private final int day;
032        private final int hour;
033        private final int minute;
034        private final int second;
035        private final int timeZone;
036    
037        public DateTime(String yearString, int month, int day, int hour, int minute, int second, int timeZone) {
038            this.year = convertToYear(yearString);
039            this.date = convertToDate(year, month, day, hour, minute, second, timeZone);
040            this.month = month;
041            this.day = day;
042            this.hour = hour;
043            this.minute = minute;
044            this.second = second;
045            this.timeZone = timeZone;
046        }
047    
048        private int convertToYear(String yearString) {
049            int year = Integer.parseInt(yearString);
050            switch (yearString.length()) {
051                case 1:
052                case 2:
053                    if (year >= 0 && year < 50)
054                        return 2000 + year;
055                    else
056                        return 1900 + year;
057                case 3:
058                    return 1900 + year;
059                default:
060                    return year;
061            }
062        }
063    
064        public static Date convertToDate(int year, int month, int day, int hour, int minute, int second, int timeZone) {
065            Calendar c = new GregorianCalendar(TimeZone.getTimeZone("GMT+0"));
066            c.set(year, month - 1, day, hour, minute, second);
067            c.set(Calendar.MILLISECOND, 0);
068    
069            if (timeZone != Integer.MIN_VALUE) {
070                int minutes = ((timeZone / 100) * 60) + timeZone % 100;
071                c.add(Calendar.MINUTE, -1 * minutes);
072            }
073    
074            return c.getTime();
075        }
076    
077        public Date getDate() {
078            return date;
079        }
080    
081        public int getYear() {
082            return year;
083        }
084    
085        public int getMonth() {
086            return month;
087        }
088    
089        public int getDay() {
090            return day;
091        }
092    
093        public int getHour() {
094            return hour;
095        }
096    
097        public int getMinute() {
098            return minute;
099        }
100    
101        public int getSecond() {
102            return second;
103        }
104    
105        public int getTimeZone() {
106            return timeZone;
107        }
108    
109        public void print() {
110            System.out.println(toString());
111        }
112    
113        @Override
114        public String toString() {
115            return getYear() + " " + getMonth() + " " + getDay() + "; " + getHour() + " " + getMinute() + " " + getSecond() + " " + getTimeZone();
116        }
117    
118        @Override
119        public int hashCode() {
120            final int PRIME = 31;
121            int result = 1;
122            result = PRIME * result + ((date == null) ? 0 : date.hashCode());
123            result = PRIME * result + day;
124            result = PRIME * result + hour;
125            result = PRIME * result + minute;
126            result = PRIME * result + month;
127            result = PRIME * result + second;
128            result = PRIME * result + timeZone;
129            result = PRIME * result + year;
130            return result;
131        }
132    
133        @Override
134        public boolean equals(Object obj) {
135            if (this == obj)
136                return true;
137            if (obj == null)
138                return false;
139            if (getClass() != obj.getClass())
140                return false;
141            final DateTime other = (DateTime) obj;
142            if (date == null) {
143                if (other.date != null)
144                    return false;
145            } else if (!date.equals(other.date))
146                return false;
147            if (day != other.day)
148                return false;
149            if (hour != other.hour)
150                return false;
151            if (minute != other.minute)
152                return false;
153            if (month != other.month)
154                return false;
155            if (second != other.second)
156                return false;
157            if (timeZone != other.timeZone)
158                return false;
159            if (year != other.year)
160                return false;
161            return true;
162        }
163    
164        
165    }