Data Type Java

/* 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
 * .
 */
//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;
/**
 * DateUtil.java
 * 
 * @author Atsuhiko Kimura
 */
public class DateUtility {
  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) {
      System.out.println(w3cDTFDate + " is invalid date string.");
    }
    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));
  }
  
}