java基础-时间

Java日期发展

java 1.0 时候主要日期操作由Date类操作日期,因为设计不合理(比如月份是从0开始 0月即对应 1月, 年份是从1900年开始 增量表示),目前大部分已弃用

java 1.1 java.util.Calendar 类主要负责操作日期,虽已有改进,但仍有不合理之处,比如月份依旧从0开始,Date,和Calendar 非final ,可更改, DateFormator 非线程安全。

java 8 新增了 java.time.LocalDate & LocalTime & Instant & Duration & Period 可以根据合理和方便的来操纵日期

Java日期概述

java 日期主要由 1. java.util.Date

                                - java.sql.Date

                                - java.sql.Time

                                - java.sql.TimeStamp

                          2. Calendar

                          3. DateFormat

                                - SimpleDateFormat

ps : - 为对应的实现类 即 java.sql.Date 继承于 java.util.Date

其中 Date类 主要用于显示日期类型,其为java1.0的类库,大部分API 已弃用。

        Calendar 类主要负责对日期的操作。

        DateFromat 主要负责日期的格式化,如将固定格式的string日期转化为Date格式,将Date格式化为对应的string日期。

常用API:

1. java.util.Date 中的 after(), before() 方法比两个日期。

private static void testDateMethod() {
        /**
         * java.util.Date中的比较日期
         * before()  ;  after() ; 方法
         */
        Date date1 = new Date();
        date1.setTime(1510493100); //2017/11/12 21:25:0

        Date date2 = new Date();
        date2.setTime(1510488000); //2017/11/12 20:00:0

        System.out.println("date1 before date2 :" + date1.before(date2)); //false
        System.out.println("date1 after date2 :" + date1.after(date2));   //true

        // x轴 0点到24点 前->后
        // date1.after(date2) 可翻译为 date1在date2之后
    }

2. Calendar 类操作日期:新增月份,日期 

/**
     * 增加日期中某些类型的某数值
     * @param date java.util
     * @param dateType
     * @param amount
     * @return java.date
     */
    public static Date addInteger(Date date, int dateType, int amount) {
        Date myDate = null;
        if (date != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(dateType, amount);
            myDate = calendar.getTime();
        }
        return myDate;
    }

3. DateSimpleDateFormat 日期格式化 Date -> String (format()方法)

/**
     * date -> string format方法
     *
     * @param date
     * @return
     */
    public static String utilDateToString(Date date) {
        String strDate = null;
        if (date != null) {
            SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
            strDate = format.format(date);
        }
        return strDate;
    }

4. SimpleDateFormat : String -> Date (parse()方法)

/**
     * str -> date parse方法
     * @param strDate
     * @param paternStr
     * @return
     */
    public static Date stringToUtilDate(String strDate,String paternStr) {
        Date date;
        try {
            SimpleDateFormat format = new SimpleDateFormat(paternStr);
            date=  format.parse(strDate);
        } catch (Exception e) {
            date = null;
        }
        return date;
    }

 Java 8新增API :

LocalDate : 只表示 日期 如 2018-04-05

LocalTime : 只表示 时间 如 12:45:05

LocalDateTime : 为LocalDate 和 LocalTime 的结合体

Instant : 主要为机器设计的API 

Duration : 计算两个时间的间隔,主要用纳秒和秒 来显示间隔

Period : 计算日期的间隔,主要用年月日来计算间隔

        //1. 当前日期 & 获取当前日期的日
        LocalDate localDate = LocalDate.now();
        System.out.println("day: " + localDate.get(ChronoField.DAY_OF_MONTH));
        //2. parse
        LocalDate localDate1 = LocalDate.parse("2017-03-14");
        System.out.println(localDate1);
        //3. format
        LocalDateTime now = LocalDateTime.now();
        System.out.println("now: " + now.format(DateTimeFormatter.BASIC_ISO_DATE)); //yyyyMMdd
        System.out.println("now: " + now.format(DateTimeFormatter.ISO_LOCAL_DATE)); //yyyy-MM-dd
        System.out.println("now: " + now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); //2018-04-07T22:40:15.691
        System.out.println("now: " + now.format(DateTimeFormatter.ISO_LOCAL_TIME)); //22:40:15.691

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss");
        System.out.println("now: " + now.format(formatter)); //20180407 22:44:14
        //4. 日期比较
        String strDate1 = "2018-05-17";
        String strDate2 = "2018-06-15";

        LocalDate ld1 = LocalDate.parse(strDate1, DateTimeFormatter.ISO_LOCAL_DATE);
        LocalDate ld2 = LocalDate.parse(strDate2, DateTimeFormatter.ISO_LOCAL_DATE);

        System.out.println(ld1.isBefore(ld2)); // true

        //5. duration
        LocalTime localTime = LocalTime.of(12, 10);
        LocalTime localTime1 = LocalTime.of(12, 11);
        Duration d1 = Duration.between(localTime, localTime1);
        System.out.println("12:10 <> 12:11 between seconds => " + d1.getSeconds());
        //6. period
        LocalDate ld11 = LocalDate.of(2018, 3, 11);
        LocalDate ld22 = LocalDate.of(2018, 4, 11);
        Period period = Period.between(ld11, ld22);
        long interval =  ld11.until(ld22, ChronoUnit.DAYS);
        System.out.println("between day  => " + interval);

 

PS: UTC时间

UTC: 世界协调时间
GMT: 格林尼治标准时
UTC是给予原子钟的 比 GMT更精确

案例:
北京时区是东八区,领先UTC八个小时,在电子邮件信头的Date域记为+0800如果在电子邮件的信头中有这么一行: 
Date: Fri, 08 Nov 2002 09:42:22 +0800 
说明信件的发送地的地方时间是二○○二年十一月八号,星期五,早上九点四十二分(二十二秒),这个地方的本地时领先UTC八个小时(+0800就是东八区时间)电子邮件信头的Date域使用二十四小时的时钟,而不使用AM和PM来标记上下午

 

posted @ 2018-04-07 20:46  六度僧人  阅读(161)  评论(0编辑  收藏  举报