• 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来标记上下午
    六度与心 修行苦 苦修行
  • 相关阅读:
    [APIO2017] 商旅
    [SDOI2017] 新生舞会
    FileUtils类介绍
    经典算法面试题目-设计算法移除字符串中重复的字符(1.3)
    Web---演示Servlet的相关类、表单多参数接收、文件上传简单入门
    Java新手入门必须掌握的30个基本概念
    你需要知道的10位Java开发牛人
    Web---演示Servlet的相关类、下载技术、线程问题、自定义404页面
    经典算法面试题目-翻转一个C风格的字符串(1.2)
    Web---创建Servlet的3种方式、简单的用户注册功能
  • 原文地址:https://www.cnblogs.com/hdtechnology/p/8734723.html
Copyright © 2020-2023  润新知