localdate方法,创建localdate

http://www.itjxue.com  2023-01-04 15:43  来源:未知  点击次数: 

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);

}

}

(责任编辑:IT教学网)

更多