java时间加减_聊聊Java中⽇期的⼏种常见操作——取值、转
换、加减、⽐较
Java 的开发过程中免不了与 Date 类型纠缠,准备总结⼀下项⽬经常使⽤的⽇期相关操作,JDK 版本 1.7,如果能够帮助⼤家节约那么⼏分钟起⾝活动⼀下,去泡杯咖啡,便是极好的,嘿嘿。当然,我只提供了可⾏的解决⽅案,并不保证是最佳实践,欢迎讨论。
1. ⽇期取值
在旧版本 JDK 的时代,有不少代码中⽇期取值利⽤了 java.util.Date 类,但是由于 Date 类不便于实现国际化,其实从 JDK1.1 开始,就更推荐使⽤ java.util.Calendar 类进⾏时间和⽇期⽅⾯的处理。这⾥便不介绍 Date 类的操作,让我们直奔主题吧,如何利⽤ Calendar 类取得现在的⽇期时间。
由于 Calendar 的构造器⽅法被 protected 修饰,所以我们会通过 API 中提供的 getInstance ⽅法来创建 Calendar 对象。
1 //有多个重载⽅法创建 Calendar 对象
2 Calendar now = Instance(); //默认
3 //指定时区和地区,也可以只输⼊其中⼀个参数
4 Calendar now = Instance(timeZone, locale);
然后我们就可以通过该对象取得当前的各种时间参数了。
int year = (Calendar.YEAR); //2015,当前年份
int month = (Calendar.MONTH) + 1; //12,当前⽉,注意加 1
int day = (Calendar.DATE); //23,当前⽇
Date date = Time(); //直接取得⼀个 Date 类型的⽇期
要取得其他类型的时间数据仅需修改 () 内的参数,除了以上三种参数,其他常⽤参数如下:
Calendar.DAY_OF_MONTH:⽇期,和 Calendar.DATE 相同
Calendar.HOUR:12 ⼩时制的⼩时数
Calendar.HOUR_OF_DAY:24⼩时制的⼩时数
Calendar.MINUTE:分钟
Calendar.SECOND:秒
Calendar.DAY_OF_WEEK:周⼏
除了取得时间数据,我们也可以通过 Calendar 对象设置各种时间参数。
1 //只设定某个字段的值
2 //public final void set(int field, int value)
3 now.set(Calendar.YEAR, 2016);
4 //设定年⽉⽇或者年⽉⽇时分或年⽉⽇时分秒
5 //public final void set(int year, int month, int date[, int hourOfDay, int minute, int second])
6 now.set(2016, 1, 1[, 11, 1, 1]);
7 //直接传⼊⼀个 Date 类型的⽇期
8 //public final void setTime(Date date)
9 now.set(date);
注意:
当设置了时间参数后,其他相关的数值都会重新计算,例如当你把⽇期设为 11 号后,周⼏就会作对应变化。
获得的⽉份加 1 才是实际⽉份。
string转date的方法在 Calendar 类中,周⽇是 1,周⼀是 2,以此类推。
2. ⽇期转换
聊完⽇期取值,接下来聊聊⽇期转换,转换⼀般是 Date 型⽇期与 String 型字符串之间的相互转换,我主要利⽤
1 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
2 try{
3 //⽇期转字符串
4 Calendar calendar =Instance();
5 Date date =Time();
6 String dateStringParse =sdf.format(date);
7 //字符串转⽇期
8 String dateString = "2016-01-01 11:11:11";9 Date dateParse =sdf.parse(dateString);10 } catch(ParseException e) {11
e.printStackTrace();12 }
注意:
创建 SimpleDateFormat 对象时必须指定转换格式。
转换格式区分⼤⼩写,yyyy 代表年份,MM 代表⽉份,dd 代表⽇期,HH 代表 24 进制的⼩时,hh 代表 12 进制的⼩时,mm 代表分钟,ss 代表秒。
3. ⽇期加减
通常来说,我们会对⽇期做两种加减操作:
以某个⽇期为基准,计算其⼏天前/后、⼏年前/后,或者其他时间单位前后的⽇期
1 //根据现在时间计算
2 Calendar now =Instance();
3 now.add(Calendar.YEAR, 1); //现在时间的1年后
4 now.add(Calendar.YEAR, -1); //现在时间的1年前
5 //根据某个特定的时间 date (Date 型) 计算
6 Calendar specialDate =Instance();
7 specialDate.setTime(date); //注意在此处将 specialDate 的值改为特定⽇期
8 specialDate.add(Calendar.YEAR, 1); //特定时间的1年后
9 specialDate.add(Calendar.YEAR, -1); //特定时间的1年前
注意使⽤了 Calendar 对象的 add ⽅法,可以更改 Calendar.YEAR 为任意时间单位字段,完成各种时间单位下的⽇期计算。
计算两个时间的间隔,例如计算 2016 年 1 ⽉ 1 ⽇距离现在有多少天。
1 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
2 String dateString = "2016-01-01
11:11:11";3 Calendar calendar =Instance();4 long nowDate = Time().getTime(); //Time() 获得毫秒型⽇期
5 try{
6 long specialDate =sdf.parse(dateString).getTime();
7 long betweenDate = (specialDate - nowDate) / (1000 * 60 * 60 * 24); //计算间隔多少天,则除以毫
秒到天的转换公式
8 System.out.print(betweenDate);9 } catch(ParseException e) {10 e.printStackTrace();11 }
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_01pareTo(date_02)); //-1,当 date_01 ⼩于 date_02 时,为 -1
System.out.println(date_02pareTo(date_01)); //1,当 date_02 ⼤于 date_01 时,为 1
System.out.println(date_02pareTo(date_02)); //0,当两个⽇期相等时,为 0
} catch(ParseException e) {
e.printStackTrace();
}
5. ⼯具库推荐
看见有朋友向我推荐了 Joda-Time 库,经过研究后发现能够简化不少 Java 中⽇期时间的操作,特别是在某些应⽤场景下还得 Date 转Calendar 或者 String 转 Date 之类的操作。库的使⽤逻辑与原⽣⼗分相像,学习曲线还是⽐较平缓的,在此也向各位读者提供⼀个更加多元的选择。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论