java 中calendar常见用法

来源:互联网 发布:网络pc蛋蛋赌博定罪 编辑:程序博客网 时间:2024/05/19 03:24

    有空整理一下之前的东西,因为最近用到了calendar这个类,故做了一些整理.


1.时区和地区的差异

目前比较常用的是GMT和UTC,GMT官方叫做格林尼治时间,也是目前格林尼治天文台的官方时间,世界都比较认可的,UMT也叫世界协调时,是在 GMT基础上作了一些修改,前后差异不大。

地区的差异主要反映在中国普遍以礼拜一作为一个礼拜的开始,西方是以礼拜天作为一个礼拜的开始(这也解释了为什么Calendar.DAY_OF_WEEK返回的时间总是跟我们想要的差了那么一点,比如返回1,其实是礼拜天,而不是我们想象的礼拜一


2.Calendar对象的获取

方法一:  Calendar cal=Calendar.getInstance() 该方法常用,直接获取了calendar的一个实例,返回的是当前的时间.

java8中的源码这么记录:

    /**
     * Gets a calendar using the default time zone and locale. The
     * <code>Calendar</code> returned is based on the current time
     * in the default time zone with the default locale.
     *
     * @return a Calendar.
     */
    public static Calendar getInstance()
    {
        Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
        cal.sharedZone = true;
        return cal;
    }

调取的就是这个静态方法,返回的是一个Calendar对象.

方法二:   Calendar cal= new GregorianCalendar();该方法相对用的少

摘自源码中的代码:

*
 * @see          TimeZone
 * @author David Goldsmith, Mark Davis, Chen-Lieh Huang, Alan Liu
 * @since JDK1.1
 */
public class GregorianCalendar extends Calendar {
    /*
     * Implementation Notes
     *

很明显,GregorianCalendar是Calendar的一个子类


3.通过Calendar设置时间

方法: void set(int field,int value);

  public static String getTimeByCalendar(){
    Calendar cal=Calendar.getInstance();
    cal.set(Calendar.YEAR,2005);
cal.set(Calendar.MONTH,7);
cal.set(Calendar.DAY_OF_MONTH,12);
cal.set(Calendar.HOUR_OF_DAY,15);
cal.set(Calendar.MINUTE,23);
cal.set(Calendar.SECOND,45);
Date date=cal.getTime();
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String time=format.format(date);
return time;
    }

这里需要解释一下: DAY_OF_MONTH:月中的天,也就是几号;

                                 DAY_OF_WEEK:星期中的天,相当于礼拜几;

                                 DAY_OF_YREA:一年中的第几天

                                 HOUR_OF_DAY:此处需要注意的是get获取的是24小时制的时间值

                                此处的MONTH需要注意的是从0开始,我这边写的是7,其实是八月份。

                               其他的类推。


4.通过Calendar获取时间

方法: int get(int field):该方法可以获取Calendar中给定的时间分量对应的值

Calendar cal=Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY,0);
    cal.set(Calendar.MINUTE,0);
    cal.set(Calendar.SECOND,0);
    System.out.println(cal.get(Calendar.HOUR_OF_DAY));


5通过Calendar修改时间值(往前或者往后推算)

方法: void add(int field,int value):当前的calendar加上给定的时间分量对应的值

   Calendar calendar=Calendar.getInstance();
      
      calendar.add(Calendar.DAY_OF_MONTH,5);
      calendar.set(Calendar.MONTH,0);

此处需要注意的是,value的值正负决定是往前还是往后,这个自己可以测试一下

此处还有另外一方法: void roll(int field,int value):主要功能和add差不多,但是两者的差别还是有的:

代码如下:

 public static void main(String[] args) {

      Calendar calendar=Calendar.getInstance();
      calendar.set(Calendar.MONTH,0);
      calendar.roll(Calendar.MONTH,-1);
     System.out.println(convertDateToString(calendar.getTime()));

}

     public static String convertDateToString(Date date){
    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    String time=format.format(date);
    return time;
    }

输出的是:2017-12-27 01:42:36,是不是有点不对,我想要的时间应该是2016-12-27 01:42:36,

可见roll它只会变更当前位置的时间值,不会借位进行对应的加减

我们换成add试试看:

public static void main(String[] args) {

      Calendar calendar=Calendar.getInstance();
      calendar.set(Calendar.MONTH,0);
     calendar.add(Calendar.MONTH,-1);
     System.out.println(convertDateToString(calendar.getTime()));

}

     public static String convertDateToString(Date date){
     SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
     String time=format.format(date);
     return time;
    }

输出的是:2016-12-27 01:42:36

ok,这个才是对的。


6.Calendar与Date之间的转换:

Calendar转换成Date

Calendar calendar=Calendar.getInstance();

Date  date=calendar.getTime()

Date 转换成 Calendar 

Calendar calendar=Calendar.getInstance();

Date date=new Date();

calendar.setTime(date);


ok!!!!    暂时总结到此吧!!!  温故而知新,可以为师矣!

原创粉丝点击