• Java日期时间API系列1-----Jdk7及以前的日期时间类


    先看一个简单的图:

    主要的类有:

    Date类负责时间的表示,在计算机中,时间的表示是一个较大的概念,现有的系统基本都是利用从1970.1.1 00:00:00 到当前时间的毫秒数进行计时,这个时间称为epoch。在后文中如果没有明确说明,毫秒数就是指从1970年到对应时间的毫秒数。在Java 的Date类内部其实也是一个毫秒数,对外表现为一个Date对象。

    Calendar是一个工具类,负责对Date类进行修改等操作,以及从Date类中提取年月日等时间的特定信息。

    DateFormat 则负责日期的转换,比如读取特定格式的字符串,转换成date对象,或者将date对象按照指定的格式转成字符串。

    1 Date 表示时刻。内部主要是一个long值存储距离纪元时的毫秒数。绝大多数方法都是过时的。

    这里指的是:java.util.Date 日期格式:年月日时分秒

        public class Date{
            private transient long fastTime;
            Date(){
                this(System.currentTimeMillis());
            }
            Date(long date){
                fastTime = date;
            }
            //……
        }

    2 TimeZone 时区(24个,如Asia/shanghai)

    //获取默认时区
    TimeZone.getDefault();

    3 Locale 国家(或地区)和语言(如zh_CN)

    // 获取默认国家和语言
    Locale.getDefault();

    4 Calendar 是日期和时间操作的主要类,是抽象类,提供了多个静态方法,可以获取Calendar实例。

    与Date类似,Calendar内部也有一个表示时刻的毫秒数,还定义了一个数组(长度17),表示日历中各个字段的值。

    proteted long time;
    proteted int fields[];

    fields中存放的是下面这些字段的值,给Calendar

        Calendar.YEAR,
        Calendar.MONTH,
        Calendar.DAY_OF_MONTH,
        Calendar.DAY_OF_WEEK,
        Calendar.HOUR_OF_DAY,
        Calendar.MINUTE,
        Calendar.SECOND,
        Calendar.MILLISECOND

    可以通过Calendar实例获取这些值(Calendar会根据时区,地区语言进行转换)。

        //空构造函数,会获取当前的。 Calendar.getInstance("Asia/shanghai","zh_CN")
        Calendar calendar = Calendar.getInstance();
        int day = calendar.get(Calendar.DAY_OF_MONTH);

    Calendar还支持根据字段增加减少时间(负数表示减少)。

        Calendar.getInstance().add(Calendar.MONTH,-2);

    总结来说,Calendar做了一项非常繁琐的工作,根据TimeZone 和 Locale 再绝对时间毫秒数和日历字段之间自动进行转换。

    5 DateFormat(线程不安全) 提供Date和字符串表示之间的转换,主要的两个方法 format(Date d),parse(String s)

    Date的字符串表示与TimeZone、Locale都是相关的。
    同时与两个格式化风格相关,一个是日期格式化风格,一个是时间格式化风格。
    DataFormat是抽象方法,也用工厂方法创建对象。

        DateFormat.getTimeInstance();
        DateFormat.getDateInstance();
        DateFormat.getDateTimeInstance();

    其中getTimeInstance只处理时间,getDateInstance只处理日期,getDateTimeInstance处理日期和时间,三种对象的处理结果如下

        Calendar calendar = Calendar.getInstance();
        
        //结果是21:34:20
        DateFormat.getTimeInstance().format(calendar.getTime());
        //结果是2019-02-20
        DateFormat.getDateInstance().format(calendar.getTime());
        //结果是2019-02-20 21:34:20
        DateFormat.getDateTimeInstance().format(calendar.getTime());

    DateFormat虽然比较方便,但是日期字符串格式的更精确的控制,则应该使用SimpleDateFormat。

    6 SimpleDateFormat(线程不安全) 是DateFormat的子类,与父类主要不同是:子类可以自定义日期格式。

        String pattern = "yyyy年MM月dd日 E HH时mm分ss秒";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        //输出结果是 2019年02月20日 Wed 21时44分42秒
        OS.print(simpleDateFormat.format(calendar.getTime()));

    pattern 中的英文字符a-z,A-Z表示特殊含义,其他字符原样输出.

    pattern变量参数对应的实际意义示例
    yyyy 4位的年份 2019
    MM 月份两位数 02
    dd 日期 20
    HH/hh 24小时制/12小时制 21/09
    mm 分钟 55
    ss 55
    E 星期几 wed
    a 上午下午,一般配合hh使用 PM

    SimpleDateFormat也可以方便的将字符串转成Date。

        String str = "19年2月20日 09时58分33秒111";
        Date date = new SimpleDateFormat("yy年M月dd日 HH时mm分ss秒SSS").parse(str);
        //结果 2019年02月20日 09时58分33秒
        String result = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(date);

    7.java.sql.Date继承于java.util.Date,只保留了日期

    java.sql.Date类在JDBC API中被使用,日期格式:年月日。如果你需要在java.sql.PreparedStatement上设置日期或者从java.sql.ResultSet获取日期,你将会和java.sql.Date打交道。
    你可以用java.util.Date做的任何事同样适用于java.sql.Date。

    long time = System.currentTimeMillis();
    java.sql.Date date = new java.sql.Date(time);

    java.sql.Datejava.util.Date最大的不同在于java.sql.Date所表示的日期中只保留了日期,而没有时间。

    举个例子,如果你用2009-12-24 23:20来创建一个java.sql.Date,那么其中的时间(23:20)将会被切掉。如果你需要保留时间,使用 java.sql.Timestamp 来代替java.sql.Date

    8.java.sql.Time继承于java.util.Date,只保留了时间

    同java.sql.Date类在JDBC API中被使用,日期格式:时分秒。

    9.java.sql.Timestamp继承于java.util.Date,对java.util.Date 类进行了扩充,该类提供了 getNanos() 方法

    同java.sql.Date类在JDBC API中被使用,日期格式:年月日时分秒纳秒。

    10.TimeUnit是一个时间单位枚举类,主要用于并发编程

    时间单元表示给定粒度单元的时间持续时间,并提供实用程序方法来跨单元转换,以及在这些单元中执行计时和延迟操作。时间单元不维护时间信息,但只帮助组织和使用可能在不同上下文中分别维护的时间表示。

    例如:尝试获取锁50毫秒:

      Lock lock = ...;
       if (lock.tryLock(50L, TimeUnit.MILLISECONDS)) ...

    参考:https://www.jianshu.com/p/1478af429a1e

         https://blog.csdn.net/zhao123h/article/details/53012791

         http://ifeve.com/java-sql-date/

  • 相关阅读:
    C#基础
    C#基础
    Sqlserver数据库备份和还原
    C#基础
    Python3学习笔记4
    Python3学习笔记3
    调用接口Post xml和json数据的通用方法
    Python3学习笔记2
    Python3学习笔记1
    常见的PHP函数代码性能对比
  • 原文地址:https://www.cnblogs.com/xkzhangsanx/p/12032719.html
Copyright © 2020-2023  润新知