localdate方法,创建localdate
LocalDate的使用及解析
最近刚做了一个用户签到获取奖励的需求,因为是Trip端即海外端,所以会需要考虑到时区的问题,又用到了平时配置中会经常使用到的关于生效时间问题的LocalDate和LocalDateTime类,刚好最近就好好整理一下。按照惯例,我们还是从学源码开始,然后写写例子实践一下,最后总结。
上面通过源码的方式列举出了我们常用的一些方法并加上了注释,最常用的方法是now,parse,isAfter,isBefore等方法,因为项目中配置生效时间和截止时间一般是字符串,可以通过parse方法获取LocalDate对象,然后now方法获取当前时间,最后通过isAfter,isBefore进行判断是否在生效时间内。当然LocalDate是精确到天数的,而我们实际使用一般是精确到时分秒,所以使用的是LocalDateTime,但是其实这两个内容很相似,所以就只介绍这一个了,下面写了一些使用案例帮助大家理解。
运行结果如下
之前JDK已经有了Date,SimpleDateFormat,Calendar等用于时间操作的类了,为啥还会新开发呢,其实就是Calendar,SimpleDateFormat是会有并发风险的,但是LocalDate,LocalDateTime都是并发安全的类,实际当中使用起来也更加的方便快捷。
上面所说的SimpleDateFormat线程不安全的原因是什么,为啥DateTimeFormatter又是线程安全的?因为SimpleDateFormat有个继承自父类的全局变量calendar但是DateTimeFormatter只有final类型的全局变量,这个可以大家自己去学习一下。
java的LocalDate对象问题
因为 LocalDate 被设计为不可变对象,这样的话每个修改当前 LocalDate 对象的方法(比如 plusDays),都会返回一个新的 LocalDate 对象,而原有的 LocalDate 对象不会发生改变。
如何在java8中愉快地处理日期和时间java8新增了localdate和localtim
java8中的localdate和localtime用法举例如下:
这两个方法使我们可以方便的实现将旧的日期类转换为新的日期类,具体思路都是通过Instant当中介,然后通过Instant来创建LocalDateTime(这个类可以很容易获取LocalDate和LocalTime),新的日期类转旧的也是如此,将新的先转成LocalDateTime,然后获取Instant,接着转成Date,具体实现细节如下:
// 01. java.util.Date -- java.time.LocalDateTime
public void UDateToLocalDateTime() {
java.util.Date date = new java.util.Date();
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
}
// 02. java.util.Date -- java.time.LocalDate
public void UDateToLocalDate() {
java.util.Date date = new java.util.Date();
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
LocalDate localDate = localDateTime.toLocalDate();
}
// 03. java.util.Date -- java.time.LocalTime
public void UDateToLocalTime() {
java.util.Date date = new java.util.Date();
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
LocalTime localTime = localDateTime.toLocalTime();
}
// 04. java.time.LocalDateTime -- java.util.Date
public void LocalDateTimeToUdate() {
LocalDateTime localDateTime = LocalDateTime.now();
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
java.util.Date date = Date.from(instant);
}
// 05. java.time.LocalDate -- java.util.Date
public void LocalDateToUdate() {
LocalDate localDate = LocalDate.now();
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
java.util.Date date = Date.from(instant);
}
// 06. java.time.LocalTime -- java.util.Date
public void LocalTimeToUdate() {
LocalTime localTime = LocalTime.now();
LocalDate localDate = LocalDate.now();
LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
java.util.Date date = Date.from(instant);
}
java8新增了localdate和localtim,要如何处理日期和时间?
JDK8中,新增了三个类,用以处理时间。
LocalDate专门处理日期,LocalTime专门处理时间,LocalDateTime包含了日期和时间,而且对于很多复杂的问题,都提供了现成的方法,比如:获取2017年12月的第一个周一,这样的处理,在以前,是很复杂的,而现在,只需要一行代码即可。(使用前,需要将JDK升级到1.8)
下面,简单了记录了这两个类的一些常见用法:
[java]?view plain?copy
package?test;
import?java.time.DayOfWeek;
import?java.time.LocalDate;
import?java.time.LocalDateTime;
import?java.time.LocalTime;
import?java.time.temporal.TemporalAdjusters;
import?java.util.Calendar;
/**
*?Created?by?lightClouds917
*?Date?2017/11/6
*?Description:Java8中处理时间和日期的类
*
SQL??-?Java
--------------------------
date?-?LocalDate
time?-?LocalTime
timestamp?-?LocalDateTime
*/
public?class?DateTest2?{
public?static?void?main(String[]?args){
test1(); ? ? ?
test2();
Calendar?calendar?=?Calendar.getInstance();
System.out.println(calendar.getTime());
}
/**
*?处理日期?LocalDate
*/
public?static?void?test1(){
//获取当前日期???2017-11-06
LocalDate?today?=?LocalDate.now();
System.out.println(today); ?
//构造日期???2017-10-08
LocalDate?today2?=?LocalDate.of(2017,10,8);
System.out.println(today2);
//构造日期???2017-02-22????字符串严格按照yyyy-MM-dd ? ? ?
LocalDate?today3?=?LocalDate.parse("2017-02-22");
System.out.println(today3);
//本月第一天??2017-11-01
LocalDate?firstDayOfMonth?=?today.with(TemporalAdjusters.firstDayOfMonth());
System.out.println(firstDayOfMonth);
//本月第二天??2017-11-02???第n天
LocalDate?secondDayOfMonth?=?today.withDayOfMonth(2);
System.out.println(secondDayOfMonth);
//本月最后一天?2017-02-28??方便解决任何年份的二月份多少天
LocalDate?lastDayOfMonth?=?today3.with(TemporalAdjusters.lastDayOfMonth());
System.out.println(lastDayOfMonth);
//获取2017年12月的第一个周一???2017-12-04 ?
LocalDate?firstDayOf201712?=?LocalDate.parse("2017-12-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
System.out.println(firstDayOf201712);
}
/**
*?处理时间??LocalTime
*/
public?static?void?test2(){
//获取当前时间??含有毫秒值??17:18:41.571
LocalTime?now?=?LocalTime.now();
System.out.println(now);
//获取当前时间???去掉毫秒值???17:45:41
LocalTime?now1?=?LocalTime.now().withNano(0);
System.out.println(now1);
//00:46:46.651??提供了把时分秒都设为0的方法
LocalTime?now2?=?LocalTime.now().withHour(0);
System.out.println(now2);
//构造时间??00:20:55 ?
LocalTime?time1?=?LocalTime.of(0,20,55);
System.out.println(time1);
//构造时间??05:43:22
LocalTime?time2?=?LocalTime.parse("05:43:22");
System.out.println(time2);
//标准时间?2017-11-06T17:53:15.930
LocalDateTime?lt?=?LocalDateTime.now();
System.out.println(lt);
}
}
