Java时间的运算

(这个内容比较多单独再写一个)



首先简单介绍一下Calendar,JDK的文档里说,Calendar主要是用来对Date对象和Integer对象做转换的(这样看起来上面那个问题我们也可以使用Calendar)。事实上,实际的开发应用中,Calendar往往用来对时间进行操作,比如说设置个时间啊,对时间进行个对比运算什么滴。 

举个例子,已知两个Date型时间对象,date1、date2,我们需要计算出这两个时间之间相差几个小时,怎么做。 

一种思路:得到这两个时间对象的long值,然后相减,这就得到了他们相差的毫秒值,然后再根据这个毫秒值算出对应的小时。代码如下: 

int distance = (int)((date2.getTime() - date1.getTime())/1000/60/60); 

简单解释一下: 

date2.getTime() - date1.getTime()得到相应的long型时间值并相减,得到相差的毫秒值,再除1000,得到秒,再除60,得到分,再除60,得到小时。呵呵,我真是够啰嗦! 



按上面的方式,似乎问题已经解决了。但是,结果得到的小时值很大可能是个小数,而且,有可能是个小数位很长的小数,这样就要考虑精确位的问题,上面那行代码就不够用了;还有一个比较关键的问题是,根据我们的习惯,往往可能是希望知道他们相差几小时几分几秒,而不是几点几个小时,也可能我们只想知道他们差几个小时,至于小时之外还差几分几秒,我们不感兴趣,这样,上面那行代码也不够用了。 

如果要解决这种方式带来的后续的这两个问题,还要写更多的代码,麻烦死了,我是个懒人,不想费那脑子,我需要找一种更直接,更简单的方式来解决。 



终于轮到Calendar出场了,对上面的问题,解决的代码如下: 

Calendar ca1 = Calendar.getInstance(); 

Calendar ca2 = Calendar.getInstance(); 

ca1.setTime(date1); 

ca2.setTime(date2); 

int distanceHour = ca2.get(Calendar.HOUR_OF_DAY) - ca1.get(Calendar.HOUR_OF_DAY); 



虽然有五行代码,但这五行代码根本都不用费我的脑子考虑,不像前面的,还要考虑转化什么的,而且这五行代码完全可以像前面一样用一行代码搞定。 

这样就得到了这两个时间相差的小时的值,我可以保证绝对是个整数,因为这个distanceHour只是这两个时间对象的小时数之差,而不考虑它们的分秒的差,如果想得它们差几分,代码如下 

int distanceMin = ca2.get(Calendar.MINUTE) - ca1.get(Calendar.MINUTE); 



解释一下上面的代码: 

Calendar ca1 = Calendar.getInstance(); 

得到一个Calendar对象,Calendar不提供公用的构造函数,不能new。这行代码得到的新对象的时间设置为当前时间。 

ca1.setTime(date1); 

把Calendar对象的时间设置为date1的时间。 

ca1.get(Calendar.HOUR_OF_DAY) 

获取Calendar对象的小时值,这里得到的是24小时制的。这个get方法参数是int型的,用来指定想要获取的域(field),就是什么年啊月啊周啊小时的东西。参数需要用Calendar类定义的常量,每个常量对应一个域(field),这些常量的含义都很明显(都可以顾名思义出来),用的时候在IDE环境里直接打点选择就可以。 

这个get方法用起来很灵活,比如得到一天的int值,我们可以得到这一天一个月里的第几天,也可以得到一周里的第几天,也可以得到一年里的第几天,只要传进对应的参数就OK了。 

有一点需要注意的是,按照我们的习惯,周一是一周的第一天,而老外的习惯是周日才是第一天,他们是先做完礼拜才开始这一周的。所以如果今天是周一,我们使用ca1.get(Calendar.DAY_OF_WEEK)时得到的值是2。 





前面提到,Canlendar也可以用来设置时间,代码如下 

Calendar ca = Calendar.getInstance(); 

ca.set(Calendar.YEAR, 2006); 

ca.set(Calendar.MONTH, 7); 

ca.set(Calendar.DAY_OF_MONTH, 1); 

ca.set(Calendar.HOUR_OF_DAY, 14); 

ca.set(Calendar.MINUTE,0); 

ca.set(Calendar.SECOND, 0); 

Date date = ca.getTime(); 

这跟前面第三个问题中的那三行代码的结果基本上是一样的,为什么说基本上?因为毫秒值不一样,ca的毫秒值是当前时间的毫秒值,而我们没有进行设置,所以仍然是当前的毫秒值。用那三行代码,还是用这几行,任君选择。 

java.util.*; 
import java.text.*; 
import java.util.Calendar; 
public class VeDate { 
/** 
       * 获取现在时间 
       * 
       * @return 返回时间类型 yyyy-MM-dd HH:mm:ss 
       */ 
public static Date getNowDate() { 
       Date currentTime = new Date(); 
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       String dateString = formatter.format(currentTime); 
       ParsePosition pos = new ParsePosition(8); 
       Date currentTime_2 = formatter.parse(dateString, pos); 
       return currentTime_2; 

/** 
       * 获取现在时间 
       * 
       * @return返回短时间格式 yyyy-MM-dd 
       */ 
public static Date getNowDateShort() { 
       Date currentTime = new Date(); 
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
       String dateString = formatter.format(currentTime); 
       ParsePosition pos = new ParsePosition(8); 
       Date currentTime_2 = formatter.parse(dateString, pos); 
       return currentTime_2; 

/** 
       * 获取现在时间 
       * 
       * @return返回字符串格式 yyyy-MM-dd HH:mm:ss 
       */ 
public static String getStringDate() { 
       Date currentTime = new Date(); 
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       String dateString = formatter.format(currentTime); 
       return dateString; 

/** 
       * 获取现在时间 
       * 
       * @return 返回短时间字符串格式yyyy-MM-dd 
       */ 
public static String getStringDateShort() { 
       Date currentTime = new Date(); 
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
       String dateString = formatter.format(currentTime); 
       return dateString; 

/** 
       * 获取时间 小时:分;秒 HH:mm:ss 
       * 
       * @return 
       */ 
public static String getTimeShort() { 
       SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); 
       Date currentTime = new Date(); 
       String dateString = formatter.format(currentTime); 
       return dateString; 

/** 
       * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss 
       * 
       * @param strDate 
       * @return 
       */ 
public static Date strToDateLong(String strDate) { 
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       ParsePosition pos = new ParsePosition(0); 
       Date strtodate = formatter.parse(strDate, pos); 
       return strtodate; 

/** 
       * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm:ss 
       * 
       * @param dateDate 
       * @return 
       */ 
public static String dateToStrLong(java.util.Date dateDate) { 
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       String dateString = formatter.format(dateDate); 
       return dateString; 

/** 
       * 将短时间格式时间转换为字符串 yyyy-MM-dd 
       * 
       * @param dateDate 
       * @param k 
       * @return 
       */ 
public static String dateToStr(java.util.Date dateDate) { 
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
       String dateString = formatter.format(dateDate); 
       return dateString; 

/** 
       * 将短时间格式字符串转换为时间 yyyy-MM-dd 
       * 
       * @param strDate 
       * @return 
       */ 
public static Date strToDate(String strDate) { 
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
       ParsePosition pos = new ParsePosition(0); 
       Date strtodate = formatter.parse(strDate, pos); 
       return strtodate; 

/** 
       * 得到现在时间 
       * 
       * @return 
       */ 
public static Date getNow() { 
       Date currentTime = new Date(); 
       return currentTime; 

/** 
       * 提取一个月中的最后一天 
       * 
       * @param day 
       * @return 
       */ 
public static Date getLastDate(long day) { 
       Date date = new Date(); 
       long date_3_hm = date.getTime() - 3600000 * 34 * day; 
       Date date_3_hm_date = new Date(date_3_hm); 
       return date_3_hm_date; 


/** 
       * 得到现在时间 
       * 
       * @return 字符串 yyyyMMdd HHmmss 
       */ 
public static String getStringToday() { 
       Date currentTime = new Date(); 
       SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd HHmmss"); 
       String dateString = formatter.format(currentTime); 
       return dateString; 

// 计算当月最后一天,返回字符串 
public String getDefaultDay(){  
      String str = ""; 
      SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");    

      Calendar lastDate = Calendar.getInstance(); 
      lastDate.set(Calendar.DATE,1);//设为当前月的1号 
      lastDate.add(Calendar.MONTH,1);//加一个月,变为下月的1号 
      lastDate.add(Calendar.DATE,-1);//减去一天,变为当月最后一天 
  
      str=sdf.format(lastDate.getTime()); 
      return str;  

/** 
       * 得到现在小时 
       */ 
public static String getHour() { 
       Date currentTime = new Date(); 
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       String dateString = formatter.format(currentTime); 
       String hour; 
       hour = dateString.substring(11, 13); 
       return hour; 

/** 
       * 得到现在分钟 
       * 
       * @return 
       */ 
public static String getTime() { 
       Date currentTime = new Date(); 
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       String dateString = formatter.format(currentTime); 
       String min; 
       min = dateString.substring(14, 16); 
       return min; 

/** 
       * 根据用户传入的时间表示格式,返回当前时间的格式 如果是yyyyMMdd,注意字母y不能大写。 
       * 
       * @param sformat 
       *                 yyyyMMddhhmmss 
       * @return 
       */ 
public static String getUserDate(String sformat) { 
       Date currentTime = new Date(); 
       SimpleDateFormat formatter = new SimpleDateFormat(sformat); 
       String dateString = formatter.format(currentTime); 
       return dateString; 

/** 
       * 二个小时时间间的差值,必须保证二个时间都是"HH:MM"的格式,返回字符型的分钟 
       */ 
public static String getTwoHour(String st1, String st2) { 
       String[] kk = null; 
       String[] jj = null; 
       kk = st1.split(":"); 
       jj = st2.split(":"); 
       if (Integer.parseInt(kk[0]) < Integer.parseInt(jj[0])) 
        return "0"; 
       else { 
        double y = Double.parseDouble(kk[0]) + Double.parseDouble(kk[1]) / 60; 
        double u = Double.parseDouble(jj[0]) + Double.parseDouble(jj[1]) / 60; 
        if ((y - u) > 0) 
         return y - u + ""; 
        else 
         return "0"; 
       } 

/** 
       * 得到二个日期间的间隔天数 
       */ 
public static String getTwoDay(String sj1, String sj2) { 
       SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); 
       long day = 0; 
       try { 
        java.util.Date date = myFormatter.parse(sj1); 
        java.util.Date mydate = myFormatter.parse(sj2); 
        day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000); 
       } catch (Exception e) { 
        return ""; 
       } 
       return day + ""; 

/** 
       * 时间前推或后推分钟,其中JJ表示分钟. 
       */ 
public static String getPreTime(String sj1, String jj) { 
       SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       String mydate1 = ""; 
       try { 
        Date date1 = format.parse(sj1); 
        long Time = (date1.getTime() / 1000) + Integer.parseInt(jj) * 60; 
        date1.setTime(Time * 1000); 
        mydate1 = format.format(date1); 
       } catch (Exception e) { 
       } 
       return mydate1; 

/** 
       * 得到一个时间延后或前移几天的时间,nowdate为时间,delay为前移或后延的天数 
       */ 
public static String getNextDay(String nowdate, String delay) { 
       try{ 
       SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 
       String mdate = ""; 
       Date d = strToDate(nowdate); 
       long myTime = (d.getTime() / 1000) + Integer.parseInt(delay) * 24 * 60 * 60; 
       d.setTime(myTime * 1000); 
       mdate = format.format(d); 
       return mdate; 
       }catch(Exception e){ 
        return ""; 
       } 

/** 
       * 判断是否润年 
       * 
       * @param ddate 
       * @return 
       */ 
public static boolean isLeapYear(String ddate) { 
       /** 
        * 详细设计: 1.被400整除是闰年,否则: 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年 
        * 3.能被4整除同时能被100整除则不是闰年 
        */ 
       Date d = strToDate(ddate); 
       GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance(); 
       gc.setTime(d); 
       int year = gc.get(Calendar.YEAR); 
       if ((year % 400) == 0) 
        return true; 
       else if ((year % 4) == 0) { 
        if ((year % 100) == 0) 
         return false; 
        else 
         return true; 
       } else 
        return false; 

/** 
       * 返回美国时间格式 26 Apr 2006 
       * 
       * @param str 
       * @return 
       */ 
public static String getEDate(String str) { 
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
       ParsePosition pos = new ParsePosition(0); 
       Date strtodate = formatter.parse(str, pos); 
       String j = strtodate.toString(); 
       String[] k = j.split(" "); 
       return k[2] + k[1].toUpperCase() + k[5].substring(2, 4); 

/** 
       * 获取一个月的最后一天 
       * 
       * @param dat 
       * @return 
       */ 
public static String getEndDateOfMonth(String dat) {// yyyy-MM-dd 
       String str = dat.substring(0,
       String month = dat.substring(5, 7); 
       int mon = Integer.parseInt(month); 
       if (mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8 || mon == 10 || mon == 12) { 
        str += "31"; 
       } else if (mon == 4 || mon == 6 || mon == 9 || mon == 11) { 
        str += "30"; 
       } else { 
        if (isLeapYear(dat)) { 
         str += "29"; 
        } else { 
         str += "28"; 
        } 
       } 
       return str; 

/** 
       * 判断二个时间是否在同一个周 
       * 
       * @param date1 
       * @param date2 
       * @return 
       */ 
public static boolean isSameWeekDates(Date date1, Date date2) { 
       Calendar cal1 = Calendar.getInstance(); 
       Calendar cal2 = Calendar.getInstance(); 
       cal1.setTime(date1); 
       cal2.setTime(date2); 
       int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR); 
       if (0 == subYear) { 
        if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR)) 
         return true; 
       } else if (1 == subYear && 11 == cal2.get(Calendar.MONTH)) { 
        // 如果12月的最后一周横跨来年第一周的话则最后一周即算做来年的第一周 
        if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR)) 
         return true; 
       } else if (-1 == subYear && 11 == cal1.get(Calendar.MONTH)) { 
        if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR)) 
         return true; 
       } 
       return false; 

/** 
       * 产生周序列,即得到当前时间所在的年度是第几周 
       * 
       * @return 
       */ 
public static String getSeqWeek() { 
       Calendar c = Calendar.getInstance(Locale.CHINA); 
       String week = Integer.toString(c.get(Calendar.WEEK_OF_YEAR)); 
       if (week.length() == 1) 
        week = "0" + week; 
       String year = Integer.toString(c.get(Calendar.YEAR)); 
       return year + week; 

======================================================= 
# import java.text.DateFormat; 
# import java.text.SimpleDateFormat; 
# import java.text.ParseException; 
# import java.util.Calendar; 
# import java.util.Date; 


# DateFormat format = new SimpleDateFormat("yyyy-MM-dd");        
# Date date = null;   
# String str = null;                 
#            
# // String转Date   
# str = "2007-1-18";         
# try {   
#     date = format.parse(str);  // Thu Jan 18 00:00:00 CST 2007   
# } catch (ParseException e) {   
#     e.printStackTrace();   
# }   
#            
# date = java.sql.Date.valueOf(str);  // 只保留日期部分,返回的是java.sql.Date  2007-01-18   
#            
# // Date转String   
# date = new Date();   // Thu Jan 18 21:35:01 CST 2007   
# /*Calendar cal = Calendar.getInstance();  
# date = new Date(cal.getTimeInMillis());*/  
# str = format.format(date);  // 2007-01-18   
#            
# format = DateFormat.getDateInstance(DateFormat.SHORT);   
# str = format.format(date);  // 07-1-18   
#            
# format = DateFormat.getDateInstance(DateFormat.MEDIUM);   
# str = format.format(date);  // 2007-1-18   
#            
# format = DateFormat.getDateInstance(DateFormat.FULL);   
# str = format.format(date);  // 2007年1月18日 星期四

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值