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