注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云之南

风声,雨声,读书声,声声入耳;家事,国事,天下事,事事关心

 
 
 

日志

 
 
关于我

专业背景:计算机科学 研究方向与兴趣: JavaEE-Web软件开发, 生物信息学, 数据挖掘与机器学习, 智能信息系统 目前工作: 基因组, 转录组, NGS高通量数据分析, 生物数据挖掘, 植物系统发育和比较进化基因组学

网易考拉推荐

JAVA时间的运算  

2008-05-15 10:53:54|  分类: java-j2ee |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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,得到小时。呵呵,我真是够啰嗦!从毫秒转化成秒的时

候,我在google上搜索了半天才确定一秒等于1000毫秒,真是白痴:)。

 

按上面的方式,似乎问题已经解决了。但是,结果得到的小时值很大可能是个小数,而且,有可能

是个小数位很长的小数,这样就要考虑精确位的问题,上面那行代码就不够用了;还有一个比较关

键的问题是,根据我们的习惯,往往可能是希望知道他们相差几小时几分几秒,而不是几点几个小

时,也可能我们只想知道他们差几个小时,至于小时之外还差几分几秒,我们不感兴趣,这样,上

面那行代码也不够用了。

如果要解决这种方式带来的后续的这两个问题,还要写更多的代码,麻烦死了,我是个懒人,不想

费那脑子,我需要找一种更直接,更简单的方式来解决。

 

终于轮到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的毫秒值是当前时间的毫秒值,而我们没有进行设置,所以仍然是当前的毫秒值。用那三行代

码,还是用这几行,任君选择。


public class DateUtil {
   
    //日期格式,年份,例如:2004,2008
    public static final String DATE_FORMAT_YYYY = "yyyy";
   
    //日期格式,年份和月份,例如:200707,200808
    public static final String DATE_FORMAT_YYYYMM = "yyyyMM";
   
    //日期格式,年月日,例如:20050630,20080808
    public static final String DATE_FORMAT_YYYYMMDD = "yyyyMMdd";
   
    //日期格式,年月日,用横杠分开,例如:2006-12-25,2008-08-08
    public static final String DATE_FORMAT_YYYY_MM_DD = "yyyy-MM-dd";
   
    //日期格式,年月日时分秒,例如:20001230120000,20080808200808
    public static final String DATE_TIME_FORMAT_YYYYMMDDHHMISS = "yyyyMMddHHmmss";
   
    //日期格式,年月日时分秒,年月日用横杠分开,时分秒用冒号分开,
    //例如:2005-05-10 23:20:00,2008-08-08 20:08:08
    public static final String DATE_TIME_FORMAT_YYYY_MM_DD_HH_MI_SS = "yyyy-MM-dd

HH:mm:ss";
   
    /**
    * 字符串转换为日期
    * @author dingyongli
    * @param String strDate:日期的字符串形式
    * @param String format:转换格式
    * @return String
    * @throws
    */
    public static Date strToDate(String strDate, String format){
        SimpleDateFormat dateFormat = new SimpleDateFormat(format);
        Date date = null;
        try{
            date = dateFormat.parse(strDate);
        }catch(ParseException e){
            e.printStackTrace();
            //System.out.println(e.getMessage());
        }
        return date;
    }

    /**
    * 字符串转换为日期时间
    * @author dingyongli
    * @param String strDateTime:日期时间的字符串形式
    * @param String format:转换格式
    * @return String
    * @throws
    */
    public static Date strToDateTime(String strDateTime, String fromat){
        SimpleDateFormat dateTimeFormat = new SimpleDateFormat(fromat);
        Date dateTime = null;
        try{
          dateTime = dateTimeFormat.parse(strDateTime);
        }catch(ParseException e){
            e.printStackTrace();
            //System.out.println(e.getMessage());
        }
        return dateTime;
    }

    /**
    * 日期转换为字符串
    * @author dingyongli
    * @param Date date:需要转换的日期
    * @param String format:转换格式
    * @return String
    * @throws
    */
    public static String dateToStr(Date date, String format){
        SimpleDateFormat dateFormat = new SimpleDateFormat(format);
        return dateFormat.format(date);
    }

    /**
    * 日期时间转换为字符串
    * @author dingyongli
    * @param Date date:需要转换的日期
    * @param String format:转换格式
    * @return String
    * @throws
    */   
    public static String dateTimeToStr(Date date, String format){
        SimpleDateFormat dateTimeFormat = new SimpleDateFormat(format);
        return dateTimeFormat.format(date);
    }
   
    /**
    * 得到当天的最后时间,today是字符串类型"yyyy-mm-dd",
    * 返回是日期类型"yyyy-mm-dd 23:59:59"
    * @author dingyongli
    * @param String today
    * @return Date
    * @throws
    */   
    public static Date getTodayLastTime(String today){
        String todayLastTime = today + " 23:59:59";
        return strToDateTime

(todayLastTime,DateUtil.DATE_TIME_FORMAT_YYYY_MM_DD_HH_MI_SS);       
    }   
}

  评论这张
 
阅读(1972)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016