Java中常见的日期操作(取值、转换、加减、比较)
java 的开发过程中免不了与 date 类型纠缠,准备总结一下项目经常使用的日期相关操作,jdk 版本 1.7,如果能够帮助大家节约那么几分钟起身活动一下,去泡杯咖啡,便是极好的,嘿嘿。当然,我只提供了可行的解决方案,并不保证是最佳实践,欢迎讨论。
1. 日期取值
在旧版本 jdk 的时代,有不少代码中日期取值利用了 java.util.date 类,但是由于 date 类不便于实现国际化,其实从 jdk1.1 开始,就更推荐使用 java.util.calendar 类进行时间和日期方面的处理。这里便不介绍 date 类的操作,让我们直奔主题吧,如何利用 calendar 类取得现在的日期时间。
由于 calendar 的构造器方法被 protected 修饰,所以我们会通过 api 中提供的 getinstance 方法来创建 calendar 对象。
//有多个重载方法创建 calendar 对象 calendar now = calendar.getinstance(); //默认 //指定时区和地区,也可以只输入其中一个参数 calendar now = calendar.getinstance(timezone, locale);
然后我们就可以通过该对象取得当前的各种时间参数了。
int year = now.get(calendar.year); //,当前年份 int month = now.get(calendar.month) + ; //,当前月,注意加 int day = now.get(calendar.date); //,当前日date date = now.gettime(); //直接取得一个 date 类型的日期
要取得其他类型的时间数据仅需修改 now.get() 内的参数,除了以上三种参数,其他常用参数如下:
•calendar.day_of_month:日期,和 calendar.date 相同
•calendar.hour:12 小时制的小时数
•calendar.hour_of_day:24小时制的小时数
•calendar.minute:分钟
•calendar.second:秒
•calendar.day_of_week:周几
除了取得时间数据,我们也可以通过 calendar 对象设置各种时间参数。
//只设定某个字段的值 // public final void set(int field, int value) now.set(calendar.year, ); //设定年月日或者年月日时分或年月日时分秒 // public final void set(int year, int month, int date[, int hourofday, int minute, int second]) now.set(, , [, , , ]); //直接传入一个 date 类型的日期 // public final void settime(date date) now.set(date);
注意:
•当设置了时间参数后,其他相关的数值都会重新计算,例如当你把日期设为 11 号后,周几就会作对应变化。
•获得的月份加 1 才是实际月份。
•在 calendar 类中,周日是 1,周一是 2,以此类推。
2. 日期转换
聊完日期取值,接下来聊聊日期转换,转换一般是 date 型日期与 string 型字符串之间的相互转换,我主要利用 java.text.simpledateformat 进行转换操作。
simpledateformat sdf = new simpledateformat("yyyy-mm-dd hh:mm:ss"); try { //日期转字符串 calendar calendar = calendar.getinstance(); date date = calendar.gettime(); string datestringparse = sdf.format(date); //字符串转日期 string datestring = "-- ::"; date dateparse = sdf.parse(datestring); } catch (parseexception e) { e.printstacktrace(); }
注意:
•创建 simpledateformat 对象时必须指定转换格式。
•转换格式区分大小写,yyyy 代表年份,mm 代表月份,dd 代表日期,hh 代表 24 进制的小时,hh 代表 12 进制的小时,mm 代表分钟,ss 代表秒。
3. 日期加减
通常来说,我们会对日期做两种加减操作:
•以某个日期为基准,计算其几天前/后、几年前/后,或者其他时间单位前后的日期
//根据现在时间计算 calendar now = calendar.getinstance(); now.add(calendar.year, ); //现在时间的年后 now.add(calendar.year, -); //现在时间的年前 //根据某个特定的时间 date (date 型) 计算 calendar specialdate = calendar.getinstance(); specialdate.settime(date); //注意在此处将 specialdate 的值改为特定日期 specialdate.add(calendar.year, ); //特定时间的年后 specialdate.add(calendar.year, -); //特定时间的年前
注意使用了 calendar 对象的 add 方法,可以更改 calendar.year 为任意时间单位字段,完成各种时间单位下的日期计算。
•计算两个时间的间隔,例如计算 2016 年 1 月 1 日距离现在有多少天。
simpledateformat sdf = new simpledateformat("yyyy-mm-dd hh:mm:ss"); string datestring = "-- ::"; calendar calendar = calendar.getinstance(); long nowdate = calendar.gettime().gettime(); //date.gettime() 获得毫秒型日期 try { long specialdate = sdf.parse(datestring).gettime(); long betweendate = (specialdate - nowdate) / ( * * * ); //计算间隔多少天,则除以毫秒到天的转换公式 system.out.print(betweendate); } catch (parseexception e) { e.printstacktrace(); }
4. 日期比较
翻看自己以前的代码,发现每当进行日期比较的操作时,总会先将日期转为 “yyyymmdd” 格式的字符串,再将字符串转为数值,然后比较数值大小。哈哈,一个简单的比较操作,却要写十几行代码,有点目不忍视。现在得说说正确地日期比较姿势是怎么样的。
日期比较一般有两种方法,对于 java.util.date 或者 java.util.calendar 都是通用的。一种是通过 after() 与 before() 方法进行比较,一种是通过 compareto() 方法进行比较。
simpledateformat sdf = new simpledateformat("yyyy-mm-dd hh:mm:ss"); string datestring_01 = "2016-01-01 11:11:11"; string datestring_02 = "2016-01-02 11:11:11"; try { date date_01 = sdf.parse(datestring_01); date date_02 = sdf.parse(datestring_02); system.out.println(date_01.before(date_02)); //true,当 date_01 小于 date_02 时,为 true,否则为 false system.out.println(date_02.after(date_01)); //true,当 date_02 大于 date_01 时,为 true,否则为 false system.out.println(date_01.compareto(date_02)); //-1,当 date_01 小于 date_02 时,为 -1 system.out.println(date_02.compareto(date_01)); //1,当 date_02 大于 date_01 时,为 1 system.out.println(date_02.compareto(date_02)); //0,当两个日期相等时,为 0 } catch (parseexception e) { e.printstacktrace(); }
以上是本文给大家介绍的java中常见的日期操作(取值、转换、加减、比较)的全部叙述,希望大家喜欢。