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