zoukankan      html  css  js  c++  java
  • Java日期类:Date和Calendar的使用

    总是使用这两个类,总是需要百度。还不如一次全部整理完。

    一、介绍:

    Date 类

    • Date 表示特定的瞬间,精确到毫秒。
    • 在 JDK 1.1 之前,类 Date 有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的 API 不易于实现国际化。从 JDK 1.1 开始,应使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃(查阅自 API 文档)

    Calendar 类

    • Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
    • 瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

    简单说就是:java.util.Date 是个日期数据;java.util.Calendar 用于日期相关的计算;

    二、使用:

    2.1 如何实例化当前时间?

    Date date = new Date();
    Calendar calendar = Calendar.getInstance();
    
    System.out.println(date.toString());
    //输出:Thu Oct 18 13:46:43 CST 2018
    
    System.out.println(calendar.toString());
    //输出:java.util.GregorianCalendar[time=1539841603042,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=9,WEEK_OF_YEAR=42,WEEK_OF_MONTH=3,DAY_OF_MONTH=18,DAY_OF_YEAR=291,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=1,HOUR_OF_DAY=13,MINUTE=46,SECOND=43,MILLISECOND=42,ZONE_OFFSET=28800000,DST_OFFSET=0]

    根据输出,我们也可以看出Date和Calendar的区别。

    2.2 如何实例化特定时间?

     1 //注:mm:ss必须小写,否则无法转换。HH大小写无影响。
     2 DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
     3 Date date1 = null;
     4 try {
     5     date1 = df.parse("2017-08-07 11:11:11");
     6 } catch (ParseException e) {
     7     e.printStackTrace();
     8 }
     9 
    10 Calendar calendar1 = Calendar.getInstance();
    11 calendar1.setTime(date1);
    实例化时注意:
    • 建议从Date使用格式转换,然后赋值(setTime)给Calendar,不然直接设置Calendar用毫秒数(setTimeInMillis)太麻烦。(其实不知道怎么设置....)
    • 另外,实例化时的格式:yyyy-MM-dd hh:mm:ss。mm:ss必须小写,否则无法转换。HH大小写无影响。

    2.3 Date和Calendar如何互相转化?

    Date date1 = new Date();
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    Date date = calendar1.getTime();
    Calendar类有两个方法:setTime和getTime。
    • setTime接收一个Date类型的参数;
    • getTime返回一个Date类型的结果;

    主要是通过这个方式实现互相转换。Date类好像没有相关转换的方法

    2.4 如何格式化时间?

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    String s = df.format(new Date());
    使用DateFormat类,进行format。

    2.5 如何对日期进行操作。即日期加减:年月日以及小时分秒等。

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    
    Date date1 = new Date();
    //输出:2018-10-18 02:18:27
    System.out.println(df.format(date1));
    
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    calendar1.add(Calendar.MONTH,1);
    Date date = calendar1.getTime();
    
    //输出:2018-11-18 02:18:27
    System.out.println(df.format(date));
    使用Calendar的add方法:下面是官方接口定义:
     
    abstract voidadd(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量。
       
    • field表示时间量:可以为如下:

    Calendar.ERA:表示无加减;

    Calendar.YEAR:年

    Calendar.MONTH:月

    Calendar.DATE:日

    Calendar.HOUR:小时

    Calendar.MINUTE:分钟

    Calendar.SECOND:秒

    注意:Calendar中的所有常量都可以为参数,不一定局限于上面的。比如Calendar.HOUR_OF_DAY,Calendar.WEEK_OF_MONTH等。不管是什么,只要这个值和周相关就是周(月中的第几周,年中的第几周等),和日相关就是日(一年当中的第几天,一月当中的第几天,一周当中的第几天),和小时相关就是小时

    • amount:为整数表示当前时间的基础上加上对应的时间量;为负数表示当前时间的基础上减去对应的时间量。

    2.6 其他常用方法

    2.6.1 获取当天结束时间:59分59秒0毫秒

    private Date getDayEnd() {
        Calendar cal = new GregorianCalendar();
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }

    2.6.2 日期工具类(DateUtils.java)

    package com.dmall.virtual.domain.utils;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    public class DateUtils {
    
        public static final String MMddHHmmss = "MM-dd HH:mm:ss";
        public static final String yyyyMMddHHmmss = "yyyy-MM-dd HH:mm:ss";
        public static final String yyyy_MM_dd = "yyyy-MM-dd";
        public static final String yyyyMMdd = "yyyy.MM.dd";
        public static final String HHmm = "HH:mm";
        public static final String MM_dd = "MM-dd";
        public static final String yyyy_MM_dd_other = "yyyy-MM-dd";
        private static final Logger logger = LoggerFactory.getLogger(DateUtils.class);
    
        /**
         * 根据基础时间(base),单位(unit),偏移量(differ)对时间进行偏移并返回偏移后的时间
         * @param base
         * @param forward
         * @param unit
         * @param differ
         * @return
         */
        public static Date shiftDate(Date base, boolean forward, DateUnit unit, int differ){
            if(base == null){
                return null;
            }
            if(differ <= 0){
                return base;
            }
    
            Calendar c = Calendar.getInstance();
            c.setTime(base);
            c.set(unit.getUnit(), c.get(unit.getUnit()) +(forward ? differ : -differ));
            return c.getTime();
        }
    
        public enum DateUnit{
    
            YEAR(Calendar.YEAR),
            MONTH(Calendar.MONTH),
            WEEK(Calendar.MONTH),
            DAY(Calendar.DAY_OF_YEAR),
            HOUR(Calendar.HOUR_OF_DAY),
            MINUE(Calendar.MINUTE),
            SECOND(Calendar.SECOND);
    
            private int unit;
    
            private DateUnit(int unit){
                this.unit = unit;
            }
    
            public int getUnit() {
                return unit;
            }
    
            public void setUnit(int unit) {
                this.unit = unit;
            }
    
        }
    
        /**
         * 日期格式化为字符串
         * @param date
         * @param format
         * @return
         */
        public static String formatDate(Date date, String format) {
            if (date == null) {
                return null;
            }
            try{
                SimpleDateFormat sdf = new SimpleDateFormat(format);
                return sdf.format(date);
            }catch(Exception e){
                logger.error("日期格式化失败,date={}", date,e);
                return null;
            }
        }
    
        /**
         * 字符串格式化为日期
         * @param dateStr
         * @param format
         * @return
         */
        public static Date parseDate(String dateStr, String format){
            DateFormat formatter = new SimpleDateFormat(format);
            if(StringUtils.isBlank(dateStr)){
                return null;
            }
    
            try {
                return formatter.parse(dateStr.trim());
            } catch (ParseException e) {
                logger.warn("ParseException日期异常1,参数dateStr={},format={}",new Object[]{dateStr,format,e});
                return null;
            }catch (Exception e) {
                logger.warn("ParseException日期异常2,参数dateStr={},format={}",new Object[]{dateStr,format,e});
                return null;
            }
        }
    
        /**
         * 获取当天指定时间(时-分-秒)的日期
         * @param hours
         * @return
         */
        public static Date getSpecialHms(Date date, int hours, int minutes, int seconds) {
            if(date == null){
                return null;
            }
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            cal.set(Calendar.HOUR_OF_DAY, hours);
            cal.set(Calendar.MINUTE, minutes);
            cal.set(Calendar.SECOND, seconds);
            cal.set(Calendar.MILLISECOND, 0);
            return cal.getTime();
        }
    
        /**
         * 获取指定日期的小时
         * @return
         */
        public static int getCurrentHours(Date date){
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            return calendar.get(Calendar.HOUR_OF_DAY);
        }
    
        public static void main(String[] args) {
    
        }
    }
    三、结束:
  • 相关阅读:
    css 盒模型
    Dom事件类-文档对象模型
    BFC-边距重叠解决方案
    三栏布局的五种方式--左右固定,中间自适应
    为什么必须先写组件再写vue的实例
    H5跳小程序安卓机出现白屏的问题
    关于iframe标签的src属性
    子组件让父组件进行刷新vuex
    html 插件
    git 其他merge
  • 原文地址:https://www.cnblogs.com/buwuliao/p/9810338.html
Copyright © 2011-2022 走看看