先看一个简单的图:

主要的类有:

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/

Java日期时间API系列1-----Jdk7及以前的日期时间类的更多相关文章

  1. Java日期时间API系列42-----一种高效的中文日期格式化和解析方法

    中文日期(2021年09月11日 和 二〇二一年九月十一日 )在生活中经常用到,2021年09月11日很好处理直接使用模板:yyyy年MM月dd日:二〇二一年九月十一日比较不好处理,需要每个数字进行转 ...

  2. Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate

    通过Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的优点,java8具有很多优点,现在网上查到的农历转换工具类都是基于jdk7及以前的类写的,下面使用ja ...

  3. Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。

    通过Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中时间范围示意图:可以很清晰的看出ZonedDateTime相当于LocalDateTime+ZoneI ...

  4. Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析

    目录 0.前言 1.TemporalAccessor源码 2.Temporal源码 3.TemporalAdjuster源码 4.ChronoLocalDate源码 5.LocalDate源码 6.总 ...

  5. Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全

    通过Java日期时间API系列10-----Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter, 可以看出java8的DateTimeFormatter完美解决 ...

  6. SQL Server时间粒度系列----第4节季、年时间粒度详解

    本文目录列表: 1.SQL Server季时间粒度2.SQL Server年时间粒度 3.总结语 4.参考清单列表   SQL Serve季时间粒度       季时间粒度也即是季度时间粒度.一年每3 ...

  7. Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类

    因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...

  8. Java日期时间API系列13-----Jdk8中java.time包中的新的日期时间API类,时间类转换,Date转LocalDateTime,LocalDateTime转Date等

    从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转D ...

  9. Java日期时间API系列7-----Jdk8中java.time包中的新的日期时间API类的特点

    1.不变性 新的日期/时间API中,所有的类都是不可变的,这对多线程环境有好处. 比如:LocalDateTime 2.关注点分离 新的API将人可读的日期时间和机器时间(unix timestamp ...

随机推荐

  1. Ubuntu设置开机时启动的系统内核版本

    1.查看系统当前安装的所有内核版本 有两种方法 第一种: 可以查看/lib/modules下的文件夹,一个文件夹对应一个内核版本,如下图: 第二种:使用下面的命令查看: dpkg --get-sele ...

  2. DDL--DML

    DDL 数据定义语言 DDL是基于数据表级别的操作的统称,对数据表的 创建 删 改 删除 drop -- 删除表,记录日志 truncate -- 删除表中的全部数据,不删除表,不记录日志 修改 al ...

  3. Web前端基础(17):jQuery基础(四)

    1. jQuery的属性操作 jquery的属性操作模块分为四个部分:html属性操作,dom属性操作,类样式操作和值操作 html属性操作:是对html文档中的属性进行读取,设置和移除操作.比如at ...

  4. Python3---标准库---urllib

    前言 该文章主要说明Python3 标准库urllib的使用. 修改时间:20191216 修改时间:20191217 修改时间:20191218 添加urllib.parse.urlencode,u ...

  5. Docker 镜像与容器

    镜像和容器的关系   容器提交    commint 作用:       根据容器生成一个新的镜像        命令格式:       docker commit [OPTIONS] CONTAIN ...

  6. Java SSM 商户管理系统 客户管理 库存管理 销售报表 项目源码

    需求分析: 有个厂家,下面有很多代理商(商户或门头等),之前商户进货.库存.销售.客户资料等记录在excel表格中 或者无记录,管理比较混乱,盈利情况不明.不能有效了解店铺经营情况和客户跟踪记录 厂家 ...

  7. 基于C# 调用百度AI 人脸识别

    一.设置 登录百度云控制台,添加应用-添加人脸识别,查找,对比等. 记住API Key和Secret Key 二.创建Demo程序 1.使用Nuget安装 Baidu.AI 和 Newtonsoft. ...

  8. 30-学容器必须懂 bridge 网络

    Docker 安装时会创建一个 命名为 docker0 的 linux bridge.如果不指定--network,创建的容器默认都会挂到 docker0 上. apt-get install bri ...

  9. opensciencegrid - GridFTP 安装

    最近配置一个GridFTP 用于测试其传输FTP性能, 在这里简单记录,备忘:使用本教程可以简单起一个GridFTP用于测试服务: 预配置环境: 测试系统:CentOS 7 1806 配置Yum仓库: ...

  10. mysql使用——sql实现随机取一条数据

    最近在做接口测试的时候,测试数据是从数据库查询的,但是当需要并发多次去调用接口时,如果sql只是单纯的进行了limit取值,那并发的时候肯定会每条数据都一样. 因此,研究了下sql随机取一条数据的写法 ...