惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
月光博客
月光博客
雷峰网
雷峰网
WordPress大学
WordPress大学
博客园 - 司徒正美
Last Week in AI
Last Week in AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Visual Studio Blog
H
Help Net Security
Engineering at Meta
Engineering at Meta
Google DeepMind News
Google DeepMind News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security @ Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
爱范儿
爱范儿
W
WeLiveSecurity
J
Java Code Geeks
Forbes - Security
Forbes - Security
H
Hacker News: Front Page
T
Threatpost
The Cloudflare Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
N
Netflix TechBlog - Medium
Latest news
Latest news
V2EX - 技术
V2EX - 技术
小众软件
小众软件
T
The Blog of Author Tim Ferriss
A
Arctic Wolf
B
Blog RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
C
Check Point Blog
N
News | PayPal Newsroom
Cyberwarzone
Cyberwarzone
V
V2EX
TaoSecurity Blog
TaoSecurity Blog
P
Privacy & Cybersecurity Law Blog
Microsoft Security Blog
Microsoft Security Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
D
DataBreaches.Net
F
Fortinet All Blogs
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
K
Kaspersky official blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Google DeepMind News
Google DeepMind News
C
CXSECURITY Database RSS Feed - CXSecurity.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com

Java技术经验分享

生产故障处理SOP分享 | Java技术经验分享 系统稳定性建设实践总结【转载】 | Java技术经验分享 valine访问leancloud国际版异常,评论失效修复 | Java技术经验分享 匆匆忙忙的2021 | Java技术经验分享 聊一下换工作 | Java技术经验分享 IoT系列(2):WIFI设备常见配网方案介绍 | Java技术经验分享 IoT系列(1):什么是物联网 | Java技术经验分享 Java8特性2 - StreamApi | Java技术经验分享 Java8特性1 - lambda表达式&函数式接口 | Java技术经验分享 设计模式(5)-适配器模式 | Java技术经验分享 设计模式(4)-建造者模式 | Java技术经验分享 设计模式(3)-原型模式与浅拷贝和深拷贝 | Java技术经验分享 设计模式(2)-工厂模式图文介绍 | Java技术经验分享 设计模式(1)-带你了解3类8种单例模式 | Java技术经验分享 Java时间处理5---Java8中时区相关类库介绍 | Java技术经验分享 Java时间处理4---Java8中LocalDate、LocalTime、LocalDateTime介绍 | Java技术经验分享 Java时间处理3---Java8中Instant、Duration、Period、Clock介绍 | Java技术经验分享 一些有意思的问答 | Java技术经验分享 Nacos系列博客说明 | Java技术经验分享 菜鸡程序员的2019年度总结 | Java技术经验分享 Java中“附近的人”实现方案讨论及代码实现 | Java技术经验分享 Java时间处理2----时区TimeZone类方法探究(Java8以前) | Java技术经验分享 FastJson中JSONString、JavaBean、JSONObject、JSONArray的转换关系及API示例 | Java技术经验分享 2019.11软考软件设计师归来心得体会及复习备考指南 | Java技术经验分享 你还没用过“约定式提交”吗?那你赶紧来补补知识吧 | Java技术经验分享 教你如何看懂UML中的类图及类图中的关系 | Java技术经验分享 设计模式总览 | Java技术经验分享 萌新入门Github请看这里,学不会远程教 | Java技术经验分享 Hexo的工作原理探究 | Java技术经验分享 Hexo-theme-butterfly修改调整记录教程 | Java技术经验分享 排序8:基数排序 | Java技术经验分享 排序7:归并排序 | Java技术经验分享 排序6:快速排序 | Java技术经验分享 排序5:冒泡排序 | Java技术经验分享 排序4:堆排序 | Java技术经验分享 排序3:选择排序 | Java技术经验分享 排序2:希尔排序 | Java技术经验分享 排序1:直接插入排序 | Java技术经验分享 推荐一款博客一文多发的良心工具OpenWrite | Java技术经验分享 近期学习计划 | Java技术经验分享 Nacos(九):Nacos集群部署和遇到的问题 | Java技术经验分享 Nacos(八):Nacos持久化 | Java技术经验分享 Nacos(七):Nacos共享配置 | Java技术经验分享 Nacos(六):多环境下如何“管理”及“隔离”配置和服务 | Java技术经验分享 Nacos(五):多环境下如何“读取”Nacos中相应的配置 | Java技术经验分享 Nacos(四):SpringCloud项目中接入Nacos作为配置中心 | Java技术经验分享 Nacos(三):Nacos与OpenFeign的对接使用 | Java技术经验分享 Nacos(二):SpringCloud项目中接入Nacos作为注册中心 | Java技术经验分享 Nacos(一):Nacos介绍 | Java技术经验分享 20190719小组分享 | Java技术经验分享 Java中equals和HashCode方法的分析 | Java技术经验分享 Java中==和equals方法的分析 | Java技术经验分享 Java中的自动拆装箱、装箱缓存 | Java技术经验分享 About-blog | Java技术经验分享 Java中的编译、反编译和反编译工具全家桶分享 | Java技术经验分享 finalize()的生命周期(执行过程) | Java技术经验分享 Java关键字之final、finally与finalize方法 | Java技术经验分享 Java中重写、重载 | Java技术经验分享 Java中面向对象的三大特征:继承、封装、多态 | Java技术经验分享 DockerFile介绍 | Java技术经验分享 Docker环境下安装Gitlab | Java技术经验分享 Docker中私有仓库的搭建流程 | Java技术经验分享 Centos7下两种方式安装Docker-CE | Java技术经验分享 Vert.x创建一个Http服务 | Java技术经验分享 Vert.x创建TCP服务端及客户端 | Java技术经验分享 Vert.x Core(二)- Event Bus(事件总线) | Java技术经验分享 Vert.x-Core(一)- 基础篇 | Java技术经验分享 SpringBoot项目中实现国际化 | Java技术经验分享 Vert.x介绍 | Java技术经验分享 毕设选题项目本地运行环境搭建教程 | Java技术经验分享 Jupyter Notebooks的安装和使用介绍 | Java技术经验分享 算法笔试题:1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题 | Java技术经验分享 Quartz学习总结 | Java技术经验分享 SpringBoot2.x集成Redis | Java技术经验分享 SpringBoot2.x集成MongoDB | Java技术经验分享 [SpringCloud学习] - 浅谈微服务架构 | Java技术经验分享 基于hexo和coding免费搭建个人博客网站 | Java技术经验分享 Hello World | Java技术经验分享
Java时间处理1----Date和Calendar方法探究(Java8以前) | Java技术经验分享
文章作者: LarsCheng · 2019-11-21 · via Java技术经验分享

前言

时间的处理在Java中会经常用到,Java中常用的时间处理类有如下两种:

  • Date: 日期类
    • 用来表示瞬时时间,精确到毫秒,他表示的是某一刹那的时间。Date不存在时区概念。
    • 由于Date类不易于实现国际化,所以逐渐不被推荐使用,并且废弃了大部分方法。
  • Calendar: 日历类,可以理解为计算机历
    • 一方面是为了弥补Date的国际化缺陷,另一方面是将时间以日历的形式来表示和处理
    • Calendar包含时区和语言的概念
    • Calendar将时间细分成了年月日时分秒毫秒上午下午夏时令等概念,并提供这些概念的相关操作方法。

下面我们来康康这两个工具类的一些常用方法。

Date类位于java.util包下,是JDK中最早的时间处理类,但由于Date类不易于实现国际化,后不被推荐使用。

Date源自于JDK1.0,到如今Date类中的大部分构造函数和方法都已经废弃不推荐使用(Deprecated)

目前还在使用的方法如下:

方法 : 返回值 参数说明 功能
Date() 构造器 当前时间的Date对象
Date(long date) 构造器,date:与GMT1970年1月1日00:00:00之间的时间差(ms) 创建指定时间的Date对象
after(Date when):boolean when:待判断的Date对象 某一Date是否在when之后
before(Date when):boolean when:待判断的Date对象 某一Date是否在when之前
compareTo(Date anotherDate):int anotherDate:待比较的Date对象 Date对象与参数中的Date进行比较 ,
a.compareTo(b):a>b:正数, a=b:0,a<b:负数
getTime():long 返回Date对象的时间戳
setTime(long time):void time:时间戳 设置Date对象的时间

Date对象的使用示例如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.Date;







public class DateTest {
public static void main(String[] args) {
Date date1 = new Date();
Date date2 = new Date(System.currentTimeMillis()+1000);
System.out.println("date1: "+date1);
System.out.println("date2: "+date2);
System.out.println("date1.compareTo(date2): "+date1.compareTo(date2));
System.out.println("date1.after(date2): "+date1.after(date2));
System.out.println("date1.before(date2): "+date1.before(date2));
System.out.println("date1.getTime(): "+date1.getTime());
date1.setTime(System.currentTimeMillis());
System.out.println("setTime() ==> date1.getTime(): "+date1.getTime());
}
}

Calendar 📆

在JDK1.1后,处理时间时,推荐使用Calendar类,Calendar包含Date中所有的功能,并且比Date更复杂更强大。

Calendar是一个抽象类,不可以直接实例化它,但可以通过他提供的getInstance方法进行创建

Calendar类在Date原有功能基础上,加强了对时间的处理和自定义等。其常用方法如下:

方法 : 返回值 参数说明 功能
getInstance():Calendar 对外提供Calendar的创建入口
(该方法还有两个重载方法
主要用于自定义时区,语言环境)
after(Object when):boolean when:待判断的Calendar对象 某一Date是否在when之后
before(Object when):boolean when:待判断的Calendar对象 某一Date是否在when之前
compareTo(Calendar a):int a:待比较的Calendar对象 Date对象与参数中的Date进行比较 ,
a.compareTo(b):a>b:正数, a=b:0,a<b:负数
getTime():Date 将Calendar日期对象转换为Date对象
setTime(Date date):void date:Date对象 将Date对象表示的时间值设置给Calendar日期对象
getTimeInMillis():long 返回Calendar日期对象的时间戳
setTimeInMillis(long millis):void millis:时间戳 用给定long值设置日历的当前时间
get(int field):int field:日历字段(Calendar.YEAR) 获取指定日历字段的值
set(int field, int val):void field:日历字段,val:具体值 设置日历字段的值
add(int field, int amount):void field:日历字段,amount:加减值 基于日历的规则实现日期加减。amout可为负数
roll(int field, boolean up):void field:日历字段,up:T加/F减 在指定日历字段上添加或减去1个时间单元
roll(int field, int amount):void field:日历字段,amount:加减值 在指定日历字段上添加或减去指定的时间单元

以上仅仅是Calendar类中的一部分常用方法,更多详细的方法大家可以参考源码

Calendar类是基于日历的时间处理类,在使用他之前需要注意下面一些小细节:

  • Calendar.MONTH: 初始值为0,最大值11,所以在格式化时间时记得+1

  • 在使用set方法时,Calendar.HOUR为12小时制,Calendar.HOUR_OF_DAY为24小时制

  • add与roll都可以实现指定字段的加减,两者的区别在于add会进位而roll不会,例子如下:

    1
    2
    3
    4
    5
    6
    7
    8
       
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Calendar ca1 = Calendar.getInstance();
    Calendar ca2 = Calendar.getInstance();
    ca1.add(Calendar.MONTH,3);
    ca2.roll(Calendar.MONTH,3);
    System.out.println(sf.format(ca1.getTime()));
    System.out.println(sf.format(ca2.getTime()));

Calendar类的常用方法使用示例如下:

add

1
2
3
4
5
6
7
8
9


System.out.println("#################### add #####################");
Calendar cal = Calendar.getInstance();
System.out.println("当前月份:"+(cal.get(Calendar.MONTH)+1));
cal.add(Calendar.MONTH,2);
System.out.println("加上2个月:"+(cal.get(Calendar.MONTH)+1));
cal.add(Calendar.MONTH,-2);
System.out.println("再加上-2个月:"+(cal.get(Calendar.MONTH)+1));

set

1
2
3
4
5
6
7

System.out.println("#################### set #####################");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,2018);
System.out.println("修改年份后:"+calendar.get(Calendar.YEAR));
calendar.set(2018, Calendar.MAY,13,15,1,11);
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()));

get

1
2
3
4
5
6
7
8

System.out.println("#################### get #####################");
System.out.println("当前日期:"+calendar.get(Calendar.YEAR)+"-"+calendar.get(Calendar.MONTH)
+"-"+calendar.get(Calendar.DATE));
System.out.println("当前时间:"+calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)
+":"+calendar.get(Calendar.SECOND)+":"+calendar.get(Calendar.MILLISECOND));
System.out.println("12小时制:"+calendar.get(Calendar.HOUR));
System.out.println("24小时制:"+calendar.get(Calendar.HOUR_OF_DAY));

总结

本文主要对时间处理类进行了方法梳理和说明,实际的使用中还会掺杂着时区和时间格式化等操作。

下篇文章我们接着来了解下Java中时区类TimeZone的基本使用。