我的程序中需要用到和VB中DateDiff类似的计算时间差的函数,在网上找不到现成的,就自己写了一个,现在拿出来和大家分享,哪位高人有更好的办法,请指正!下面是代码:
import java.text.*;
import java.util.*;
/**
 * <p>Title: 时间差计算</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2006</p>
 * <p>Company: HZT</p>
 * @author 贺振宇
 * @version 1.0
 */
public class pubFunc 
{
    public pubFunc()
    {
    }
    /**
     * 公有方法,返回两个日期之间的时间间隔。和VB里的DateDiff相同。
     * @param datetype:必选项。字符串表达式表示用于计算 date1 和 date2 之间的时间间隔。
     *        datetype的值:y、yy,为年差;m、mm为月差;d、dd为日差;h、hh为时差;n、nn、mi为分差;s、ss为秒差
     * @param STime、ETime:必选项。日期表达式。用于计算的两个日期。格式为:yyyyMMddhhmmss。
     * @return int 返回时间差值,如果出错,则返回-99999999
     */
    public static int datediff(String datetype,String STime,String ETime)
    {
        int reInt=-999999999;
        datetype=datetype.toUpperCase();
        boolean isTimeStime=false;
        boolean isTimeEtime=false;
        String StartTime="";
        String EndTime="";
        String abs="";
        int i=0;
        int j=0;
        if(Long.parseLong(STime)>Long.parseLong(ETime))
        {
            //比较时间的大小,如果开始时间在结束时间之后,则返回值为负值
            StartTime=ETime;
            EndTime=STime;
            abs="-";
        }
        else
        {
            StartTime=STime;
            EndTime=ETime;
        }
        isTimeStime=isValdateDate(StartTime,"yyyyMMddHHmmss");
        isTimeEtime=isValdateDate(EndTime,"yyyyMMddHHmmss");
        try
        {
            if(isTimeStime&&isTimeEtime)
            {
                //如果开始和结束时间都为合法的并且格式为yyyyMMddHHmmss的时间,则处理,否则,不予处理。
                int intSYear=Integer.parseInt(StartTime.substring(0,4));
                int intSMonth=Integer.parseInt(StartTime.substring(4,6));
                int intSDay=Integer.parseInt(StartTime.substring(6,8));
                int intSHour=Integer.parseInt(StartTime.substring(8,10));
                int intSMinute=Integer.parseInt(StartTime.substring(10,12));
                int intSSecond=Integer.parseInt(StartTime.substring(12,14));
                int intEYear=Integer.parseInt(EndTime.substring(0,4));
                int intEMonth=Integer.parseInt(EndTime.substring(4,6));
                int intEDay=Integer.parseInt(EndTime.substring(6,8));
                int intEHour=Integer.parseInt(EndTime.substring(8,10));
                int intEMinute=Integer.parseInt(EndTime.substring(10,12));
                int intESecond=Integer.parseInt(EndTime.substring(12,14));
                int tmpInt=0;
                //计算年差
                int difYear=intEYear-intSYear;
                //计算月差
                int difMonth=0;
                if(intSYear==intEYear)
                {
                    difMonth=intEMonth-intSMonth;
                }
                else
                {
                    for(i=intSYear;i<=intEYear;i++)
                    {
                        if(i==intSYear)
                        {
                            tmpInt+=(12-intSMonth);
                        }
                        else if (i==intEYear)
                        {
                            tmpInt+=intEMonth;
                        }
                        else
                        {
                            tmpInt+=12;
                        }
                    }
                    difMonth=tmpInt;
                }

解决方案 »

  1.   

    //计算日差 
                    int difDay=0;
                    int ModYear=0;  //年份除以4的余数,如果为0则代表为闰年,否则为平年
                    String runYear="P"; //闰年标志,P为平年,R为闰年
                    tmpInt=0;
                    if(difMonth==0)
                    {
                        //如果年月都相同
                        difDay=intEDay-intSDay;
                    }
                    else
                    {
                        if(difYear==0)
                        {
                            //年相同月不同
                            ModYear=intSYear%4;
                            if(ModYear==0)
                            {
                                runYear="R";
                            }
                            for(j=intSMonth;j<=intEMonth;j++)
                            {
                                if(j==intSMonth)
                                {
                                    tmpInt+=daysOfMonth(j,runYear)-intSDay;
                                }
                                else if(j==intEMonth)
                                {
                                    tmpInt+=intEDay;
                                }
                                else
                                {
                                    tmpInt+=daysOfMonth(j,runYear);
                                }
                            }
                        }
                        else
                        {
                            //年月都不相同
                            for(i=intSYear;i<=intEYear;i++)
                            {
                                ModYear=i%4;
                                if(ModYear==0)
                                {
                                    runYear="R";   //闰年
                                }
                                else
                                {
                                    runYear="P";   //平年
                                }
                                if(i==intSYear)
                                {
                                    for(j=intSMonth;j<=12;j++)
                                    {
                                        if(j==intSMonth)
                                        {
                                            tmpInt+=daysOfMonth(j,runYear)-intSDay;
                                        }
                                        else
                                        {
                                            tmpInt+=daysOfMonth(j,runYear);
                                        }
                                    }
                                }
                                else if (i==intEYear)
                                {
                                    for(j=1;j<=intEMonth;j++)
                                    {
                                        if(j==intEMonth)
                                        {
                                            tmpInt+=intEDay;
                                        }
                                        else
                                        {
                                            tmpInt+=daysOfMonth(j,runYear);
                                        }
                                    }
                                }
                                else
                                {
                                    for(j=1;j<=12;j++)
                                    {
                                        tmpInt+=daysOfMonth(j,runYear);
                                    }
                                }
                            }
                        }
                        difDay=tmpInt;
                    }
                    //计算小时差
                    int difHours=0;
                    difHours=(difDay*24)+(intEHour-intSHour);
                    //计算分钟差
                    int difMinute=0;
                    difMinute=(difHours*60)+(intEMinute-intSMinute);
                    //计算秒差
                    int difSecond=0;
                    difSecond=(difMinute*60)+(intESecond-intSSecond);
                    //System.out.println(String.valueOf(intSMonth));
                    if(datetype.equals("Y")||datetype.equals("YY"))
                    {
                        //处理年差
                        reInt=Integer.parseInt(abs+String.valueOf(difYear));
                    }
                    if(datetype.equals("M")||datetype.equals("MM"))
                    {
                        //处理月差
                        reInt=Integer.parseInt(abs+String.valueOf(difMonth));
                    }
                    if(datetype.equals("D")||datetype.equals("DD"))
                    {
                        //处理日差
                        reInt=Integer.parseInt(abs+String.valueOf(difDay));
                    }
                    if(datetype.equals("H")||datetype.equals("HH"))
                    {
                        //处理时差
                        reInt=Integer.parseInt(abs+String.valueOf(difHours));
                    }
                    if(datetype.equals("N")||datetype.equals("NN")||datetype.equals("MI"))
                    {
                        //处理分差
                        reInt=Integer.parseInt(abs+String.valueOf(difMinute));
                    }
                    if(datetype.equals("S")||datetype.equals("SS"))
                    {
                        //处理秒差
                        reInt=Integer.parseInt(abs+String.valueOf(difSecond));
                    }
                }
            }
            catch(Exception ex)
            {
                System.out.println("dif Error");
            }
            return reInt;
        }
      

  2.   

    /**
         * 公有方法,返回当月的天数。
         * @param iMonth:必选项。月份值。
         * @param YearType:必选项。月份所在年的类型,"R"为闰年,其他为平年
         * @return int 返回当月的天数
         */
        public static int daysOfMonth(int iMonth,String YearType)
        {
            int retInt=0;
            YearType=YearType.toUpperCase();
            try
            {
                switch (iMonth) 
                {
                case 1:
                    retInt=31;
                    break;
                case 2:
                    if(YearType.equals("R"))
                    {
                        retInt=29;
                    }
                    else
                    {
                        retInt=28;
                    }
                    break;
                case 3:
                    retInt=31;
                    break;
                case 4:
                    retInt=30;
                    break;
                case 5:
                    retInt=31;
                    break;
                case 6:
                    retInt=30;
                    break;
                case 7:
                    retInt=31;
                    break;
                case 8:
                    retInt=31;
                    break;
                case 9:
                    retInt=30;
                    break;
                case 10:
                    retInt=31;
                    break;
                case 11:
                    retInt=30;
                    break;
                case 12:
                    retInt=31;
                    break;
                default:
                    retInt = 30;
                    break;
                }
            }
            catch(Exception ex)
            {
            }
            return retInt;
        }
        /**
         * 公有方法,判断字符串是否为日期型。
         * @param strDate:必选项。待判断的字符串。
         * @param formatstr:合法日期表达式的格式。
         * @return int 返回true or false
         */
        public static boolean isValdateDate(String strDate,String formatstr) 
        {
            boolean isPassed = false; 
            SimpleDateFormat sdf = new SimpleDateFormat(formatstr);
            sdf.setLenient( false );
            if (strDate != null && strDate.length() > 0) 
            {
                try 
                {
                    Date dtCheck = new Date();
                    dtCheck=sdf.parse(strDate); 
                    String strCheck = sdf.format(dtCheck); 
                    if(strDate.equals(strCheck)) 
                    {
                        isPassed = true; 
                    } 
                    else 
                    {
                        isPassed = false; 
                    } 
                } 
                catch (Exception e) 
                {
                    isPassed = false;
                }
            }
            return isPassed;
        }
        public static void main(String[] args)
        {
            String stime="";
            String etime="";
            stime="19900130220315";
            etime="20061231010315";
            System.out.println("开始时间:"+stime+"  结束时间:"+etime);
            System.out.println("年差:"+datediff("y",stime,etime));
            System.out.println("月差:"+datediff("m",stime,etime));
            System.out.println("日差:"+datediff("d",stime,etime));
            System.out.println("时差:"+datediff("h",stime,etime));
            System.out.println("分差:"+datediff("n",stime,etime));
            System.out.println("秒差:"+datediff("s",stime,etime));
        }
    }