关于java得到当前时间(Java 获取当前时间) 的知识大家了解吗?以下就是小编整理的关于java得到当前时间(Java 获取当前时间) 的介绍,希望可以给到大家一些参考,一起来了解下吧!
Java获取当前时间(Java获取当前时间)
(资料图片)
简介
通过lambda表达式、流和一系列微小的优化,Java 8引入了新的日期时间API。
Java在处理日期、日历、时间方面的缺点:java.util.Date设置为可变类型,SimpleDateFormat的非线程安全性使其应用非常有限。然后给java8添加新特性。
新API的众多好处之一是它澄清了日期和时间的概念,如瞬间、持续时间、日期、时间、时区和时间段。
同时继承了Joda库根据人类语言和计算机分析的时间处理方法。与旧版本不同,新API基于ISO标准日历系统,java.time包下的所有类都是不可变的和线程安全的。
关键字分类
瞬间:瞬间实例。
LocalDate:当地日期,不包括具体时间。比如2014年1月14日可以用来记录生日、纪念日、入职日等。
Local:本地时间,不包括日期。
LocalDateTime:组合日期和时间,但不包含时差和时区信息。
ZonedDateTime:最完整的日期和时间,包括相对于UTC或格林威治的时区和时差。
新的API还引入了ZoneOffSet和ZoneId类,这使得解决时区问题更加容易。解析和格式化时间的DateTimeFormatter类也经过了彻底的重新设计。
真正的战斗
在教程中,我们将通过一些简单的例子来学习如何使用新的API,因为只有在实际项目中使用时,它才是学习新知识和新技术的最快方法。
1.获取当前日期
Java 8中的LocalDate用于表示今天的日期。与java.util.Date不同,它只有日期,没有时间。当您只需要指示日期时,请使用此类。
//获取今天的日期publicvoidgetCurrentDate(){LocalDatetoday=LocalDate.now();System.out.println("Today"sLocaldate:"+today);//这个是作为对比Datedate=newDate();System.out.println(date);}上面的代码创建了没有时间信息的今天的日期。打印的日期格式非常友好,不像Date类打印出一堆无格式的信息。
2.获取年、月、日信息。
LocalDate提供了一种快速获取年、月和日的方法,它的实例还包含许多其他日期属性。通过调用这些方法,您可以很容易地获得所需的日期信息,而不是像以前那样依赖java.util.Calendar类。
//获取年、月、日信息publicvoidgetDetailDate(){LocalDatetoday=LocalDate.now();intyear=today.getYear();intmonth=today.getMonthValue();intday=today.getDayOfMonth();System.out.printf("Year:%dMonth:%dday:%dt%n",year,month,day);}3.处理特定日期
在之一个例子中,我们通过静态工厂方法now()非常容易地创建了今天的日期。我们还可以调用另一个有用的工厂方法LocalDate.of()来创建任意日期。该方法需要将年、月和日作为参数传入,并返回相应的LocalDate实例。这种方法的好处是旧API的设计没有错误,比如年份从1900开始,月份从0开始等等。日期是所见即所得,就像下面的例子显示的是1月21日,这很简单。
//处理特定日期publicvoidhandleSpecilDate(){LocalDatedateOfBirth=LocalDate.of(2018,01,21);System.out.println("Thespecildateis:"+dateOfBirth);}4.确定这两个日期是否相等。
现实生活中有一种时间处理,就是判断两个日期是否相等。这种问题在项目的开发中总是会遇到。下面的例子将帮助你在Java 8中解决它。LocalDate重载equal方法。注意,如果比较的日期是字符型,需要解析成日期对象后再做判断。
请看下面的例子:
//判断两个日期是否相等publicvoidcompareDate(){LocalDatetoday=LocalDate.now();LocalDatedate1=LocalDate.of(2018,01,21);if(date1.equals(today)){System.out.printf("TODAY%sandDATE1%saresamedate%n",today,date1);}}5.检查像生日这样的周期性事件
Java中的另一个日期和时间处理是查看周期性事件,如生日、纪念日、法定节假日(国庆节和春节),或者每月固定时间给客户发邮件。Java如何检查这些节日或其他周期性事件?答案是MonthDay类。这个类结合了月和日,去掉了年,也就是说你可以用它来判断每年发生的事件。类似于这个类,还有另一个YearMonth类。这些类也是不可变和线程安全的值类型。让我们检查每月的周期性事件:
//处理周期性的日期publicvoidcycleDate(){LocalDatetoday=LocalDate.now();LocalDatedateOfBirth=LocalDate.of(2018,01,21);MonthDaybirthday=MonthDay.of(dateOfBirth.getMonth(),dateOfBirth.getDayOfMonth());MonthDaycurrentMonthDay=MonthDay.from(today);if(currentMonthDay.equals(birthday)){System.out.println("ManyManyhappyreturnsoftheday!!");}else{System.out.println("Sorry,todayisnotyourbirthday");}}6.获取当前时间
与获取日期的示例类似,LocalTime类用于获取时间,这是LocalDate的近亲,只有时间没有日期。现在可以调用静态工厂方法()来获取当前时间。默认格式为hh:mm:ss:nnn。
//获取当前时间publicvoidgetCurrentTime(){LocalTimetime=LocalTime.now();System.out.println("localtimenow:"+time);}7.向现有时间添加小时数
Java 8提供了更好的plusHours()方法来代替add(),并且兼容。注意,这些方法返回一个全新的LocalTime实例,由于它的不变性,必须给它赋一个变量。
//增加小时publicvoidplusHours(){LocalTimetime=LocalTime.now();LocalTimenewTime=time.plusHours(2);//增加两小时System.out.println("Timeafter2hours:"+newTime);}8.如何计算一周后的日期?
与上一个计算两小时后的时间的示例类似,本示例将计算一周后的日期。LocalDate不包含时间信息,它的plus()方法用于添加日、周和月。ChronoUnit类声明这些时间单位。因为LocalDate也是一个不可变类型,所以在返回它之后,必须给它赋一个变量。
你可以用同样的方法加上1个月,1年,1小时,1分钟甚至一个世纪。更多选项,可以查看Java 8 API中的ChronoUnit类。
//如何计算一周后的日期publicvoidnextWeek(){LocalDatetoday=LocalDate.now();LocalDatenextWeek=today.plus(1,ChronoUnit.WEEKS);//使用变量赋值System.out.println("Todayis:"+today);System.out.println("Dateafter1week:"+nextWeek);}9.计算一年前或一年后的日期。
在下面的示例中,我们通过LocalDate的plus()方法增加了天数、周数或月数。在本例中,我们使用minus()方法计算一年前的日期。
//计算一年前或一年后的日期publicvoidminusDate(){LocalDatetoday=LocalDate.now();LocalDatepreviousYear=today.minus(1,ChronoUnit.YEARS);System.out.println("Datebefore1year:"+previousYear);LocalDatenextYear=today.plus(1,ChronoUnit.YEARS);System.out.println("Dateafter1year:"+nextYear);}10.使用Java 8的时钟类。
Java添加了一个Clock类来获取当时的时间戳或当前时区的日期和时间信息。以前使用System.currentTimeInMillis()和TimeZone.getDefault()时,可以使用Clock。
publicvoidclock(){//根据系统时间返回当前时间并设置为UTC。Clockclock=Clock.systemUTC();System.out.println("Clock:"+clock);//根据系统时钟区域返回时间ClockdefaultClock=Clock.systemDefaultZone();System.out.println("Clock:"+clock);}11.判断日期是早于还是晚于另一个日期。
LocalDate类有两个方法isBefore()和isAfter()来比较日期。当调用isBefore()方法时,如果给定日期小于当前日期,则返回true。
//如何用Java判断日期是早于还是晚于另一个日期publicvoidisBeforeOrIsAfter(){LocalDatetoday=LocalDate.now();LocalDatetomorrow=LocalDate.of(2018,1,29);if(tomorrow.isAfter(today)){System.out.println("Tomorrowcomesaftertoday");}//减去一天LocalDateyesterday=today.minus(1,ChronoUnit.DAYS);if(yesterday.isBefore(today)){System.out.println("Yesterdayisdaybeforetoday");}}12.处理时区
Java不仅分隔日期和时间,还分隔时区。现在有了一系列独立的类,如用于处理特定时区的ZoneId,以及用于表示特定时区时间的ZoneDateTime类。
//获取特定时区下面的时间publicvoidgetZoneTime(){//设置时区ZoneIdamerica=ZoneId.of("America/New_York");LocalDateTimelocaltDateAndTime=LocalDateTime.now();ZonedDateTimedateAndTimeInNewYork=ZonedDateTime.of(localtDateAndTime,america);System.out.println("现在的日期和时间在特定的时区:"+dateAndTimeInNewYork);}13.如何体现固定日期?
例如,它表示一个固定的日期,如信用卡的到期日。类似于MonthDay检查重复事件的例子,YearMonth是另一个组合类,用来表示信用卡到期日、FD到期日、期货期权到期日等。您还可以使用这个类来获取当月的总天数。YearMonth实例的lengthOfMonth()方法可以返回当月的天数,这对于判断二月是28天还是29天非常有用。
//使用YearMonth类处理特定的日期publicvoidcheckCardExpiry(){YearMonthcurrentYearMonth=YearMonth.now();System.out.printf("Daysinmonthyear%s:%d%n",currentYearMonth,currentYearMonth.lengthOfMonth());YearMonthcreditCardExpiry=YearMonth.of(2028,Month.FEBRUARY);System.out.printf("Yourcreditcardexpireson%s%n",creditCardExpiry);}14.检查闰年。
LocalDate类有一个非常实用的方法isLeapYear()来判断实例是否是闰年。如果你还想重新发明轮子,这里有一个代码示例,一个纯Java逻辑编写的判断闰年的程序。
//检查闰年publicvoidisLeapYear(){LocalDatetoday=LocalDate.now();if(today.isLeapYear()){System.out.println("ThisyearisLeapyear");}else{System.out.println("2018isnotaLeapyear");}}15.计算两个日期之间的天数和月数。
常见的日期运算是计算两个日期之间的天数、周数或月数。在Java 8中,可以使用java.time.Period类进行计算。在下面的示例中,我们计算今天和未来某一天之间的月数。举个例子:现在是一月,从五月到三月。
//计算两个日期之间的天数和月数publicvoidcalcDateDays(){LocalDatetoday=LocalDate.now();LocalDatejava8Release=LocalDate.of(2018,Month.MAY,14);PeriodperiodToNextJavaRelease=Period.between(today,java8Release);System.out.println("MonthsleftbetweentodayandJava8release:"+periodToNextJavaRelease.getMonths());}16.包含时差信息的日期和时间
ZoneOffset类用于表示时区。例如,印度和GMT或UTC标准时区的时差是+05:30。对应的时区可以通过ZoneOffset.of()静态方法获取。一旦获得时差,就可以通过传入LocalDateTime和ZoneOffset来创建OffSetDateTime对象。
publicvoidZoneOffset(){LocalDateTimedatetime=LocalDateTime.of(2018,Month.FEBRUARY,14,19,30);ZoneOffsetoffset=ZoneOffset.of("+05:30");OffsetDateTimedate=OffsetDateTime.of(datetime,offset);System.out.println("DateandTimewithtimezoneoffsetinJava:"+date);}17.获取当前时间戳。
Instant类有一个静态工厂方法now(),它返回当前时间戳,如下所示:
publicvoidgetTimestamp(){Instanttimestamp=Instant.now();System.out.println("Whatisvalueofthisinstant"+timestamp);}18.使用预定义的格式化工具来解析或格式化日期。
Java 8引入了一个新的日期-时间格式工具,它是线程安全的并且易于使用。它附带了一些常用的内置格式化工具。以下示例使用BASIC_ISO_DATE格式工具将2018年2月10日格式化为2018 02 110。
//使用预定义的格式化工具去解析或格式化日期publicvoidformateDate(){StringdayAfterTommorrow="20180210";LocalDateformatted=LocalDate.parse(dayAfterTommorrow,DateTimeFormatter.BASIC_ISO_DATE);System.out.printf("DategeneratedfromString%sis%s%n",dayAfterTommorrow,formatted);}最后
最后附上所有代码。
packagecom.wq.study.java8.date;importjava.time.Clock;importjava.time.Instant;importjava.time.LocalDate;importjava.time.LocalDateTime;importjava.time.LocalTime;importjava.time.Month;importjava.time.MonthDay;importjava.time.OffsetDateTime;importjava.time.ZoneOffset;importjava.time.Period;importjava.time.YearMonth;importjava.time.ZoneId;importjava.time.ZonedDateTime;importjava.time.format.DateTimeFormatter;importjava.time.temporal.ChronoUnit;importjava.util.Date;publicclassDateTest{//获取今天的日期publicvoidgetCurrentDate(){LocalDatetoday=LocalDate.now();System.out.println("Today"sLocaldate:"+today);//这个是作为对比Datedate=newDate();System.out.println(date);}//获取年、月、日信息publicvoidgetDetailDate(){LocalDatetoday=LocalDate.now();intyear=today.getYear();intmonth=today.getMonthValue();intday=today.getDayOfMonth();System.out.printf("Year:%dMonth:%dday:%dt%n",year,month,day);}//处理特定日期publicvoidhandleSpecilDate(){LocalDatedateOfBirth=LocalDate.of(2018,01,21);System.out.println("Thespecildateis:"+dateOfBirth);}//判断两个日期是否相等publicvoidcompareDate(){LocalDatetoday=LocalDate.now();LocalDatedate1=LocalDate.of(2018,01,21);if(date1.equals(today)){System.out.printf("TODAY%sandDATE1%saresamedate%n",today,date1);}}//处理周期性的日期publicvoidcycleDate(){LocalDatetoday=LocalDate.now();LocalDatedateOfBirth=LocalDate.of(2018,01,21);MonthDaybirthday=MonthDay.of(dateOfBirth.getMonth(),dateOfBirth.getDayOfMonth());MonthDaycurrentMonthDay=MonthDay.from(today);if(currentMonthDay.equals(birthday)){System.out.println("ManyManyhappyreturnsoftheday!!");}else{System.out.println("Sorry,todayisnotyourbirthday");}}//获取当前时间publicvoidgetCurrentTime(){LocalTimetime=LocalTime.now();System.out.println("localtimenow:"+time);}//增加小时publicvoidplusHours(){LocalTimetime=LocalTime.now();LocalTimenewTime=time.plusHours(2);//增加两小时System.out.println("Timeafter2hours:"+newTime);}//如何计算一周后的日期publicvoidnextWeek(){LocalDatetoday=LocalDate.now();LocalDatenextWeek=today.plus(1,ChronoUnit.WEEKS);System.out.println("Todayis:"+today);System.out.println("Dateafter1week:"+nextWeek);}//计算一年前或一年后的日期publicvoidminusDate(){LocalDatetoday=LocalDate.now();LocalDatepreviousYear=today.minus(1,ChronoUnit.YEARS);System.out.println("Datebefore1year:"+previousYear);LocalDatenextYear=today.plus(1,ChronoUnit.YEARS);System.out.println("Dateafter1year:"+nextYear);}publicvoidclock(){//根据系统时间返回当前时间并设置为UTC。Clockclock=Clock.systemUTC();System.out.println("Clock:"+clock);//根据系统时钟区域返回时间ClockdefaultClock=Clock.systemDefaultZone();System.out.println("Clock:"+clock);}//如何用Java判断日期是早于还是晚于另一个日期publicvoidisBeforeOrIsAfter(){LocalDatetoday=LocalDate.now();LocalDatetomorrow=LocalDate.of(2018,1,29);if(tomorrow.isAfter(today)){System.out.println("Tomorrowcomesaftertoday");}LocalDateyesterday=today.minus(1,ChronoUnit.DAYS);if(yesterday.isBefore(today)){System.out.println("Yesterdayisdaybeforetoday");}}//时区处理publicvoidgetZoneTime(){//设置时区ZoneIdamerica=ZoneId.of("America/New_York");LocalDateTimelocaltDateAndTime=LocalDateTime.now();ZonedDateTimedateAndTimeInNewYork=ZonedDateTime.of(localtDateAndTime,america);System.out.println("现在的日期和时间在特定的时区:"+dateAndTimeInNewYork);}//使用YearMonth类处理特定的日期publicvoidcheckCardExpiry(){YearMonthcurrentYearMonth=YearMonth.now();System.out.printf("Daysinmonthyear%s:%d%n",currentYearMonth,currentYearMonth.lengthOfMonth());YearMonthcreditCardExpiry=YearMonth.of(2028,Month.FEBRUARY);System.out.printf("Yourcreditcardexpireson%s%n",creditCardExpiry);}//检查闰年publicvoidisLeapYear(){LocalDatetoday=LocalDate.now();if(today.isLeapYear()){System.out.println("ThisyearisLeapyear");}else{System.out.println("2018isnotaLeapyear");}}//计算两个日期之间的天数和月数publicvoidcalcDateDays(){LocalDatetoday=LocalDate.now();LocalDatejava8Release=LocalDate.of(2018,Month.MAY,14);PeriodperiodToNextJavaRelease=Period.between(today,java8Release);System.out.println("MonthsleftbetweentodayandJava8release:"+periodToNextJavaRelease.getMonths());}//包含时差信息的日期和时间publicvoidZoneOffset(){LocalDateTimedatetime=LocalDateTime.of(2018,Month.FEBRUARY,14,19,30);ZoneOffsetoffset=ZoneOffset.of("+05:30");OffsetDateTimedate=OffsetDateTime.of(datetime,offset);System.out.println("DateandTimewithtimezoneoffsetinJava:"+date);}//获取时间戳publicvoidgetTimestamp(){Instanttimestamp=Instant.now();System.out.println("Whatisvalueofthisinstant"+timestamp);}//使用预定义的格式化工具去解析或格式化日期publicvoidformateDate(){StringdayAfterTommorrow="20180210";LocalDateformatted=LocalDate.parse(dayAfterTommorrow,DateTimeFormatter.BASIC_ISO_DATE);System.out.printf("DategeneratedfromString%sis%s%n",dayAfterTommorrow,formatted);}publicstaticvoidmain(String[]args){DateTestdt=newDateTest();dt.formateDate();}}