站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题分享-类似VB的DateDiff的函数

分享-类似VB的DateDiff的函数

摘要: 分享-类似VB的DateDiff的函数


我的程序中需要用到和VB中DateDiff类似的计算时间差的函数,在网上找不到现成的,就自己写了一个,现在拿出来和大家分享,哪位高人有更好的办法,请指正!下面是代码:


import java.text.*;
import java.util.*;
/**
*

Title: 时间差计算


*

Description:


*

Copyright: Copyright (c) 2006


*

Company: HZT


* @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;
}


//计算日差
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;
}


/**
* 公有方法,返回当月的天数。
* @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));
}
}


谁能告诉我如何结贴?好像分不能给自己,又没有其他人跟贴!


写的好麻烦啊


↑返回目录
前一篇: 请教Java高手:关于对象销毁的问题
后一篇: JTable可以合并单元格吗?