Calendar--Java快速获取昨天日期

    取昨天的日期,本想的截出来日期减一就好了。又一想不对,如果今天是一号怎么办?

    现有两个办法


方法一:

  Date as = new Date(new Date().getTime()-24*60*60*1000);

  SimpleDateFormat matter1 = new SimpleDateFormat("yyyy-MM-dd");
  String time = matter1.format(as);
  System.out.println(time);

取出数字型的时间  再减去24*60*60*1000,就得到昨天的时间了;

这个有点过时了!

方法二:

  Calendar   cal   =   Calendar.getInstance();

  cal.add(Calendar.DATE,   -1);
  String yesterday = new SimpleDateFormat( "yyyy-MM-dd ").format(cal.getTime());
  System.out.println(yesterday);

这个方法很方便,年月日都可以随心所欲的变!


下面总结一下关于Calendar这个类的使用方法:

1.Calendar与date的转换

   Calendar calendar = Calendar.getInstance();
// 从一个 Calendar 对象中获取 Date 对象
   Date date = calendar.getTime();
// 将 Date 对象反应到一个 Calendar 对象中,
// Calendar/GregorianCalendar 没有构造函数可以接受 Date 对象
// 所以我们必需先获得一个实例,然后设置 Date 对象
   calendar.setTime(date);


2.Calendar的set方法

  set(int field, int value) - 是用来设置"年/月/日/小时/分钟/秒/微秒"等值

  field 的定义在 Calendar 中

  set(int year, int month, int day, int hour, int minute, int second);

  另外,月份的起始值为0而不是1,所以要设置八月时,我们用7而不是8。

  例:calendar.set(Calendar.MONTH, 7);


    另外我们要注意的一点是,Calendar 为了性能原因对 set() 方法采取延缓计算的方法。在 JavaDoc 中有下面的例子来说明这个问题:
Calendar cal1 = Calendar.getInstance();
cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31
cal1.set(Calendar.MONTH, Calendar.SEPTEMBER); //应该是 2000-9-31,也就是 2000-10-1
cal1.set(Calendar.DAY_OF_MONTH, 30); //如果 Calendar 转化到 2000-10-1,那么现在的结果就该是 2000-10-30
System.out.println(cal1.getTime()); //输出的是2000-9-30,说明 Calendar 不是马上就刷新其内部的记录
    在 Calendar 的方法中,get() 和 add() 会让 Calendar 立刻刷新。Set() 的这个特性会给我们的开发带来一些意想不到的结果。我们后面会看到这个问题。


3.Calendar的容错性

  通过设置Lenient,默认为true,是进行容错的,当设为false,用户输入错误时间时依然纠错。

import java.io.*;
import java.util.*;

public class WhatIsCalendar
{
public static void main(String[] args) throws Exception{
Calendar cal1 = Calendar.getInstance();
cal1.set(2000, 1, 32, 0, 0, 0);
System.out.println(cal1.getTime());
cal1.setLenient(false);
cal1.set(2000, 1, 32, 0, 0, 0);
System.out.println(cal1.getTime());
}
}
  运行结果:

Tue Feb 01 00:00:00 PST 2000
Exception in thread "main" java.lang.IllegalArgumentException
at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:1368)
at java.util.Calendar.updateTime(Calendar.java:1508)
at java.util.Calendar.getTimeInMillis(Calendar.java:890)
at java.util.Calendar.getTime(Calendar.java:871)
at WhatIsCalendar.main(WhatIsCalendar.java:12)
当我们设置该 Calendar 为 Lenient false 时,它会依据特定的月份检查出错误的赋值。


4.Calendar的add()和roll()方法,很好很强大

  add() 的功能非常强大,add 可以对 Calendar 的字段进行计算。如果需要减去值,那么使用负数值就可以了,如 add(field, -value)。


  add() 有两条规则:

(1)当被修改的字段超出它可以的范围时,那么比它大的字段会自动修正。如:

Calendar cal1 = Calendar.getInstance();
cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31
cal1.add(Calendar.MONTH, 1); //2000-9-31 => 2000-10-1,对吗?
System.out.println(cal1.getTime()); //结果是 2000-9-30

(2)另一个规则是,如果比它小的字段是不可变的(由 Calendar 的实现类决定),那么该小字段会修正到变化最小的值。以上面的例子,9-31 就会变成 9-30,因为变化最小。

  roll() 的规则只有一条:
  当被修改的字段超出它可以的范围时,那么比它大的字段不会被修正。如:

Calendar cal1 = Calendar.getInstance();
cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日
cal1.roll(Calendar.WEEK_OF_MONTH, -1); //1999-6-1, 周二
cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日
cal1.add(Calendar.WEEK_OF_MONTH, -1); //1999-5-30, 周日
WEEK_OF_MONTH 比 MONTH 字段小,所以 roll 不能修正 MONTH 字段。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值