• Calendar 日历类的时间操作


    我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX,欢迎您!今天是XXXX年。。。。某些网站会记录下用户登陆的时间,比如银行的一些网站,对于这些经常需要处理的问题,Java中提供了Calendar这个专门用于对日期进行操作的类,那么这个类有什么特殊的地方呢,首先我们来看Calendar的声明

    public abstract class Calendar extends Objectimplements Serializable, Cloneable, Comparable<Calendar>

    该类被abstract所修饰,说明不能通过new的方式来获得实例,对此,Calendar提供了一个类方法getInstance,以获得此类型的一个通用的对象,getInstance方法返回一个Calendar对象(该对象为Calendar的子类对象),其日历字段已由当前日期和时间初始化:

    Calendar rightNow = Calendar.getInstance();

    为什么说返回的是Calendar的子类对象呢,因为每个国家地区都有自己的一套日历算法,比如西方国家的第一个星期大部分为星期日,而中国则为星期一,我们来看看getInstance方法获取实例的源码

    /**
     * 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;
    }
    View Code

    注意事项:

    Calendar 的 month 从 0 开始,也就是全年 12 个月由 0 ~ 11 进行表示。

    而 Calendar.DAY_OF_WEEK 定义值如下,每周从 SUNDAY 开始,从 1 ~ 7

    Calendar.SUNDAY = 1
    Calendar.MONDAY = 2
    Calendar.TUESDAY = 3
    Calendar.WEDNESDAY = 4
    Calendar.THURSDAY = 5
    Calendar.FRIDAY = 6
    Calendar.SATURDAY = 7

    Java Calendar 演示代码如下:

    package demo;
     
    import java.util.Date;
    import java.text.SimpleDateFormat;
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.util.Calendar;
     
    public class Test
    {
      public Test()
      {
      }
     
      public static void main(String[] args)
      {
        // 字符串转换日期格式
        // DateFormat fmtDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 接收传入参数
        // String strDate = args[1];
        // 得到日期格式对象
        // Date date = fmtDateTime.parse(strDate);
     
        // 完整显示今天日期时间
        String str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(new Date());
        System.out.println(str);
     
        // 创建 Calendar 对象
        Calendar calendar = Calendar.getInstance();
     
        try
        {
          // 对 calendar 设置时间的方法
          // 设置传入的时间格式
          SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-M-d H:m:s");
          // 指定一个日期
          Date date = dateFormat.parse("2013-6-1 13:24:16");
          // 对 calendar 设置为 date 所定的日期
          calendar.setTime(date);
     
          // 按特定格式显示刚设置的时间
          str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(calendar.getTime());
          System.out.println(str);
        }
        catch (ParseException e)
        {
          e.printStackTrace();
        }
     
        // 或者另一種設置 calendar 方式
        // 分別爲 year, month, date, hourOfDay, minute, second
        calendar = Calendar.getInstance();
        calendar.set(2013, 1, 2, 17, 35, 44);
        str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(calendar.getTime());
        System.out.println(str);
     
        // Calendar 取得当前时间的方法
        // 初始化 (重置) Calendar 对象
        calendar = Calendar.getInstance();
        // 或者用 Date 来初始化 Calendar 对象
        calendar.setTime(new Date());
     
        // setTime 类似上面一行
        // Date date = new Date();
        // calendar.setTime(date);
     
        str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")).format(calendar.getTime());
        System.out.println(str);
     
        // 显示年份
        int year = calendar.get(Calendar.YEAR);
        System.out.println("year is = " + String.valueOf(year));
     
        // 显示月份 (从0开始, 实际显示要加一)
        int month = calendar.get(Calendar.MONTH);
        System.out.println("nth is = " + (month + 1));
     
        // 本周几
        int week = calendar.get(Calendar.DAY_OF_WEEK);
        System.out.println("week is = " + week);
     
        // 今年的第 N 天
        int DAY_OF_YEAR = calendar.get(Calendar.DAY_OF_YEAR);
        System.out.println("DAY_OF_YEAR is = " + DAY_OF_YEAR);
     
        // 本月第 N 天
        int DAY_OF_MONTH = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println("DAY_OF_MONTH = " + String.valueOf(DAY_OF_MONTH));
     
        // 3小时以后,Calendar.HOUR_OF_DAY是24小时制Calendar.HOUR是12小时制
    
        calendar.add(Calendar.HOUR_OF_DAY, 3);
        int HOUR_OF_DAY = calendar.get(Calendar.HOUR_OF_DAY);
        System.out.println("HOUR_OF_DAY + 3 = " + HOUR_OF_DAY);
     
        // 当前分钟数
        int MINUTE = calendar.get(Calendar.MINUTE);
        System.out.println("MINUTE = " + MINUTE);
     
        // 15 分钟以后
        calendar.add(Calendar.MINUTE, 15);
        MINUTE = calendar.get(Calendar.MINUTE);
        System.out.println("MINUTE + 15 = " + MINUTE);
     
        // 30分钟前
        calendar.add(Calendar.MINUTE, -30);
        MINUTE = calendar.get(Calendar.MINUTE);
        System.out.println("MINUTE - 30 = " + MINUTE);
     
        // 格式化显示
        str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime());
        System.out.println(str);
     
        // 重置 Calendar 显示当前时间
        calendar.setTime(new Date());
        str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS")).format(calendar.getTime());
        System.out.println(str);
     
        // 创建一个 Calendar 用于比较时间
        Calendar calendarNew = Calendar.getInstance();
     
        // 设定为 5 小时以前,后者大,显示 -1
        calendarNew.add(Calendar.HOUR, -5);
        System.out.println("时间比较:" + calendarNew.compareTo(calendar));
     
        // 设定7小时以后,前者大,显示 1
        calendarNew.add(Calendar.HOUR, +7);
        System.out.println("时间比较:" + calendarNew.compareTo(calendar));
     
        // 退回 2 小时,时间相同,显示 0
        calendarNew.add(Calendar.HOUR, -2);
        System.out.println("时间比较:" + calendarNew.compareTo(calendar));
      }
    }

    运行结果

    2013-06-07 23:27:34:195
    2013-06-01 13:24:16:000
    2013-02-02 17:35:44:197
    2013-06-07 23:27:34:197
    year is = 2013
    nth is = 6
    week is = 6
    DAY_OF_YEAR is = 158
    DAY_OF_MONTH = 7
    HOUR_OF_DAY + 3 = 2
    MINUTE = 27
    MINUTE + 15 = 42
    MINUTE - 30 = 12
    2013-06-08 02:12:34:197
    2013-06-07 23:27:34:199
    时间比较:-1
    时间比较:1
    时间比较:0

    要计算时间差,可用 Calendar.getTimeInMillis() 取得两个时间的微秒级的时间差,再加以换算即可,比如获得相差天数,代码如下:

        // 得微秒级时间差
        long val = calendarEnd.getTimeInMillis() - calendarBegin.getTimeInMillis();
        // 换算后得到天数
        long day = val / (1000 * 60 * 60 * 24);

    其他与 date 相关的类型转换代码如下。

    Timestamp 类型转换为 Date 类型:

    Timestamp stamp = new Timestamp(System.currentTimeMillis());
    Date date = new Date(stamp.getTime());
    System.out.println(date);

    Timestamp 类型转换为 Calendar 类型:

    // 获取 Timestamp 类型时间
    Timestamp timestamp = new Timestamp(System.currentTimeMillis());
     
    // 转换为 Calendar 类型,SUN 也推荐用 Calendar 处理时间信息
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(timestamp.getTime());

    Date 类型转换为 Calendar 类型

    // Date 向 Calendar 赋值
    calendar.setTime(date);

    Calendar 类型转换为 Timestamp 类型:

    // 创建 Calendar 对象,也同时获取了当前时间
    Calendar calendar = Calendar.getInstance();
     
    // 转换为 Timestamp 类型对象
    Timestamp timestamp = new Timestamp(calendar.getTimeInMillis());
    System.out.println(timestamp);

    Calendar 类型转换为 Date 类型:

    // Calendar 对象类型转换为 Date 对象类型
    Calendar calendar = Calendar.getInstance();
    java.util.Date date = calendar.getTime();
    System.out.println(date);

     add() 与 roll() 的区别

    add() 的功能非常强大,add 可以对 Calendar 的字段进行计算。如果需要减去值,那么使用负数值就可以了,如 add(field, -value)。
    add() 有两条规则:
    当被修改的字段超出它可以的范围时,那么比它大的字段会自动修正。如:Calendar cal1 = Calendar.getInstance();cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31cal1.add(Calendar.MONTH, 1); //2000-9-31 => 2000-10-1,对吗?System.out.println(cal1.getTime()); //结果是 2000-9-30
    另一个规则是,如果比它小的字段是不可变的(由 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 字段。

    roll()函数处理,只会比相应的字段进行处理,不会智能的对其它字段也进行逻辑上的改变。但是add()函数会在逻辑上改变其它字段,使结果正确。

     java取得当前日期增加一天或多天

     

    代码如下:

    复制代码
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
    Calendar c = Calendar.getInstance();
    System.out.println("当前日期:"+sf.format(c.getTime()));
    c.add(Calendar.DAY_OF_MONTH, 1);
    System.out.println("增加一天后日期:"+sf.format(c.getTime()));
    //打印结果
    //当前日期:         2013-06-18
    //增加一天后日期 :   2013-06-19
    复制代码

    Java Calendar获取年、月、日、时间

    复制代码
     Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00"));    //获取东八区时间
    
    int year = c.get(Calendar.YEAR);    //获取年   
    int month = c.get(Calendar.MONTH) + 1;   //获取月份,0表示1月份   
    int day = c.get(Calendar.DAY_OF_MONTH);    //获取当前天数   
    int first = c.getActualMinimum(c.DAY_OF_MONTH);    //获取本月最小天数   
    int last = c.getActualMaximum(c.DAY_OF_MONTH);    //获取本月最大天数   
    int time = c.get(Calendar.HOUR_OF_DAY);       //获取当前小时   
    int min = c.get(Calendar.MINUTE);          //获取当前分钟   
    int xx = c.get(Calendar.SECOND);          //获取当前秒
    
     
    
    SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String curDate = s.format(c.getTime());  //当前日期   
    System.out.println("当前时间:"+year + "-" + month + "-"+ day + " "+time + ":" + min +":" + xx);   
    System.out.println("第一天和最后天:" + first +"," + last);
    System.out.println("当前日期curDate====:" + curDate);
    复制代码

    输出结果:

    当前时间:2012-9-25 22:50:54 第一天和最后天:1,30

    当前日期curDate:2012-09-25 22:50:54

    Calendar的计算

    复制代码
    c.add(Calendar.YEAR, 1);   
    c.add(Calendar.MONTH, 1);   
    c.add(Calendar.DAY_OF_MONTH, 1);  
    int year2 = c.get(Calendar.YEAR);   
    int month2 = c.get(Calendar.MONTH) + 1;   
    int day2 = c.get(Calendar.DAY_OF_MONTH);  
    int firstD = c.getActualMinimum(c.DAY_OF_MONTH);   
    int lastD = c.getActualMaximum(c.DAY_OF_MONTH);   
    System.out.println("当前时间:"+year2 + "-" + month2 + "-"+ day2 + " "+time + ":" + min +":" + xx);   
    System.out.println("第一天和最后天:" + firstD +"," + lastD);
    复制代码

    输出结果:

    当前时间:2013-10-26 23:4:3 第一天和最后天:1,31

    获取上个月的年、月、日

    复制代码
    Calendar c=Calendar.getInstance();
    c.add(Calendar.MONTH, -1);//上个月
    SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String year=String.valueOf(c.get(Calendar.YEAR));
    String topDay = String.valueOf(c.getActualMinimum(Calendar.DAY_OF_MONTH));
    String lastDay = String.valueOf(c.getActualMaximum(Calendar.DAY_OF_MONTH)); 
    
    //上个月
    String lastMonth=String.valueOf(c.get(Calendar.MONTH)+1).length()==2?String.valueOf(c.get(Calendar.MONTH)+1):"0"+String.valueOf(c.get(Calendar.MONTH)+1);
    String topDayMonth=year+"-"+lastMonth+"-"+"01" + " 00:00:00";
    String lastDayMonth = year+"-"+lastMonth+"-"+lastDay+ " 23:59:59";
    System.out.println("###year:" + year);
    System.out.println("###last month:" + lastMonth);
    System.out.println("###topday:" + topDayMonth);
    System.out.println("###lastday:" + lastDayMonth);
    复制代码

    输出结果

    ###year:2013

    ###last month:04

    ###topday:2013-04-01 00:00:00

    ###lastday:2013-04-30 23:59:59

    转自 http://hi.baidu.com/zzm_2007/item/3b967b1cd1586e4e2b3e2258

    https://blog.csdn.net/joyous/article/details/9630893

    https://www.cnblogs.com/huangminwen/p/6041168.html

  • 相关阅读:
    JDBC_增删改
    JSP内置对象作用域
    497. Random Point in Non-overlapping Rectangles
    921. Minimum Add to Make Parentheses Valid
    946. Validate Stack Sequences
    824. Goat Latin
    Acwing 165 小猫爬山 (dfs)
    Codeforces #656 Problem D
    Codeforces #656 Problem C
    对象属性拷贝工具类大全
  • 原文地址:https://www.cnblogs.com/twoheads/p/9717646.html
Copyright © 2020-2023  润新知