Loading...
Image

java8 Instant.now()遇到的问题

首页 / 新闻资讯 / 正文

在java.util.Date类与LocalDate、LocalDateTime类之间转换中
均可以通过Instant作为中间类完成转换,Instant的使用还是比较方便的,下面介绍Instant的使用。

一、创建Instant实例

Instant now= Instant.now(); System.out.println("now:"+now);

控制台输出:

2020-09-08T07:40:40.984Z

注意:通过这种方式获取的时间戳与北京时间相差8个时区,需要修正为北京时间,通过查看源代码发现Instant.now()使用等是UTC时间Clock.systemUTC().instant()。LocalDate、LocalDateTime 的now()方法使用的是系统默认时区 不存在Instant.now()的时间问题。
###解决方法
增加8个小时

Instant now= Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8)); System.out.println("now:"+now);

控制台输出:

2020-09-08T15:40:40.984Z

二、Instant获取long类型的10位秒数、13位毫秒数

Instant now= Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8)); System.out.println("秒数:"+now.getEpochSecond()); System.out.println("毫秒数:"+now.toEpochMilli());

控制台输出:

秒数:1539170157 毫秒数:1539170157886

LocalDateTime输出毫秒数的方式,比Instant多一步转换

LocalDateTime localDateTime= LocalDateTime.now();//LocalDateTime转Instant Instant localDateTime2Instant= localDateTime.atZone(ZoneId.systemDefault()).toInstant(); System.out.println("LocalDateTime 毫秒数:"+localDateTime2Instant.toEpochMilli());

控制台输出:

LocalDateTime 毫秒数:1539141733010
import java.time.*;import java.time.format.DateTimeFormatter;import java.time.temporal.ChronoUnit;import java.util.Date;/**  * @author : yewang  * create at:  2020/9/8  2:33 下午  */publicclassMain{//获取当前日期publicstaticvoidgetCurrentDate(){         LocalDate today= LocalDate.now();         System.out.println("Todays Local date:"+ today);         Date date=newDate();         System.out.println(date);}//获取年月日信息publicstaticvoidgetDetailDate(){         LocalDate today= LocalDate.now();int year= today.getYear();int month= today.getMonthValue();int day= today.getDayOfMonth();         System.out.println(year);         System.out.println(month);         System.out.println(day);}//处理特定日期publicstaticvoidhandleSpecialDate(){         LocalDate dateOfToday= LocalDate.of(2020,9,3);         System.out.println(dateOfToday);}//判断两个日期是否相等publicstaticvoidcompareDate(){         LocalDate today= LocalDate.now();         LocalDate date1= LocalDate.of(2020,9,8);if(date1.equals(today)){             System.out.printf("today %s and date1 %s is sameday",today,date1);             System.out.println();}}//检查像生日这种周期性事件publicstaticvoidcycleDate(){         LocalDate today= LocalDate.now();         LocalDate dateOfBitrh= LocalDate.of(2018,9,8);         MonthDay birthday= MonthDay.of(dateOfBitrh.getMonth(), dateOfBitrh.getDayOfMonth());         MonthDay currentMonthDay= MonthDay.from(today);if(birthday.equals(currentMonthDay)){             System.out.println("Happy Birthday!");}else{             System.out.println("Sorry ,today is not your birthday!");}}//获取当前时间publicstaticvoidgetCurrentTime(){         LocalTime now= LocalTime.now();         System.out.println("local time :"+ now);}//增加小时publicstaticvoidplusHours(){         LocalTime now= LocalTime.now();         LocalTime newTime= now.plusHours(4);         System.out.println(newTime);}//计算一星期后的日期publicstaticvoidnextWeek(){         LocalDate today= LocalDate.now();         LocalDate nextWeek= today.plusDays(7);         System.out.println("nextWeek is:"+ nextWeek);}//计算一年前或者一年后的日期publicstaticvoidminusDate(){         LocalDate today= LocalDate.now();         LocalDate previousYear= today.minus(1, ChronoUnit.YEARS);         System.out.println("Date before 1 year:"+ previousYear);         LocalDate nextYear= today.plus(1, ChronoUnit.YEARS);         System.out.println("Date next 1year:"+ nextYear);}//获取时钟类publicstaticvoidclock(){// 根据系统时间返回当前时间并设置为UTC。         Clock clock= Clock.systemUTC();         System.out.println("Clock : "+ clock);// 根据系统时钟区域返回时间         Clock defaultClock= Clock.systemDefaultZone();         System.out.println("Clock : "+ clock);}//如何用Java判断日期是早于还是晚于另一个日期publicstaticvoidisBeforeOrIsAfter(){         LocalDate today= LocalDate.now();          LocalDate tomorrow= LocalDate.of(2018,1,29);if(tomorrow.isAfter(today)){             System.out.println("Tomorrow comes after today");}//减去一天         LocalDate yesterday= today.minus(1, ChronoUnit.DAYS);if(yesterday.isBefore(today)){             System.out.println("Yesterday is day before today");}}//获取特定时区下面的时间publicstaticvoidgetZoneTime(){//设置时区         ZoneId america= ZoneId.of("America/New_York");          LocalDateTime localtDateAndTime= LocalDateTime.now();          ZonedDateTime dateAndTimeInNewYork= ZonedDateTime.of(localtDateAndTime, america);         System.out.println("现在的日期和时间在特定的时区 : "+ dateAndTimeInNewYork);}//使用 YearMonth类处理特定的日期publicstaticvoidcheckCardExpiry(){         YearMonth currentYearMonth= YearMonth.now();         System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());          YearMonth creditCardExpiry= YearMonth.of(2028, Month.FEBRUARY);         System.out.printf("Your credit card expires on %s %n", creditCardExpiry);}//检查闰年publicstaticvoidisLeapYear(){         LocalDate today= LocalDate.now();if(today.isLeapYear()){             System.out.println("This year is Leap year");}else{             System.out.println("2020 is not a Leap year");}}//计算两个日期之间的天数和月数publicstaticvoidcalcDateDays(){         LocalDate today= LocalDate.now();          LocalDate java8Release= LocalDate.of(2018, Month.MAY,14);          Period periodToNextJavaRelease= Period.between(today, java8Release);          System.out.println("Months left between today and Java 8 release : "+ periodToNextJavaRelease.getMonths());}publicstaticvoidgetTimestamp(){         Instant timestamp= Instant.now();         System.out.println("What is value of this instant "+ timestamp);}// 使用预定义的格式化工具去解析或格式化日期publicstaticvoidformateDate(){         String dayAfterTommorrow="20180210";         LocalDate formatted= LocalDate.parse(dayAfterTommorrow, DateTimeFormatter.BASIC_ISO_DATE);         System.out.printf("Date generated from String %s is %s %n", dayAfterTommorrow, formatted);}publicstaticvoidmain(String[] args){getCurrentDate();getDetailDate();handleSpecialDate();compareDate();cycleDate();getCurrentTime();plusHours();nextWeek();minusDate();clock();isBeforeOrIsAfter();getZoneTime();checkCardExpiry();isLeapYear();calcDateDays();getTimestamp();formateDate();}}