Java 时间类-Calendar、Date、LocalDate/LocalTime
1、Date 类
java.util.Date
是一个“万能接口”,它包含日期、时间,还有毫秒数,如果你只想用java.util.Date
存储日期,或者只存储时间,那么,只有你知道哪些部分的数据是有用的,哪些部分的数据是不能用的。
1.1 Date的构造方法
Date 是我们使用的最多的一个日期类,Date提供的构造方法在官方API中有一下几种:
Date 类提供了多种构造方法,但是目前有很多方法都已经不建议使用
public Date() {
this(System.currentTimeMillis());
} public Date(long date) {
fastTime = date;
} @Deprecated
public Date(int year, int month, int date) {
this(year, month, date, 0, 0, 0);
} @Deprecated
public Date(int year, int month, int date, int hrs, int min) {
this(year, month, date, hrs, min, 0);
} @Deprecated
public Date(int year, int month, int date, int hrs, int min, int sec) @Deprecated
public Date(String s) {
this(parse(s));
}
目前我们可以通过使用:
Date date0 = new Date();
Date date1 = new Date(time);
这两种方法创建对象的不同主要是通过指定的时间戳不同,通过设置Date 中的 fastTime 进行设置Date 对象的时间。
除了使用构造方法获取实例,Date 还可以通过 Instant 来创建一个Date 实例:
Instant instant = Instant.now();
Date date = Date.from(instant);
Instant 是Java 8 提供的新特性:
1.2 Date的常用方法
Date 类中,提供了常用的获取:年,月,日,时,分,秒等方法:
Date date = new Date();
int dates = date.getDate(); int year = date.getYear();
int month = date.getMonth();
int day = date.getDay(); int hours = date.getHours();
int min = date.getMinutes();
int second = date.getSeconds(); long time = date.getTime();
int times = date.getTimezoneOffset();
输出结果:
dates: 14
year: 116
month: 11
day: 3
hours: 15
min: 8
second: 29
time: 1481699309422
times: -480
读者可能会发现,这里的年份并不是我们想要的,这里主要是因为代码方法实现:
我们可以看到,这里的getYear 并不是获取当前年份,而是获取到和1900年的差值,这里主要是因为JDK老版本遗留下来的问题,对于Date 中获取年月日的方法,现在已经不建议使用了。
Date类中也提供了一些设置日期的方法:
与上面的get方法是一一对应的,但是现在也同样不建议使用了。
1.3 Date的总结
经过我们上述的分析,我们发现,Date 类如今很多方法已经没有什么用处了,确实,如今时间的处理并不直接在Date 类中进行,而是通过Calendar,或者LocalDate 来进行,我们再日常使用中,更多的是要来做一个记录日期的实例。
2、Calendar 类
介绍一下Date 与 Calendar 的区别
Date用于记录某一个含日期的、精确到毫秒的时间。重点在代表一刹那的时间本身。
Calendar用于将某一日期放到历法中的互动——时间和年、月、日、星期、上午、下午、夏令时等这些历法规定互相作用关系和互动。Calendar本身代表公历的一个简化缩水版,姑且叫“计算机历”。
完整的公历是格里高利历,Java SE中以GregorianCalendar类来提供相关的历法功能。
2.1 Calendar 的构造方法
我们可以看到,Calendar 中的构造方法被封装在包中,我们无法直接通过构造方法来创建一个新的实例对象,我们只能通过调用 Calendar中的静态方法 Calendar.getInstance()方法获取一个实例对象。
我们看一下官方API 中提供了哪些方法获取Calendar 对象:
这是官方文档给出的获取去对象实例的方法,我们可以看到,我们可以通过指定TimeZone 和 Locale 来获取特定的 Calendar 对象,这也却分了每个地区的时间日历,方便开发者使用
除了通过getInstance() 方法获取实例以外,Java 1.8 提供了一个内部类:
我们可以通过创建一个Builder 的实体,然后通过调用Build 方法获取一个 Calendar 实例。
在Builder 中,Builder 类提供了设置年月日的方法,可以通过设置时间,来获取特定的Calendar 对象。
Calendar.Builder builder =new Calendar.Builder();
Calendar calendar1 = builder.build();
Date date = calendar.getTime();
这里总结一下:
Calendar 提供的获取实例的方法主要有两种途径:
1、调用Calendar.getInstance()方法
2、创建内部类Builder 的实例,通过调用其 build()方法创建 Calendar 实例
对于第一种方法,只能先获取当前时间的Calendar,然后再通过调用相应的set 方法设置年月日等,而如果使用内部类Builder 方法,可以通过setInstant 方法设置我们所期望的时间。
2.2 Calendar 的常用方法
我们最常用的方法有:
Calendar calendar = Calendar.getInstance();
Date date = calendar.getTime();
通过Calendar 方法获取一个Date 的实例。
Calendar 方法获取年月日的方法:
int year =calendar.get(Calendar.YEAR); int month=calendar.get(Calendar.MONTH)+1; int day =calendar.get(Calendar.DAY_OF_MONTH); int hour =calendar.get(Calendar.HOUR_OF_DAY); int minute =calendar.get(Calendar.MINUTE); int seconds =calendar.get(Calendar.SECOND);
我们可以看到Calendar 里面获取年月日不像上面 Date 类中的通过访问各个方法来获取。
Calendar 在初始化的时候,就已经将年月日划分好,并且存入fields 变量中。我们只需要传入每个位置编号,就可以获取我们需要的信息
除了获取以外,Calendar 也提供了相应的set 方法:
通过重新传入参数,设置Calendar 的时间
Calendar 获取当前月份,当前星期的最大\小天数
System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_WEEK));
System.out.println(calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
System.out.println(calendar.getActualMinimum(Calendar.DAY_OF_WEEK));
System.out.println(calendar.getActualMinimum(Calendar.DAY_OF_MONTH));
提供了Before 和After 两个方法,用于判断当前时间与对比时间先后:
提供了add 方法进行日期的加减
calendar.add(10,10);
2.3 Calendar 的总结
从上面的分析我们可以看到,Calendar 类 主要是用于作为日历的对象,可以铜鼓哦设置地区时间,区分每个地区的日期,Calendar 提供的方法也没有很多对时间进行的一些操作。
3、LocalDate/LocalTime 类
Java 8新增了LocalDate
和LocalTime
接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date
实在是太难用了。
java.util.Date
月份从0
开始,一月是0
,十二月是11
,变态吧!java.time.LocalDate
月份和星期都改成了enum
,就不可能再用错了。
java.util.Date
和SimpleDateFormatter
都不是线程安全的,而LocalDate
和LocalTime
和最基本的String
一样,是不变类型,不但线程安全,而且不能修改。
3.1 LocalDate/LocalTime 的构造方法
3.1.1 LocalDate 的构造方法:
LocalDate 并没有提供公开的构造方法,只提供了一个封装的构造方法供内部使用。
private LocalDate(int year, int month, int dayOfMonth) {
this.year = year;
this.month = (short) month;
this.day = (short) dayOfMonth;
}
LocalDate 提供了三种创建实例的方法:
//获取当前时间的LocalDate
LocalDate localDate = LocalDate.now();
//获取指定年、月、日 的 LocalDate
LocalDate ofDate = LocalDate.of(2016,12,31);
//通过解析字符串获取 LocalDate,如果格式不对会抛出 DateTimeParseException
LocalDate parseDate = LocalDate.parse("2016-12-31-");
3.1.2 LocalTime 的构造方法:
LocalTime 与LcoalDate 一样,提供了一个封装的构造方法:
private LocalTime(int hour, int minute, int second, int nanoOfSecond) {
this.hour = (byte) hour;
this.minute = (byte) minute;
this.second = (byte) second;
this.nano = nanoOfSecond;
}
LocalTime 提供了三种创建方法:
LocalTime localTime = LocalTime.now().withNano(0);
LocalTime ofTime = LocalTime.of(16,30,25);
LocalTime parseTime = LocalTime.parse("12:00:01");
3.2 LocalDate/LocalTime 的常用方法
获取当天的起始时间:atStartOfDay()
LocalDate localDate = LocalDate.now();
LocalDateTime date = localDate.atStartOfDay(); 输出:
2016-12-14T00:00
设置当前日期的时间:atTime()
LocalDate localDate = LocalDate.now();
LocalDateTime date = localDate.atTime(16,25,30); 输出:
2016-12-14T16:25:30
格式转换:format()
常用的获取年、月、日 等方法
int year = localDate.getYear();
int month = localDate.getMonthValue();
int day = localDate.getDayOfMonth();
获取改变月份的LocalDate :withMonth()
LocalDate localDate = LocalDate.now();
LocalDate d = localDate.withMonth(10);
其他常用的日期转换:
// 取本月第1天:
LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2014-12-01
// 取本月第2天:
LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2014-12-02
// 取本月最后一天,再也不用计算是28,29,30还是31:
LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2014-12-31
// 取下一天:
LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1); // 变成了2015-01-01
// 取2015年1月第一个周一,这个计算用Calendar要死掉很多脑细胞:
LocalDate firstMondayOf2015 = LocalDate.parse("2015-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2015-01-05
3.3 LocalDate/LocalTime 的总结
在新的Java 8中,日期和时间被明确划分为LocalDate
和LocalTime
,LocalDate
无法包含时间,LocalTime
无法包含日期。当然,LocalDateTime
才能同时包含日期和时间。
新接口更好用的原因是考虑到了日期时间的操作,经常发生往前推或往后推几天的情况。用java.util.Date
配合Calendar
要写好多代码,而且一般的开发人员还不一定能写对。
Java 时间类-Calendar、Date、LocalDate/LocalTime的更多相关文章
- Java时间类从此变得清晰明了
Java时间类 Java时间类分为Date 日期类和Calendar 日历类,相信很多小伙伴在初学时会对这个两个类的用法.区别以及有什么联系会感到疑惑,似乎懂了,但又不能具体说清,今天再带你来清晰的再 ...
- java时间类简单总结
java时间类(Data类) 1.Data类(没有考虑到国际化,好多方法已过时java.util.Data包中) 父类(是类不是接口含有直接子类3个): 日期格式为:年月日时分秒(不包含毫秒部分) ...
- java时间类Date、Calendar及用法
对于时间类,这篇主要说明各种现实情况下如何取值,怎么定向取值,得到自己想要的时间参数.在java中时间类主要有Date.Calendar,暂时只介绍 java.util.*下的时间类,对于java.s ...
- 日期时间类:Date,Calendar,计算类:Math
日期时间类 计算机如何表示时间? 时间戳(timestamp):距离特定时间的时间间隔. 计算机时间戳是指距离历元(1970-01-01 00:00:00:000)的时间间隔(ms). 计算机中时间2 ...
- Java日期类:Date和Calendar的使用
总是使用这两个类,总是需要百度.还不如一次全部整理完. 一.介绍: Date 类 Date 表示特定的瞬间,精确到毫秒. 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年 ...
- Java时间类总结
java.util.Date 包含有年月日时分秒,精确到毫秒级别. 官方解释: // The class Date represents a specific instant in time, wit ...
- Java 时间类
1.System 类 2.Date 类 3.SimpleDateFormate 类 4.Calendar 类 1.System 类 得到当前的时间值.System 类不能被实例化,需要通过它的静态方法 ...
- Java时间类(转)
package com.chinagas.common.utils; import java.text.ParseException; import java.text.SimpleDateForma ...
- java 日历类Calendar用法
如何获取昨天?取昨天的日期,本想的截出来日期减一就好了.又一想不对,如果今天是一号怎么办? 现有两个办法 1: Date as = new Date(new Date().getTime()-24*6 ...
随机推荐
- html5的web存储
在html5标准之前,web存储信息需要cookie来完成,但是cookie不适合大量数据存储.因为需要等待服务器响应,所以速度慢/效率低. 本地存储的特点: localstorage是仅存储在用户的 ...
- 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)
建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...
- Java进击C#——前言
本章简言 记得三年前笔者来到现在的公司的时候,公司人口不出十个人.那个时候笔者刚从日本回来,想在福州.厦门.青岛找一个合适自己发展的机会.最后我的一个福州的朋友打电话希望我能过去帮他,跟他一起创业.这 ...
- 使用Expression实现数据的任意字段过滤(1)
在项目常常要和数据表格打交道. 现在BS的通常做法都是前端用一个js的Grid控件, 然后通过ajax的方式从后台加载数据, 然后将数据和Grid绑定. 数据往往不是一页可以显示完的, 所以要加分页: ...
- 【干货分享】流程DEMO-出差申请单
流程名: 出差申请 业务描述: 员工出差前发起流程申请,流程发起时,会检查预算,如果预算不够,将不允许发起费用申请,如果预算够用,将发起流程,同时占用相应金额的预算,但撤销流程会释放相应金额的预算. ...
- Java实现FTP文件与文件夹的上传和下载
Java实现FTP文件与文件夹的上传和下载 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制 ...
- 作为前端er,写在年末的一些话
写惯了技术类的文章,这种总结和唠嗑型的我基本也就在年末才来一篇.说实话,这种轻松类的文章往往比技术类的要受欢迎的多,因为其受众更广,看起来也不烧脑. 说来愧疚,这一年其实产出有点低,大致就写了不到二十 ...
- GO基础(二)
本例中梳理go语言中的协程和通道. package main import ( "fmt" "time" ) //func01.func02 为演示同步机制 f ...
- Flappy Bird 源码走读
参考:https://github.com/kirualex/SprityBird 该项目基于spritekit,代码的结构很清楚,感觉用来学习spritekit非常不错. 1.项目只有一个viewC ...
- 好好了解一下Cookie
Cookie的诞生 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网站.目前最新 ...