Java8中的时间和日期

来源:互联网 发布:人工智能在线观看土豆 编辑:程序博客网 时间:2024/06/07 07:26

                  

Java8中一项即将出炉的最另人兴奋的特征就是一个被重新定义名为JSR-310的时间和日期的类库。它也是我贡献过代码并且努力去鼓励很多开发者给与反馈信息的一个项目。13项最流行的第三方类库被                                                   。这是一系列关于JSR-310的介绍文章中的首篇,描述了其中一些关键概念和类。未来我打算覆盖Timezones,Non-ISO日期系统并且教会你怎么使用JSR-310在你的应用程序中。

核心思想:

不可改变值得类:java已经存在的格式化的一个最大的弱点是它们不是线程安全的。

这个特征谋杀了开发者在线程安全条件使用这些类,并且在它们日复一日开发中思考并发问题。JSR-310避免了这一问题通过确保它的所有核心类是不可改变的并且显示出已经定义好的值。

设计驱动域:JSR-310模型使它的作用域非常精确,并且类呈现不同的使用情况当他们使用时间和日期相关时,这项改变有别于以前相当简单的java类库在那些指标上。例如java.Util.Date呈现了一个精确到毫秒级别的已经包装好的时间栏自从unix时代,但是当你想调用"toString()"方法时结果显示出它有一个时区,这给开发者们带来了很大的困惑。

ISOvsChrono -JSR-310有一个类库允许开发者工作在不同的时间系统上来支持全球地区使用者的需求。例如日本或者泰国,这就使我们不必每时每刻都要遵循ISO-8061的标准。它使开发变得更高效,然而,大部分的使用者的只是需要在ISO模式下工作需要,这就使得开发者去开发代码使它不必处理在某些角落某些情况例如一年中有两个相同的日期。Java.Util.Calendar模块的时间和日期使用了一个单一父类,并且不能完全解决并呈现它们需求的类库。这就导致了大部分开发者在未完全理解日期类完全应用的选择情况下就使用。

本地时间和本地日期:

你第一个可能遭遇当你使用threeten类是本地时间和本地日期--这种模型下只包含纯数据和时间在ISO本地时区日期系统。当观察者重背景上查看显示的时间和日期会使他们感觉是本地时间。

 

 

 

 

当然这里也有一个相反的类被称为LocalDateTime,它包含了本地日期和本地时间。你也许想知道为什么有三个类来支持它,又或者不是单一一个类来呈现前面三个本地值。Matin Fowler对此概念做出了详尽的解释。

工厂类:

所有在Threeten的核心类库被流利的工厂方法构造出来。当构造出

 

 

// The current date and timeLocalDateTime.now();

// construct from valuesLocalDate.of(2012, 12, 12);LocalDate.of(2012, Month.DECEMBER, 12);

// Somewhere in the middle of 1970LocalDate.ofEpochDay(150);

// the train I took home todayLocalTime.of(17, 18);

// From a StringLocalTime.parse("10:15:30");

实例访问:

Java标准变得规范当他们通过JSR-310类来获取值得时候。

LocalDateTime timePoint = ...

LocalDate theDate = timePoint.getDate();

int monthAsInt = timePoint.getMonthValue();Month month = timePoint.getMonth();

int day = timePoint.getDayOfMonth();    day = timePoint.getDayOfYear();

timePoint.getSecond();timePoint.getNano();

调整:

你也可以为了表现的更精确而改变对象的值。尽管JSR-310的大部分核心类是不可改变的他们被调用也是返回新的对象,而不是被用来改变。这里也有方法是为了精确在不同的领域。

LocalDateTime timePoint = ...

// Set the value, returning a new objectLocalDateTime another = timePoint.withDayOfMonth(10).withYear(2010);

// You can use direct manipulation methods, or pass a value and field pairLocalDateTime yetAnother = another.plusWeeks(3).plus(3, WEEKS);

JSR-310也有调节器的概念,它是用作包含共同进程逻辑的代码块。你可以写下被用作设置一块或者更多的作用域的“withAdjuster”,或者写下被用作增加一些抽象域的“PlusAdjuster”。

值类也可以被当做调整器当他们更新他们作用域中他们代表的值得时候。他们被JSR-310定义在adjusters里面,但是你也可以写下你自己的adjusters如果你有特殊的事物逻辑当你希望营造的时候。

import static javax.time.calendrical.DateTimeAdjusters.*;

LocalDateTime timePoint = ...

// Statically imported (see above)foo = timePoint.with(lastDayOfMonth());bar = timePoint.with(firstDayOfYear());

// Adjusters can also be parameterisedtimePoint.with(lastInMonth(TUESDAY));timePoint.with(previousOrSame(WEDNESDAY));

// Using value classes as adjusterstimePoint.with(LocalTime.now());

抛弃:

JSR-310尝试着去支持不同精度的时间通过提供多种多样呈现日期,时间,日期或者时间的代表方法,但是显而易见的是国家的精度比它更好或者。truncateTo方法的存在就是为了支持上述情况,并且允许你将值截短为域。

LocalDate date = ...date.truncatedTo(DAYS);

LocalTime time = ...time.truncatedTo(MICROS);time.truncatedTo(SECONDS);

数据库:

ANSI SQL数据库定义了一系列种类关于日期和时间。SQL DATE代表着回应本地日期,而TIME则代表着回应本地时间,而TIMESTAMP则回应本地日期和时间。

总结:

希望上面的介绍能够被轻松的接受,在第二部分中我将要介绍关于时区和方法。

0 0