Java tutorial
/* infoScoop OpenSource * Copyright (C) 2010 Beacon IT Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/lgpl-3.0-standalone.html>. */ package org.infoscoop.util; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * DateUtil.java * * @author Atsuhiko Kimura */ public class DateUtility { private static final Log log = LogFactory.getLog(DateUtility.class); private static final String W3CDTF_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ"; private static SimpleDateFormat FULL_DATE = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); private static SimpleDateFormat DEFAULT_DATE = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z"); private static SimpleDateFormat formatGMT = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH); private static SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm"); private static SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ"); private static SimpleDateFormat format3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss'Z'"); // Fri Sep 14 11:05:53 JST 2007 private static SimpleDateFormat imap4Date = new SimpleDateFormat("EEE MMM d HH:mm:ss 'JST' yyyy", Locale.ENGLISH); public static DateFormat newW3CDFWithoutSecond() { return (DateFormat) format1.clone(); } public static DateFormat newW3CDFWithoutT() { return (DateFormat) format2.clone(); } public static DateFormat newImap4DateFormat() { return (DateFormat) imap4Date.clone(); } public static DateFormat newGMTDateFormat() { return (DateFormat) formatGMT.clone(); } /** * We convert a date of java.util.Date type into a W3CDTF form. * * @param date * @return */ public static String getW3CDTFDate(Date date) { String str = new SimpleDateFormat(W3CDTF_FORMAT).format(date); str = str.substring(0, str.length() - 2) + ":" + str.substring(str.length() - 2); return str; } public static Date parseW3CDTFDate(String dateString) { Matcher m = null; if ((m = W3CDTF_FORMAT1.matcher(dateString)).matches()) { TimeZone tz; if ("Z".equals(m.group(7))) { tz = TimeZone.getTimeZone("GMT+00:00"); } else { tz = TimeZone.getTimeZone("GMT" + m.group(7)); } Calendar c = Calendar.getInstance(tz); int year = Integer.parseInt(m.group(1)); int month = Integer.parseInt(m.group(2)) - 1; int date = Integer.parseInt(m.group(3)); int hour = Integer.parseInt(m.group(4)); int minute = Integer.parseInt(m.group(5)); int second = Integer.parseInt(m.group(6)); c.set(year, month, date, hour, minute, second); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } if ((m = W3CDTF_FORMAT2.matcher(dateString)).matches()) { TimeZone tz; if ("Z".equals(m.group(6))) { tz = TimeZone.getTimeZone("GMT+00:00"); } else { tz = TimeZone.getTimeZone("GMT" + m.group(6)); } Calendar c = Calendar.getInstance(tz); int year = Integer.parseInt(m.group(1)); int month = Integer.parseInt(m.group(2)) - 1; int date = Integer.parseInt(m.group(3)); int hour = Integer.parseInt(m.group(4)); int minute = Integer.parseInt(m.group(5)); c.set(year, month, date, hour, minute, 0); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } if ((m = W3CDTF_FORMAT3.matcher(dateString)).matches()) { Calendar c = Calendar.getInstance(); int year = Integer.parseInt(m.group(1)); int month = Integer.parseInt(m.group(2)) - 1; int date = Integer.parseInt(m.group(3)); c.set(year, month, date, 0, 0, 0); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } if ((m = W3CDTF_FORMAT4.matcher(dateString)).matches()) { Calendar c = Calendar.getInstance(); int year = Integer.parseInt(m.group(1)); int month = Integer.parseInt(m.group(2)) - 1; c.set(year, month, 1, 0, 0, 0); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } if ((m = W3CDTF_FORMAT5.matcher(dateString)).matches()) { Calendar c = Calendar.getInstance(); int year = Integer.parseInt(m.group(1)); c.set(year, 0, 1, 0, 0, 0); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } return null; } /** * We convert the date of the W3CDTF form into java.util.Date type. * * @param W3CDTFDate * @return */ public static Date getDateFromW3CDTF(String w3cDTFDate) { if (w3cDTFDate == null || w3cDTFDate.length() == 0) return null; try { int year = Integer.parseInt(w3cDTFDate.substring(0, 4)); int month = Integer.parseInt(w3cDTFDate.substring(5, 7)); int day = Integer.parseInt(w3cDTFDate.substring(8, 10)); int hour = Integer.parseInt(w3cDTFDate.substring(11, 13)); int minute = Integer.parseInt(w3cDTFDate.substring(14, 16)); int second = Integer.parseInt(w3cDTFDate.substring(17, 19)); String zone = "GMT" + w3cDTFDate.substring(19); Calendar cal = Calendar.getInstance(); cal.set(year, month - 1, day, hour, minute, second); cal.set(Calendar.MILLISECOND, 0); cal.setTimeZone(TimeZone.getTimeZone(zone)); return cal.getTime(); } catch (Exception e) { log.error(w3cDTFDate + " is invalid date string.", e); } return null; } private static final String YMD = "([0-9]{4})-([0-9]{2})-([0-9]{2})"; private static final String ZONE = "(Z|(?:[\\\\+\\\\-][0-9]{2}:[0-9]{2}))"; private static final Pattern W3CDTF_FORMAT1 = Pattern .compile(YMD + "[T ]([0-9]{2}):([0-9]{2}):([0-9]{2})" + ZONE); private static final Pattern W3CDTF_FORMAT2 = Pattern.compile(YMD + "[T ]([0-9]{2}):([0-9]{2})" + ZONE); private static final Pattern W3CDTF_FORMAT3 = Pattern.compile(YMD); private static final Pattern W3CDTF_FORMAT4 = Pattern.compile("([0-9]{4})-([0-9]{2})"); private static final Pattern W3CDTF_FORMAT5 = Pattern.compile("([0-9]{4})"); public static boolean isToday(Date date) { GregorianCalendar now = new GregorianCalendar(); GregorianCalendar then = new GregorianCalendar(); then.setTime(date); return isSameDay(now, then); } public static boolean isSameDay(Calendar calA, Calendar calB) { return (calA.get(Calendar.YEAR) == calB.get(Calendar.YEAR) && calA.get(Calendar.DAY_OF_YEAR) == calB.get(Calendar.DAY_OF_YEAR)); } }