热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

newdatejava_Java8NewDate/TimeAPI

Java8-NewDateTimeAPI使用Java8,引入了一个新的Date-TimeAPI来解决旧的日期时间API的以下缺点-线程不安全-java.util.Da

Java 8 - New Date/Time API

使用Java 8,引入了一个新的Date-Time API来解决旧的日期时间API的以下缺点 -

6958ca4b1fad

线程不安全 - java.util.Date不是线程安全的,因此开发人员必须在使用日期时处理并发问题。新的日期时间API是不可变的,没有setter方法。

设计差 - 默认日期从1900开始,月份从1开始,日期从0开始,所以没有一致性。旧的API对日期操作的方法较少。新的API为此类操作提供了许多实用方法。

困难的时区处理 - 开发人员不得不编写大量代码来处理时区问题。新的API已经开发出了保持领域特定的设计。

Java 8在java.time包下引入了一个新的日期时间API 。以下是java.time包中介绍的一些重要类 -

本地 - 简化的日期时间API,没有时区处理的复杂性。

分区 - 处理各种时区的专用日期API。

本地日期时间API

LocalDate / LocalTime和LocalDateTime类简化了不需要时区的开发。让我们看看他们在行动 -

Java8Tester.java

import java.time.LocalDate;

import java.time.LocalTime;

import java.time.LocalDateTime;

import java.time.Month;

public class Java8Tester {

public static void main(String args[]){

Java8Tester java8tester = new Java8Tester();

java8tester.testLocalDateTime();

}

public void testLocalDateTime(){

// Get the current date and time

LocalDateTime currentTime = LocalDateTime.now();

System.out.println("Current DateTime: " + currentTime);

LocalDate date1 = currentTime.toLocalDate();

System.out.println("date1: " + date1);

Month month = currentTime.getMonth();

int day = currentTime.getDayOfMonth();

int seconds = currentTime.getSecond();

System.out.println("Month: " + month +"day: " + day +"seconds: " + seconds);

LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);

System.out.println("date2: " + date2);

//12 december 2014

LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);

System.out.println("date3: " + date3);

//22 hour 15 minutes

LocalTime date4 = LocalTime.of(22, 15);

System.out.println("date4: " + date4);

//parse a string

LocalTime date5 = LocalTime.parse("20:15:30");

System.out.println("date5: " + date5);

}

}

验证结果

使用javac编译器编译类,如下所示:

$javac Java8Tester.java

现在运行Java8Tester如下 -

$java Java8Tester

它应该产生以下输出 -

Current DateTime: 2014-12-09T11:00:45.457

date1: 2014-12-09

Month: DECEMBERday: 9seconds: 45

date2: 2012-12-10T11:00:45.457

date3: 2014-12-12

date4: 22:15

date5: 20:15:30

分区日期时间API

在考虑时区时使用分区日期时间API。让我们看看他们在行动 -

Java8Tester.java

import java.time.ZonedDateTime;

import java.time.ZoneId;

public class Java8Tester {

public static void main(String args[]){

Java8Tester java8tester = new Java8Tester();

java8tester.testZonedDateTime();

}

public void testZonedDateTime(){

// Get the current date and time

ZonedDateTime date1 = ZonedDateTime.parse("2007-12-03T10:15:30+05:30[Asia/Karachi]");

System.out.println("date1: " + date1);

ZoneId id = ZoneId.of("Europe/Paris");

System.out.println("ZoneId: " + id);

ZoneId currentZone = ZoneId.systemDefault();

System.out.println("CurrentZone: " + currentZone);

}

}

验证结果

使用javac编译器编译类,如下所示:

$javac Java8Tester.java

现在运行Java8Tester如下 -

$java Java8Tester

它应该产生以下输出 -

date1: 2007-12-03T10:15:30+05:00[Asia/Karachi]

ZoneId: Europe/Paris

CurrentZone: Etc/UTC

计时单位枚举

java.time.temporal.ChronoUnit枚举在Java 8中添加,以替换旧API中使用的整数值来表示日,月等。让我们看看它们在行动中 -

Java8Tester.java

import java.time.LocalDate;

import java.time.temporal.ChronoUnit;

public class Java8Tester {

public static void main(String args[]){

Java8Tester java8tester = new Java8Tester();

java8tester.testChromoUnits();

}

public void testChromoUnits(){

//Get the current date

LocalDate today = LocalDate.now();

System.out.println("Current date: " + today);

//add 1 week to the current date

LocalDate nextWeek = today.plus(1, ChronoUnit.WEEKS);

System.out.println("Next week: " + nextWeek);

//add 1 month to the current date

LocalDate nextMonth = today.plus(1, ChronoUnit.MONTHS);

System.out.println("Next month: " + nextMonth);

//add 1 year to the current date

LocalDate nextYear = today.plus(1, ChronoUnit.YEARS);

System.out.println("Next year: " + nextYear);

//add 10 years to the current date

LocalDate nextDecade = today.plus(1, ChronoUnit.DECADES);

System.out.println("Date after ten year: " + nextDecade);

}

}

验证结果

使用javac编译器编译类,如下所示:

$javac Java8Tester.java

现在运行Java8Tester如下 -

$java Java8Tester

应该产生以下结果 -

Current date: 2014-12-10

Next week: 2014-12-17

Next month: 2015-01-10

Next year: 2015-12-10

Date after ten year: 2024-12-10

期间与期限

使用Java 8,引入了两个专门的课程来处理时间差异 -

期间 - 它处理基于日期的时间量。

持续时间 - 它处理时间的时间量

让我们以一个例子来理解他们 -

Java8Tester.java

import java.time.temporal.ChronoUnit;

import java.time.LocalDate;

import java.time.LocalTime;

import java.time.Duration;

import java.time.Period;

public class Java8Tester {

public static void main(String args[]){

Java8Tester java8tester = new Java8Tester();

java8tester.testPeriod();

java8tester.testDuration();

}

public void testPeriod(){

//Get the current date

LocalDate date1 = LocalDate.now();

System.out.println("Current date: " + date1);

//add 1 month to the current date

LocalDate date2 = date1.plus(1, ChronoUnit.MONTHS);

System.out.println("Next month: " + date2);

Period period = Period.between(date2, date1);

System.out.println("Period: " + period);

}

public void testDuration(){

LocalTime time1 = LocalTime.now();

Duration twoHours = Duration.ofHours(2);

LocalTime time2 = time1.plus(twoHours);

Duration duration = Duration.between(time1, time2);

System.out.println("Duration: " + duration);

}

}

验证结果

使用javac编译器编译类,如下所示:

$javac Java8Tester.java

现在运行Java8Tester如下 -

$java Java8Tester

它应该产生以下输出 -

Current date: 2014-12-10

Next month: 2015-01-10

Period: P-1M

Duration: PT2H

时间调整器

TemporalAdjuster用于执行日期数学。例如,获得“本月第二个星期六”或“下周二”。让我们看一个例子 -

Java8Tester.java

import java.time.LocalDate;

import java.time.temporal.TemporalAdjusters;

import java.time.DayOfWeek;

public class Java8Tester {

public static void main(String args[]){

Java8Tester java8tester = new Java8Tester();

java8tester.testAdjusters();

}

public void testAdjusters(){

//Get the current date

LocalDate date1 = LocalDate.now();

System.out.println("Current date: " + date1);

//get the next tuesday

LocalDate nextTuesday = date1.with(TemporalAdjusters.next(DayOfWeek.TUESDAY));

System.out.println("Next Tuesday on : " + nextTuesday);

//get the second saturday of next month

LocalDate firstInYear = LocalDate.of(date1.getYear(),date1.getMonth(), 1);

LocalDate secondSaturday = firstInYear.with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY)).with(TemporalAdjusters.next(DayOfWeek.SATURDAY));

System.out.println("Second Saturday on : " + secondSaturday);

}

}

验证结果

使用javac编译器编译类,如下所示:

$javac Java8Tester.java

现在运行Java8Tester如下 -

$java Java8Tester

应该产生以下结果 -

Current date: 2014-12-10

Next Tuesday on : 2014-12-16

Second Saturday on : 2014-12-13

向后兼容性

将一个toInstant()方法添加到原始的Date和Calendar对象中,可以将它们转换为新的Date-Time API。使用一个Instant(Insant,ZoneId)方法来获取一个LocalDateTime或ZonedDateTime对象。让我们以一个例子来理解它 -

Java8Tester.java

import java.time.LocalDateTime;

import java.time.ZonedDateTime;

import java.util.Date;

import java.time.Instant;

import java.time.ZoneId;

public class Java8Tester {

public static void main(String args[]){

Java8Tester java8tester = new Java8Tester();

java8tester.testBackwardCompatability();

}

public void testBackwardCompatability(){

//Get the current date

Date currentDate = new Date();

System.out.println("Current date: " + currentDate);

//Get the instant of current date in terms of milliseconds

Instant now = currentDate.toInstant();

ZoneId currentZone = ZoneId.systemDefault();

LocalDateTime localDateTime = LocalDateTime.ofInstant(now, currentZone);

System.out.println("Local date: " + localDateTime);

ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(now, currentZone);

System.out.println("Zoned date: " + zonedDateTime);

}

}

验证结果

使用javac编译器编译类,如下所示:

$javac Java8Tester.java

现在运行Java8Tester如下 -

$java Java8Tester

它应该产生以下输出 -

Current date: Wed Dec 10 05:44:06 UTC 2014

Local date: 2014-12-10T05:44:06.635

Zoned date: 2014-12-10T05:44:06.635Z[Etc/UTC]



推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
author-avatar
无心伤害2502907297
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有