1. 时间API

我们的时间在java里是long类型的整数,这个整数称之为时间戳(也叫格林威治时间),即从1970-01-01到现在为止所经过的毫秒数,单有这个时间戳是不能准确表达世界各地的时间,还需加上时区。比如现在输出笔者本地的时间Mon Feb 10 09:48:43 GMT+08:00 2020,其中 GMT+08:00 表示格林威治时间的东8区,也就是北京时间。

2. 旧时间API

java有两套与时间相关的API,分别位于java.util和java.time下,现在更推荐使用time包下的API,由于历史原因,我们还需兼容以前版本的时间函数,所以util也要来学习一下

2.1 Date

Date类内部原理

private transient long fastTime;

public Date() {
this(System.currentTimeMillis());
} public Date(long date) {
fastTime = date;
}
  • 从变量可以看出java时间戳使用long类型存储
  • 默认构造函数中的System.currentTimeMillis()获取的是当前的时间戳
  • 有参构造说明Date类是依赖时间戳的

从API和JDK可以知道Date内部很多函数都弃用了,打上了@Deprecated标签,旧API中也不推荐使用了,相对推荐使用后面的Calendar类

@Deprecated
public Date(int year, int month, int date) {} @Deprecated
public Date(String s) {}

下面列出常用的方法

类型 函数名 解释
long getTime 返回Date对象表示的时间戳
int getYear 返回Date对象表示的年,需+1900
int getMonth 返回Date对象表示的月,需+1
int getDate 返回Date对象表示的日
int getHours 返回Date对象表示的小时
int getMinutes 返回Date对象表示的分钟
int getSeconds 返回Date对象表示的秒
int getDay 返回Date对象表示的周几

例子

Date date = new Date();
System.out.println(date.getTime());
System.out.println(date.getYear() + 1900);
System.out.println(date.getMonth() + 1);
System.out.println(date.getDate());
1581301070240
2020
2
10

简单使用时间格式化类

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.println("简单使用时间格式化类: " + sdf.format(date));
System.out.println("原本的输出:" + date);
简单使用时间格式化类: 2020-02-10 10:24:13
原本的输出:Mon Feb 10 10:24:13 GMT+08:00 2020

2.2 Calendar

Calendar类比Date多了日期计算功能,还有时区。并且Calendar是抽象类,构造方法为protected即外部包没有继承关系不能访问的,不过他提供了getInstance来获取实例

获取实例

protected Calendar(){
// 省略内部如何实现
} public static Calendar getInstance(){
// 省略内部如何实现
}

常用方法

类型 函数名 解释
int get(int field) 返回日历给定字段的值
Date getTime 返回当前Calendar表示的Date
void setTimeZone(TimeZone value) 设置时区
void add(int field, int amount) 当前日历在给定字段上增加给定值
void setTime(Date date) 将给定Date设置为日历

栗子

Calendar calendar = Calendar.getInstance();

System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.MONTH) + 1);
System.out.println(calendar.get(Calendar.DATE)); calendar.add(Calendar.YEAR,200);
System.out.println(calendar.get(Calendar.YEAR)); Date date = calendar.getTime();
2020
2
10
2220

2.3 TimeZone

TimeZone类就是可以设置时区咯

常用方法

类型 函数名 解释
TimeZone getDefault 返回默认时区
TimeZone getTimeZone(String ID / zoneId) 返回给定字符串对应的时区

板栗

Calendar calendar = Calendar.getInstance();
System.out.println(calendar.get(Calendar.HOUR)); // 笔者当前时间11:09
calendar.setTimeZone(TimeZone.getTimeZone("GMT+10:00"));
System.out.println(calendar.get(Calendar.HOUR)); // 东10区时间为01:09
11
1

3. java1.8的新时间API

推出新时间API是因为旧API饱受诟病,因为:

  • Date为可变(多线程访问时间会变化)
  • 输出不人性化(Mon Feb 10 10:24:13 GMT+08:00 2020,且从1900开始计算)
  • 格式化类线程不安全(多线程访问格式化不同)

所以新API,java.time包所有类都是不可变和线程安全,且区分日期与时间

LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now(); System.out.println(date);
System.out.println(time);
System.out.println(dateTime);
2020-02-10
11:39:57.147
2020-02-10T11:39:57.147

输出看起来是不是很舒服,可是LocalDateTime的输出有点懵?,特意找了LocalDateTime的toString方法

@Override
public String toString() {
return date.toString() + 'T' + time.toString();
}

从中可以看出内部是维护了LocalDate和LocalTime了,中间使用了字符 T隔开,为什么不用空格????

3.1 LocalDate

常用方法

类型 函数名 解释
LocalDate now 返回当前日期
int getYear 返回年
int getMonthValue 返回月
int getDayOfMonth 返回日
LocalDate of(int year, int month, int dayOfMonth) 创建实例

西瓜

LocalDate localDate = LocalDate.now();
System.out.println(localDate.getYear());
System.out.println(localDate.getMonthValue());
System.out.println(localDate.getDayOfMonth());
2020
2
10

3.2 LocalTime

这些其实都差不多就不一一说明了

桃子

LocalTime localTime = LocalTime.now();
System.out.println(localTime.getHour());
System.out.println(localTime.getMinute());
System.out.println(localTime.getSecond());
12
1
18

3.3 LocalDateTime

这里新增了plus和minus方法,对应加减,因为是不可变性,所以和String类一样,返回一个新副本

苹果

LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime); LocalDateTime localTime1 = localDateTime.plusYears(1).plusMonths(1).plusDays(1);
System.out.println(localTime1); LocalDateTime localTime2 = localDateTime.minusYears(1).minusMonths(1).minusDays(1);
System.out.println(localTime2);
2020-02-10T12:07:44.403
2021-03-11T12:07:44.403
2019-01-09T12:07:44.403

3.4 获取时间戳

Instant timestamp = Instant.now();

3.5 获取时间差

LocalDateTime startDateTime = LocalDateTime.of(2020, 2, 10, 10, 10, 10);
LocalDateTime endDateTime = LocalDateTime.of(2019, 1, 9, 9, 9, 9); Duration duration = Duration.between(startDateTime, endDateTime);
System.out.println(duration);
PT-9529H-1M-1S		// 相隔9529小时1分1秒

时间API的更多相关文章

  1. Java8 时间 API

    前言 Java8 中最为人津津乐道的新改变恐怕当属函数式 API 的加入.但实际上,Java8 所加入的新功能远不止这个. 本文将基于<Java SE8 for the Really Impat ...

  2. 计算机程序的思维逻辑 (95) - Java 8的日期和时间API

    ​本节继续探讨Java 8的新特性,主要是介绍Java 8对日期和时间API的增强,关于日期和时间,我们在之前已经介绍过两节了,32节介绍了Java 1.8以前的日期和时间API,主要的类是Date和 ...

  3. Java 8 日期时间 API

    转自:https://www.runoob.com/java/java8-datetime-api.html Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与 ...

  4. JDK8 新增的日期时间API

    背景 JDK8中增加了一套全新的日期时间API,这里进行总结下,方便查询使用. 新的时间及日期API位于 java.time 包中,下面是一些关键类. Instant:代表的是时间戳. LocalDa ...

  5. Java 8 (二) 新的时间API

    新的时间API 一)时间线 Instant对象:表示时间轴上的一个点,原点为1970-1-1的午夜. Duration对象:表示一段时间. 注意Instant和Duration类都是final. 二) ...

  6. Java编程的逻辑 (95) - Java 8的日期和时间API

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  7. Java 8 新特性-菜鸟教程 (8) -Java 8 日期时间 API

    Java 8 日期时间 API Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理. 在旧版的 Java 中,日期时间 API 存在诸多问题,其中有: ...

  8. JDK8中的时间API

    在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类.正如类名所表达的,这个类无法表示日期,只能以毫秒的精度表示时间.更糟糕的是它的易用性,由于某些原因未知的设计决策,这个类 ...

  9. Java 8 新日期时间 API

    Java 8 新日期时间 API 1. LocalDate.LocalTime.LocalDateTime LocalDate.LocalTime.LocalDateTime 实例是不可变的对象,分别 ...

  10. Java 8 日期时间API使用介绍

    如何正确处理时间 现实生活的世界里,时间是不断向前的,如果向前追溯时间的起点,可能是宇宙出生时,又或是是宇宙出现之前, 但肯定是我们目前无法找到的,我们不知道现在距离时间原点的精确距离.所以我们要表示 ...

随机推荐

  1. zTree的学习

    最近要做一个有关权限的东西,原理和数据库都已经知道了,就是树状图困难. 原先是打算用layui的,因为我孤陋寡闻……吃了大亏,弄了3个小时,屁都没有.只能说是…… 后来百度找到了zTree,进去学习了 ...

  2. CodeForces - 401C Team(简单构造)

    题意:要求构造一个字符串,要求不能有连续的两个0在一起,也不能有连续的三个1在一起. 分析: 1.假设有4个0,最多能构造的长度为11011011011011,即10个1,因此若m > (n + ...

  3. fork系统调用方式成为负担,需要淘汰

    微软研究人员发表论文称用于创建进程的 fork 系统调用方式已经很落后,并且对操作系统的研究与发展产生了极大的负面影响,需要淘汰,作者同时提出了替代方案.相信每位开发者都对操作系统中的 fork () ...

  4. Atom 插件推荐

    (1)atom-ternjs : js(e6)的自动补充 (2)key-binding-mode : atom 快捷键管理 (3)pre-view : pdf预览 (4)activate-power- ...

  5. invisble

    不可见索引概念: 不可见索引(Invisible Index)是ORACLE 11g引入的新特性.不可见索引是会被优化器忽略的不可见索引,除非在会话或系统级别上将OPTIMIZER_USE_INVIS ...

  6. Java学习笔记(一) 面向对象---封装

    面向对象---封装 封装是面向对象思想的三大特征之一. 理解: 隐藏对象的属性和实现细节,仅对外提供公共访问方式. 优点: 将变化隔离 便于使用 提升代码复用性 提高安全性 封装原则: 将不需要对外提 ...

  7. Python学习——装饰器/decorator/语法糖

    装饰器 定义:本质是函数,为其他函数添加附加的功能. 原则:1.不能修改原函数的源代码 2.不能修改被原函数的调用方式 重点理解: 1.函数即“变量” 2.高阶函数:返回值中包含函数名 3.嵌套函数 ...

  8. 二十八、CI框架之自己写分页类,符合CI的路径规范

    一.参照了CSDN上某个前辈写的一个CI分页类,自己删删改改仿写了一个类似的分页类,代码如下: 二.我们在模型里面写2个数据查询的函数,一个用于查询数据数量,一个用于查询出具体数据 三.我们在控制器里 ...

  9. 服务器io资源查看

    资源查看命令安装 yum provides /usr/bin/find #查看命令是哪个软件包安装的 执行 yum provides */netstat 命令就可以看到提供命令的工具包net-tool ...

  10. POJ 1062:昂贵的聘礼

    昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 40715   Accepted: 11839 Descripti ...