/*
 * @(#)Command.java	1.1.1 2002/11/20
 *
 * Copyright 2001-2002 by BeiJing Camelot, Inc., CHINA
 * All rights reserved.
 *
 * This software is the confidential and proprietary information
 * of Camelot, Inc.  You shall not disclose such Confidential
 * Information and shall use it only in accordance with the terms
 * of the license agreement you entered into with Camelot.
 */
package com.coolservlets.beans.method;
import java.io.*;
import java.text.ParseException;
import java.util.Locale;
import java.util.TimeZone;
import java.util.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

/**
 * Class for SLDate
 * @author      yulixin
 * @version 	1.1.1, 2002/02/5
 * @since       JDK1.2, JSDK 2.0
 */
public class SLDate
        implements Serializable, Cloneable
{
    private GregorianCalendar m_objCal;
    private static Calendar utcCal = new GregorianCalendar(TimeZone.getTimeZone("GMT"));
    private static DateFormat m_objFormatter;
    private static DateFormat m_objgmtformatter;
    private static TimeZone m_objcachedDefaultZone = TimeZone.getDefault();

    static
    {
        m_objFormatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
        m_objgmtformatter = new SimpleDateFormat("d MMM yyyy HH:mm:ss 'GMT'", Locale.US);
        m_objgmtformatter.setTimeZone(TimeZone.getTimeZone("Africa/Casablanca"));
    }

    /**
     * class SLDate's construction
     */
    public SLDate()
    {
        m_objCal = new GregorianCalendar();
    }

    /**
     * class SLDate's construction
     * @param int nYear:year
     * @param int nMonth:month
     * @param int nDay:day
     */
    public SLDate(int nYear, int nMonth, int nDay)
    {
        this(nYear, nMonth, nDay, 0, 0, 0);
    }

    /**
     * class SLDate's construction
     * @param int nYear:year
     * @param int nMonth:month
     * @param int nDay:day
     * @param int nHour:hour
     * @param int nMinute:minute
     */
    public SLDate(int nYear, int nMonth, int nDay, int nHour, int nMinute)
    {
        this(nYear, nMonth, nDay, nHour, nMinute, 0);
    }

    /**
     * class SLDate's construction
     * @param int nYear:year
     * @param int nMonth:month
     * @param int nDay:day
     * @param int nHour:hour
     * @param int nMinute:minute
     * @param int nSecond:second
     */
    public SLDate(int nYear, int nMonth, int nDay, int nHour, int nMinute, int nSecond)
    {
        this();
        synchronized(m_objCal)
        {
            TimeZone timezone = TimeZone.getDefault();
            if(!timezone.equals(m_objcachedDefaultZone))
            {
                m_objCal.setTimeZone(timezone);
                m_objFormatter.setTimeZone(timezone);
                m_objcachedDefaultZone = timezone;
            }
            m_objCal.set(nYear + 1900, nMonth-1, nDay, nHour, nMinute, nSecond);
        }
    }

    /**
     * class SLDate's construction
     * @param mills
     */
    public SLDate(long lmills)
    {
        this();
        m_objCal.setTime(new Date(lmills));
    }

    /**
     * class SLDate's construction
     * @param String s:date string
     */
    public SLDate(String s)
    {
        this(parse(s));
    }

    /**
     * class SLDate's construction
     * @param Date objDate:date
     */
    public SLDate(Date objDate)
    {
        this();
        if (objDate != null)
        {
            m_objCal.setTime(objDate);
        }
    }

    /**
     * check if self > date
     */
    public boolean after(Date date)
    {
        return getTime() > date.getTime();
    }

    /**
     * chekc if self < date
     */
    public boolean after(SLDate date)
    {
        return getTime() > date.getTime();
    }

    /**
     * check if self < date
     */
    public boolean before(Date date)
    {
        return getTime() < date.getTime();
    }

    /**
     * check if self < date
     */
    public boolean before(SLDate date)
    {
        return getTime() < date.getTime();
    }

    /**
     * check if self == obj
     */
    public boolean equals(Object obj)
    {
        if (obj == null) return false;
        if (obj instanceof SLDate) {
            if (getTime()  == ((SLDate)obj).getTime())
            {
                return true;
            } else {
                return false;
            }
        } else if (obj instanceof Date) {
            if (getTime()  == ((Date)obj).getTime())
            {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    /**
     * DAY_OF_MONTH
     */
    public int getDate()
    {
        return getField(Calendar.DAY_OF_MONTH);
    }

    /**
     * DAY_OF_WEEK - 1
     */
    public int getDay()
    {
        return getField(Calendar.DAY_OF_WEEK) - 1;
    }

    /**
     * get field
     */
    private final int getField(int nField)
    {
        return m_objCal.get(nField);
    }

    /**
     * get field's HOUR_OF_DAY
     */
    public int getHours()
    {
        return getField(Calendar.HOUR_OF_DAY);
    }

    /**
     * get field's MINUTE
     */
    public int getMinutes()
    {
        return getField(Calendar.MINUTE);
    }

    /**
     * get field's MONTH
     */
    public int getMonth()
    {
        return getField(Calendar.MONTH)+1;
    }

    /**
     * get field's SECOND
     */
    public int getSeconds()
    {
        return getField(Calendar.SECOND);
    }

    /**
     * get time
     */
    public final long getTime()
    {
        return m_objCal.getTime().getTime();
    }

    /**
     * get time zone offet
     */
    public int getTimezoneOffset()
    {
        int nOffset = m_objCal.get(Calendar.ZONE_OFFSET) + m_objCal.get(Calendar.DST_OFFSET);
        return -(nOffset / 1000 / 60);
    }

    /**
     * get field's YEAR
     */
    public int getYear()
    {
        return getField(Calendar.YEAR) - 1900;
    }

    /**
     * hashCode
     */
    public int hashCode()
    {
        long lmillis = getTime();
        return (int)lmillis ^ (int)(lmillis >> 32);
    }

    /**
     * parse
     */
    public static long parse(String strDate)
    {
        try {
            return DateFormat.getDateInstance().parse(strDate).getTime();
        } catch (ParseException e) {
            return (new SLDate(70, 1, 1)).getTime();
        }
    }

    /**
     * readObject
     */
    private void readObject(ObjectInputStream objectinputstream)
            throws IOException, ClassNotFoundException
    {
        long lMillis = objectinputstream.readLong();
        m_objCal = new GregorianCalendar();
        m_objCal.setTime(new Date(lMillis));
    }

    /**
     * set date
     */
    public void setDate(int nDay)
    {
        setField(Calendar.DAY_OF_MONTH, nDay);
    }

    /**
     * set field
     * @param int nField:field
     * @param int nValue:value
     */
    private final void setField(int nField, int nValue)
    {
        if(m_objCal == null)
        {
            m_objCal = new GregorianCalendar();
        }
        m_objCal.set(nField, nValue);
    }

    /**
     * set field's HOUR
     */
    public void setHours(int nHours)
    {
        setField(Calendar.HOUR_OF_DAY, nHours);
    }

    /**
     * set field's Minutes
     */
    public void setMinutes(int nMinutes)
    {
        setField(Calendar.MINUTE, nMinutes);
    }

    /**
     * set field's MONTH
     */
    public void setMonth(int nMonth)
    {
        setField(Calendar.MONTH, nMonth);
    }

    /**
     * set field's SECOND
     */
    public void setSeconds(int nSeconds)
    {
        setField(Calendar.SECOND, nSeconds);
    }

    /**
     * set time
     */
    public void setTime(long lMillis)
    {
        m_objCal.setTime(new Date(lMillis));
    }

    /**
     * set filed's YEAR
     */
    public void setYear(int nYear)
    {
        setField(Calendar.YEAR, nYear + 1900);
    }

    /**
     * change GregorianCalendar to date
     */
    public Date toDate()
    {
        return m_objCal.getTime();
    }

    /**
     * change to GMT string
     */
    public String toGMTString()
    {
        synchronized(m_objgmtformatter)
        {
            String s = m_objgmtformatter.format(toDate());
            return s;
        }
    }

    /**
     * change time to Local time
     */
    public String toLocaleString()
    {
        DateFormat dateformat = DateFormat.getDateTimeInstance();
        dateformat.setTimeZone(TimeZone.getDefault());
        return dateformat.format(toDate());
    }

    /**
     * format time to string
     */
    public String toString()
    {
        synchronized(m_objFormatter)
        {
            TimeZone timezone = TimeZone.getDefault();
            if(!timezone.equals(m_objcachedDefaultZone))
            {
                m_objFormatter.setTimeZone(timezone);
                m_objcachedDefaultZone = timezone;
            }
            m_objFormatter.setTimeZone(TimeZone.getDefault());
            String s = m_objFormatter.format(toDate());
            return s;
        }
    }

    /**
     * UTC
     */
    public static long UTC(int nYear, int nMonth, int nDay, int nHour, int nMinute, int nSecond)
    {
        synchronized(utcCal)
        {
            utcCal.clear();
            utcCal.set(nYear + 1900, nMonth-1, nDay, nHour, nMinute, nSecond);
            long lmillis = utcCal.getTime().getTime();
            return lmillis;
        }
    }
    private void writeObject(ObjectOutputStream objectoutputstream)
            throws IOException
    {
        objectoutputstream.writeLong(getTime());
    }
    /**
     * 计算两个日期之间的天数, 返回格式为HH:MM
     * p_startDate XXXX-XX-XX 00:00:00
     * p_stopDate  XXXX-XX-XX 00:00:00
     */
    public static int getDays(String p_startDate,String p_stopDate) throws Exception{
        //日期格式的转化
        p_startDate = p_startDate.trim();
        p_stopDate = p_stopDate.trim();
        int nYear0 = Integer.parseInt(genMethod.readValueStr(p_startDate,"-",0))+100;
        int nMonth0 = Integer.parseInt(genMethod.readValueStr(p_startDate,"-",1));
        String sDate  = genMethod.readValueStr(p_startDate,"-",2);
        String sDateStr  = genMethod.readValueStr(sDate," ",0);
        int nDay0 = Integer.parseInt(sDateStr);
        String hmsStr = genMethod.readValueStr(sDate," ",1);
        int nHour0 = Integer.parseInt(genMethod.readValueStr(hmsStr,":",0));
        int nMinute0 = Integer.parseInt(genMethod.readValueStr(hmsStr,":",1));
        SLDate startSLDate = new SLDate(nYear0,nMonth0,nDay0,nHour0,nMinute0);
        int nYear1 = Integer.parseInt(genMethod.readValueStr(p_stopDate,"-",0))+100;
        int nMonth1 = Integer.parseInt(genMethod.readValueStr(p_stopDate,"-",1));
        sDate  = genMethod.readValueStr(p_stopDate,"-",2);
        sDateStr  = genMethod.readValueStr(sDate," ",0);
        int nDay1 = Integer.parseInt(sDateStr);
        hmsStr = genMethod.readValueStr(sDate," ",1);
        int nHour1 = Integer.parseInt(genMethod.readValueStr(hmsStr,":",0));
        int nMinute1 = Integer.parseInt(genMethod.readValueStr(hmsStr,":",1));
        SLDate stopSLDate = new SLDate(nYear1,nMonth1,nDay1,nHour1,nMinute1);
        long totalMinutes = (stopSLDate.getTime()-startSLDate.getTime())*24*60/86400000;
        int nHours = (int)totalMinutes/60;
        return nHours/24;
    }
    /**
     * 计算两个日期之间的小时数, 返回格式为HH:MM
     */
    public static String getHours(String p_startDate,String p_stopDate) throws Exception{
        //日期格式的转化
        p_startDate = p_startDate.trim();
        p_stopDate = p_stopDate.trim();
        int nYear0 = Integer.parseInt(genMethod.readValueStr(p_startDate,"-",0))+100;
        int nMonth0 = Integer.parseInt(genMethod.readValueStr(p_startDate,"-",1));
        String sDate  = genMethod.readValueStr(p_startDate,"-",2);
        String sDateStr  = genMethod.readValueStr(sDate," ",0);
        int nDay0 = Integer.parseInt(sDateStr);
        String hmsStr = genMethod.readValueStr(sDate," ",1);
        int nHour0 = Integer.parseInt(genMethod.readValueStr(hmsStr,":",0));
        int nMinute0 = Integer.parseInt(genMethod.readValueStr(hmsStr,":",1));
        SLDate startSLDate = new SLDate(nYear0,nMonth0,nDay0,nHour0,nMinute0);
        int nYear1 = Integer.parseInt(genMethod.readValueStr(p_stopDate,"-",0))+100;
        int nMonth1 = Integer.parseInt(genMethod.readValueStr(p_stopDate,"-",1));
        sDate  = genMethod.readValueStr(p_stopDate,"-",2);
        sDateStr  = genMethod.readValueStr(sDate," ",0);
        int nDay1 = Integer.parseInt(sDateStr);
        hmsStr = genMethod.readValueStr(sDate," ",1);
        int nHour1 = Integer.parseInt(genMethod.readValueStr(hmsStr,":",0));
        int nMinute1 = Integer.parseInt(genMethod.readValueStr(hmsStr,":",1));
        SLDate stopSLDate = new SLDate(nYear1,nMonth1,nDay1,nHour1,nMinute1);
        long totalMinutes = (stopSLDate.getTime()-startSLDate.getTime())*24*60/86400000;
        int nHours = (int)totalMinutes/60;
        int nMinutes =  (int)(totalMinutes - Long.parseLong(Integer.toString(nHours*60)));
        return Integer.toString(nHours) + ":"+Integer.toString(nMinutes);
    }
    /**
     * 计算两个日期之间的分钟数, 返回格式为HH:MM
     */
    public static int getMinutes(String p_startDate,String p_stopDate) throws Exception{
        //日期格式的转化
        p_startDate = p_startDate.trim();
        p_stopDate = p_stopDate.trim();
        if(p_startDate.length() == 0 || p_stopDate.length() == 0) return 0;
        int nYear0 = Integer.parseInt(genMethod.readValueStr(p_startDate,"-",0))+100;
        int nMonth0 = Integer.parseInt(genMethod.readValueStr(p_startDate,"-",1));
        String sDate  = genMethod.readValueStr(p_startDate,"-",2);
        String sDateStr  = genMethod.readValueStr(sDate," ",0);
        int nDay0 = Integer.parseInt(sDateStr);
        String hmsStr = genMethod.readValueStr(sDate," ",1);
        int nHour0 = Integer.parseInt(genMethod.readValueStr(hmsStr,":",0));
        int nMinute0 = Integer.parseInt(genMethod.readValueStr(hmsStr,":",1));
        SLDate startSLDate = new SLDate(nYear0,nMonth0,nDay0,nHour0,nMinute0);
        int nYear1 = Integer.parseInt(genMethod.readValueStr(p_stopDate,"-",0))+100;
        int nMonth1 = Integer.parseInt(genMethod.readValueStr(p_stopDate,"-",1));
        sDate  = genMethod.readValueStr(p_stopDate,"-",2);
        sDateStr  = genMethod.readValueStr(sDate," ",0);
        int nDay1 = Integer.parseInt(sDateStr);
        hmsStr = genMethod.readValueStr(sDate," ",1);
        int nHour1 = Integer.parseInt(genMethod.readValueStr(hmsStr,":",0));
        int nMinute1 = Integer.parseInt(genMethod.readValueStr(hmsStr,":",1));
        SLDate stopSLDate = new SLDate(nYear1,nMonth1,nDay1,nHour1,nMinute1);
        long totalMinutes = (stopSLDate.getTime()-startSLDate.getTime())*24*60/86400000;
        int nHours = (int)totalMinutes/60;
        int nMinutes =  (int)(totalMinutes - Long.parseLong(Integer.toString(nHours*60)));
        return nHours*60 + nMinutes;
    }
    /*
     * 获得在原日期上加多少天后的日期
     */
    public  static String getNextDatePlusDays(String p_runDate,int iDays) throws Exception{
        p_runDate = (p_runDate == null) ?"":p_runDate.trim();
        String tYear = genMethod.readValueStr(p_runDate,"-",0);
        tYear = (tYear.length() < 4)? "20"+tYear:tYear;
        int nYear = Integer.parseInt(tYear);
        int nMonth = Integer.parseInt(genMethod.readValueStr(p_runDate,"-",1));
        String sDate  = genMethod.readValueStr(p_runDate,"-",2);
        sDate  = genMethod.readValueStr(sDate," ",0);
        int nDay = Integer.parseInt(sDate) + iDays;
        SLDate nextDate = new SLDate(nYear,nMonth,nDay);
        int nextYear = nextDate.getYear();
        //System.out.println("nextYear="+nextYear);
        String sNextYear = Integer.toString(nextYear);
        sNextYear = (sNextYear.length() == 1) ? "0"+sNextYear:sNextYear;
        int nextMonth = nextDate.getMonth();
        String sNextMonth = Integer.toString(nextMonth);
        sNextMonth = (sNextMonth.length() == 1) ? "0"+sNextMonth:sNextMonth;
        int nextDay = nextDate.getDate();
        String sNextDay = Integer.toString(nextDay);
        sNextDay = (sNextDay.length() == 1) ? "0" + sNextDay : sNextDay;
        return sNextYear + "-" + sNextMonth + "-" + nextDay + " 00:00:00";
    }
    /**
     * 根据当前日期，返回当前月的最后一天
     * @param datefrom xxxx-xx 如:2009-12
     * @return
     */
    public static String getLastDateByCurrMonth(String datefrom)
    {
        String lastDate = "";
        try {
            String tYear = genMethod.readValueStr(datefrom, "-", 0);
            tYear = (tYear.length() < 4) ? "20" + tYear : tYear;
            int nYear = Integer.parseInt(tYear);
            int nMonth = Integer.parseInt(genMethod.readValueStr(datefrom, "-", 1));
            String sDate = genMethod.readValueStr(datefrom, "-", 2);
            sDate = genMethod.readValueStr(sDate, " ", 0);
            int nDay = Integer.parseInt(sDate);
            String begin = genMethod.readValueStr(sDate + " ", " ", 1);
            int nHour = Integer.parseInt(genMethod.readValueStr(begin, ":", 0));
            int nMinute = Integer.parseInt(genMethod.readValueStr(begin, ":", 1)) + 1;
            SLDate nextShiftMonth = new SLDate(nYear, nMonth + 1, nDay, nHour,
                    nMinute);
            int nextYear = nextShiftMonth.getYear();
            String sNextYear = Integer.toString(nextYear);
            sNextYear = (sNextYear.length() == 1) ? "0" + sNextYear : sNextYear;
            sNextYear = (sNextYear.length() < 4) ? "20" + sNextYear : sNextYear;
            int nextMonth = nextShiftMonth.getMonth();
            String sNextMonth = Integer.toString(nextMonth);
            sNextMonth = (sNextMonth.length() == 1) ? "0" + sNextMonth : sNextMonth;
            int nextDay = nextShiftMonth.getDate();
            String sNextDay = Integer.toString(nextDay);
            sNextDay = (sNextDay.length() == 1) ? "0" + sNextDay : sNextDay;
            String dateto = sNextYear + "-" + sNextMonth + "-" + "01 00:00:00";
            lastDate = dateto;
        }
        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return lastDate;
    }
    public static void main(String[] args) {
        try{
            int Days = getDays("2010-3-1 00:00:00","2010-4-5 00:00:00");
            System.out.println(Days);
        }catch(Exception e){
            System.out.println(e);
            System.out.println("错误信息 :" + e.getMessage());
        }
    }
}
