在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();}}