美文网首页
Date、DateFormat和Calendar

Date、DateFormat和Calendar

作者: dotaer_shashen | 来源:发表于2020-06-14 17:14 被阅读0次

    目录
    Date
    ​-------Date类的构造函数
    ​-------Date类中的常用方法
    DateFormatSimple
    -------DateFormat的构造函数
    -------SimpleDteFormat常用的函数
    Calendar
    -------GregorianCalendar对象的获取方式
    -------Calendar类的常用方法
    -------Calendar使用中的问题
    --------------代码示例
    --------------原因分析
    --------------解决方案(DateTimeUtils)
    时间处理相关的工具类DateTimeUtils

    Date

    Date类是java.util包下表示日期的类, 精确到毫秒值;

    Date类的构造函数:

    // 用来创建当前系统时间对应的日期对象
    public Date() {
        this(System.currentTimeMillis());
    }
    
    // 用来创建以标准基准时间为基准,指定偏移毫秒数,对应的日期对象 参数单位:毫秒
        // 标准基准时间:
            // 0时区: 1970年01月01日 00:00:00
            // 东八区: 1970年01月01日 08:00:00
    public Date(long date) {
        fastTime = date;
    }
    

    示例代码:

    public class DateTest {
        public static void main(String[] args) {
            // 创建一个当前系统时间的日期对象
            Date date01 = new Date();
            System.out.println(date01); // Sun Jun 14 15:56:24 CST 2020
            
            // 创建一个与标准基准时间偏移了1秒的日期对象
            Date date02 = new Date(1000);
            System.out.println(date02); // Thu Jan 01 08:00:01 CST 1970
        }
    }
    

    Date类中的常用方法

    • long getTime() 获取当前日期对 象距离标准基准时间的毫秒数
    • void setTime(long time) 设置当前日期对象距离标准基准时间的毫秒数
    • boolean after(Date when) 测试此日期是否在指定日期之后
    • boolean before(Date when) 测试此日期是否在指定日期之前
    public class DateTest {
        public static void main(String[] args) {
            // 创建一个当前系统时间的日期对象
            Date date01 = new Date();
            System.out.println(date01); // Sun Jun 14 15:56:24 CST 2020
    
            // 创建一个与标准基准时间偏移了1秒的日期对象
            Date date02 = new Date(1000);
            System.out.println(date02); // Thu Jan 01 08:00:01 CST 1970
    
            // 获取
            System.out.println(date01.getTime()); // 1592121661184
            System.out.println(date02.getTime()); // 1000
    
            // 设置:
            date01.setTime(2000);
            System.out.println(date01);// Thu Jan 01 08:00:02 CST 1970
            System.out.println(date01.getTime());// 2000
    
            date02.setTime(3000);
            System.out.println(date02);// Thu Jan 01 08:00:03 CST 1970
            System.out.println(date02.getTime());// 3000
    
            System.out.println(date01.after(date02));  // false
            System.out.println(date01.before(date02)); // true
        }
    }
    

    DateFormat

    DateFormat是一个表示日期格式化的类, 是抽象类, 一般使用其子类 SimpleDateFormat;
    DateFormat的作用: 实现日期与文本之间的相互转化;
    ​ String ----> Date;
    ​ Date ----> String;

    SimpleDateFormat的构造函数

    // 参数 pattern:是String类型,用来指定日期的格式
    // pattern的格式规则
    //        y   年
    //        M   月
    //        d   日
    //        H   时
    //        m   分
    //        s   秒
    //        常用的日期格式: yyyy年MM月dd日  HH时mm分ss秒
    //        常用的日期格式: yyyy-MM-dd  HH:mm:ss
    public SimpleDateFormat(String pattern){
        this(pattern, Locale.getDefault(Locale.Category.FORMAT));
    }
    

    SimpleDteFormat常用的函数

    • String format(Date date); // 格式化
    • Date parse(String source); // 解析

    需要注意: 解析的时候,字符串日期格式一定要和日期格式化对象指定的日期格式一致;

    代码示例:

    public class DateFormatTest {
        public static void main(String[] args) {
            Date date = new Date();
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
            SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd");
            // 格式化
            System.out.println(sdf1.format(date)); // 2020年06月14日 16时31分50秒
            System.out.println(sdf2.format(date)); // 2020-06-14 16:31:50
            System.out.println(sdf3.format(date)); // 2020-06-14
    
            try {
                // 解析
                Date dateP = sdf1.parse("2020年06月14日 16时31分50秒");
                System.out.println(dateP); // Sun Jun 14 16:31:50 CST 2020
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
    }
    

    Calendar

    Calendar类表示日历, 是一个抽象类, 一般使用其子类 GregorianCalendar;

    GregorianCalendar对象的获取方式

    public class CalendarTest {
        public static void main(String[] args) {
            // 1.通过GregorianCalendar()的构造函数获了
            Calendar calendar01 = new GregorianCalendar();
            // 2.通过Calendar.getInstance()函数获取
            Calendar calendar02 = Calendar.getInstance();
            System.out.println(calendar01.getClass().getName());//java.util.GregorianCalendar
            System.out.println(calendar02.getClass().getName());//java.util.GregorianCalendar
        
            // 两种方式获取到的是同一类对象(GregorianCalendar);
        }
    }
    

    Calendar类的常用方法

    • public int get(int field); // 获取某个字段的值

    参数: 表示获取哪个字段的值,可以使用Calender中定义的常量来指定

    • Calendar.YEAR: 年龄
    • Calendar.MONTH :月
    • Calendar.DAY_OF_MONTH:月中的日期
    • Calendar.HOUR:小时
    • Calendar.MINUTE:分钟
    • Calendar.SECOND:秒
    • Calendar.DAY_OF_WEEK:星期
    • public void set(int field,int value); // 设置某个字段的值;
    • public void add(int field,int amount); // 为某个字段增加/减少指定的值;
    • void setTime(Date date); // 使用给定的 Date 设置此 Calendar 的时间;
    • boolean before(Object when);

    // 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果;

    • boolean after(Object when);

    // 判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果;

    需要注意:

    • 日历对象中的月份: 0---11月 对应现实生活中的 1---12月
    • 中国人: 星期一 <--> 星期日 一个礼拜的第一天是星期一,一个礼拜的最后一天是星期日;
    • 外国人: 星期日 <--> 星期六 一个礼拜的第一天是星期日,一个礼拜的最后一天是星期六;

    代码示例

    public class CalendarTest {
        public static void main(String[] args) {
            Calendar calendar = new GregorianCalendar();
            System.out.println(calendar.get(Calendar.YEAR)); // 2020
            System.out.println(calendar.get(Calendar.MONTH)); // 5
            System.out.println(calendar.get(Calendar.WEEK_OF_YEAR)); // 25
            System.out.println(calendar.get(Calendar.WEEK_OF_MONTH)); // 3
    
            calendar.set(Calendar.YEAR, 1999);
            System.out.println(calendar.get(Calendar.YEAR));// 1999
    
            calendar.add(Calendar.YEAR, 2);
            System.out.println(calendar.get(Calendar.YEAR));// 2001
    
            // 创建一个距离标准基准时间1小时的日期对象
            Date date = new Date(1 * 60 * 60 * 1000);
            // 调用日历对象的setTime方法,设置日历对象表示的日期
            calendar.setTime(date);
    //        System.out.println(calendar);// 距离标准基准时间1小时的日期对应的日历对象
            System.out.println(calendar.get(Calendar.YEAR)); // 1970
            System.out.println(calendar.get(Calendar.MONTH)); // 0 
            System.out.println(calendar.get(Calendar.WEEK_OF_YEAR)); // 1
            System.out.println(calendar.get(Calendar.WEEK_OF_MONTH)); // 1
    
    
            Calendar cal2 = Calendar.getInstance();
            // calendar: 距离标准基准时间1小时的日期对象
            // cal3: 当前时间的日历对象
            System.out.println(calendar.before(cal2));// true
            System.out.println(calendar.after(cal2));// true
        }
    }
    

    Calendar使用中的问题

    代码示例
    public class CalendarTest {
        public static void main(String[] args) throws ParseException {
            // 需求是希望把"2018-03-31"改为"2018-02-01";
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(format.parse("2018-03-31"));
            calendar.set(Calendar.YEAR,2018);
            calendar.set(Calendar.MONTH,1);
           
            String DateStr = format.format(calendar.getTime());
            System.out.println(DateStr);// 2018-03-03
        }
    }
    
    原因分析

    Calendar类中的时间计算, 是以毫秒数来计算的, 上面的代码设置只是把月份变动了, 但是天数并没有变, 也就是说上面的代码实际上是表示打印"2018-02-31";
    而2月份是没有31号的, 并且2018年的2月份只有28号, 所以就往后加了三天, 最终的打印结果就变成了"2018-03-03";
    如果把2018改成2016, 那么打印出来的结果就是"2016-03-02", 因为2016年的2月份是29号;

    解决方案(DateTimeUtils)
    • 主动set日期;
    • 清除日历对象所有数据;
    • 根据年月, 去获取日期的最大值;

    时间处理相关的工具类DateTimeUtils

    public class DateTimeUtil {
        public final static String PATTERN_LONG = "yyyy-MM-dd HH:mm:ss";
        public final static String PATTERN_LONG2 = "yyyyMMdd HH:mm:ss";
        public final static String PATTERN_A = "yyyyMM";
        public final static String PATTERN_B = "yyyyMMdd";
        public final static String PATTERN_C = "yyyy-MM-dd";
        public static final String PATTERN_D = "yyMMdd";
        public final static String PATTERN_ZH = "yyyy年MM月dd日";
        public final static String PATTERN_ZH_MD = "MM月dd日";
        private final static String[] WEEKDAYS = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
    
        /**
         * 格式化日期 按指定格式
         *
         * @param date    需要格式化的 日期对象
         * @param pattern 日期样式
         */
        public static String formatDate(Date date, String pattern) {
            SimpleDateFormat format = new SimpleDateFormat(pattern);
            return format.format(date);
        }
    
        /**
         * 把字符串按格式转换成 Date对象
         *
         * @param text
         * @param pattern 日期样式
         * @return
         */
        public static Date parse(String text, String pattern) {
            SimpleDateFormat format = new SimpleDateFormat(pattern);
            try {
                return format.parse(text);
            } catch (ParseException e) {
                return null;
            }
        }
    
        /**
         * 获取当前时间 年 月 日 (月份要+1)
         *
         * @return
         */
        public static String getDate() {
            Calendar cal = Calendar.getInstance();
            StringBuffer stringBuffer = new StringBuffer();
            return stringBuffer.append(cal.get(Calendar.YEAR))
                    .append("年")
                    .append(cal.get(Calendar.MONTH) + 1)
                    .append("月")
                    .append(cal.get(Calendar.DAY_OF_MONTH))
                    .append("日")
                    .append(cal.get(Calendar.HOUR_OF_DAY))
                    .append(":")
                    .append(cal.get(Calendar.MINUTE))
                    .append(":")
                    .append(cal.get(Calendar.SECOND))
                    .toString();
        }
    
        /**
         * 获取当天星期几
         *
         * @return
         */
        public static String getDayOfWeek() {
            Calendar cal = Calendar.getInstance();
            return WEEKDAYS[cal.get(Calendar.DAY_OF_WEEK) - 1];
        }
    
        /**
         * 获取几天之后或者几天之前星期几
         *
         * @param days 天数
         * @return
         */
        public static String getDateAfterDays(int days) {
            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.DAY_OF_WEEK, days);
            return WEEKDAYS[cal.get(Calendar.DAY_OF_WEEK) - 1];
        }
        
         /**
         * 获取某年某月的日期最大值
         *
         * @param year  年份
         * @param month 月份
         * @return 最大值
         */
        public static int getLastDay(int year, int month) {
            Calendar calendar = Calendar.getInstance();
            calendar.clear();  //清除所有日期数据
            if (year != 0) {
                calendar.set(Calendar.YEAR, year);
            }
            calendar.set(Calendar.MONTH, month - 1);
            return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        }
        
        /**
         * 根据年月获取当月最后一天
         * @param yearmonth yyyy-MM
         * @return yyyy-MM-dd
         * @throws ParseException
         */
        public static String getLastDayOfMonth(String yearmonth) {
            try {
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
                Date dd = format.parse(yearmonth);
                Calendar cal = Calendar.getInstance();
                cal.setTime(dd);
                int cc=cal.getActualMaximum(Calendar.DAY_OF_MONTH);
                String result = yearmonth+"-"+cc;
                return result;
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return null;
        }
        
        // 未完待加入......
    }
    

    相关文章

      网友评论

          本文标题:Date、DateFormat和Calendar

          本文链接:https://www.haomeiwen.com/subject/tjxfxktx.html