澳门新浦京娱乐游戏转:跟上Java8 – 日期和时间实用技巧

澳门新浦京娱乐游戏 1

本文由码农网 –
栗子蜀黍原创翻译,转发请看清文末的转发必要,款待参加大家的付费投稿布置!

当你从头利用Java操作日期和岁月的时候,会有局地繁重。你只怕会通过System.currentTimeMillis()澳门新浦京娱乐游戏 ,来回到1969年1月1日到前日的毫秒数。大概应用Date类来操作日期;当蒙受加减月份、天数的时候
你又要求使用Calendar类;当须求格式化日期的时候要求运用java.text.DateFormat类。
总之在Java中操作日期不是很有益,以致于相当多开拓者不能不选择第三方库,例如:
joda-time

那篇著作首即便java第88中学新的Date和Time
API的实战。新的Date和Time类是java开辟者社区呼天喊地始出来的。Java8
早前存在的Date类向来都受人指斥,超多个人都会筛选使用第三方的date库joda-time。Java第88中学的date和time
api是jodatime的编辑者加入开荒的,完毕了JS大切诺基310的全体内容。那些新的api都在包java.time下。

澳门新浦京娱乐游戏 1

既是第三方的joda-time,date4j都已够用苍劲了,为何java8还要再度完结他吧,一部分的因由是那么些第三方的库是存在宽容难点的,比方规范的JSF日期转变器与joda-time
api,就不相配,每趟使用都须要编写制定本人的调换器,所以标准化api是必得的,就有了JSEscort310,java第88中学就落到实处了她整整的明确内容。

现存API存在的主题素材
  • 线程安全:
    Date和Calendar不是线程安全的,你需求编写制定额外的代码管理线程安全难点

  • API设计和易用性:
    由于Date和Calendar的宏图不当你无法到位平时的日期操作

  • ZonedDate和Time: 你不得不编写制定额外的逻辑管理时区和那个旧的逻辑

还好JSLX570 310业内中为Java8加多了新的API,
在java.time包中,新的API改革了过去的短处,

新Date类和Time类背后的设计标准:

不行变类

java8事情未发生前,Date类都是可变类。当我们在四线程情形下接受它,编制程序人士应该肯定Date对象的线程安全。Java8的Date和Time
API提供了线程安全的不得变类。编制程序职员不用寻思并发的主题素材。

领域模型驱动设计艺术

新的日期和时间的门类遵守“域驱动设计”。对于开荒者来讲,精晓方法和类的功能是超级轻松的。

新的日期API
  • ZoneId: 时区ID,用来分明Instant和LocalDateTime互相调换的法规

  • Instant: 用来表示时间线上的一个点

  • LocalDate: 表示不曾时区的日期, LocalDate是不可变并且线程安全的

  • LocalTime: 表示尚无时区的日子, LocalTime是不可变并且线程安全的

  • LocalDateTime: 表示不曾时区的日马时间,
    LocalDateTime是不可变而且线程安全的

  • Clock: 用于访谈当前时时、日期、时间,用届期区

  • Duration: 用秒和纳秒表示时间的数据

最常用的就是LocalDate、LocalTime、LocalDateTime了,从它们的名字就足以看来是操作日期
和岁月的。这么些类是根本用以这个时候区没有必要显式地钦定的上下文。在本章节中我们将研讨最常用的api。

接下去让大家来会见新Date和Time API:

java.time.LocalDate:

LocalDate只提供日期不提供时间新闻。它是不足变类且线程安全的。

package org.smarttechie;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
/**
* This class demonstrates JAVA 8 data and time API
* @author Siva Prasad Rao Janapati
* */
public class DateTimeDemonstration {
/**
* @param args
*/
public static void main(String[] args) {
   //Create date LocalDate localDate = LocalDate.now();
    System.out.println("The local date is :: " + localDate); 
   //Find the length of the month. That is, how many days are there for this month.
   System.out.println("The number of days available for this month:: " + localDate.lengthOfMonth()); 
   //Know the month name
   System.out.println("What is the month name? :: " + localDate.getMonth().name()); 
   //add 2 days to the today's date.
   System.out.println(localDate.plus(2, ChronoUnit.DAYS)); 
   //substract 2 days from today
   System.out.println(localDate.minus(2, ChronoUnit.DAYS)); 
   //Convert the string to date
   System.out.println(localDate.parse("2017-04-07"));
  }
}

java.time.LocalTime:

LocalTime只提供时间而不提供日期音信,它是不可变类且线程安全的。

package org.smarttechie;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
/**
* This class demonstrates JAVA 8 data and time API
* @author Siva Prasad Rao Janapati
* */
public class DateTimeDemonstration {
/**
* @param args
*/
public static void main(String[] args) {
   //Get local time
   LocalTime localTime = LocalTime.now();
   System.out.println(localTime);
  //Get the hour of the day
  System.out.println("The hour of the day:: " + localTime.getHour());
  //add 2 hours to the time.
  System.out.println(localTime.plus(2, ChronoUnit.HOURS));
  //add 6 minutes to the time.
  System.out.println(localTime.plusMinutes(6));
  //substract 2 hours from current time
  System.out.println(localTime.minus(2, ChronoUnit.HOURS));
 }
}

java.time.LocalDateTime:

LocalDateTime提供时间和日期的新闻,它是不行变类且线程安全的

package orr.smarttechie;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
/**
* This class demonstrates JAVA 8 data and time API
* @author Siva Prasad Rao Janapati
*
*/
public class DateTimeDemonstration {
/**
* @param args
*/
public static void main(String[] args) {
    //Get LocalDateTime object
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println(localDateTime);
    //Find the length of month. That is, how many days are there for this month.
    System.out.println("The number of days available for this month:: " + localDateTime.getMonth().length(true));
    //Know the month name
    System.out.println("What is the month name? :: " + localDateTime.getMonth().name());
    //add 2 days to today's date.
    System.out.println(localDateTime.plus(2, ChronoUnit.DAYS));
    //substract 2 days from today
    System.out.println(localDateTime.minus(2, ChronoUnit.DAYS));
  }
}

java.time.Year:

Year提供年的音讯,它是不行变类且线程安全的。

package orr.smarttechie;
import java.time.Year;
import java.time.temporal.ChronoUnit;
/**
* This class demonstrates JAVA 8 data and time API
* @author Siva Prasad Rao Janapati
*
*/
public class DateTimeDemonstration {
/**
* @param args
*/
public static void main(String[] args) {
   //Get year
   Year year = Year.now();
   System.out.println("Year ::" + year);
   //know the year is leap year or not
   System.out.println("Is year[" +year+"] leap year?"+ year.isLeap());
  }
}

java.time.Duration:

Duration是用来估测计算多个给定的日期之间含有多少秒,多少纳秒,它是不可变类且线程安全的

java.time.Period:

Period是用来计量三个给定的日期之间含有多少天,多少月恐怕有个别年,它是不可变类且线程安全的

package orr.smarttechie;
import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;
/**
* This class demonstrates JAVA 8 data and time API
* @author Siva Prasad Rao Janapati
*
*/
public class DateTimeDemonstration {
/**
* @param args
*/
public static void main(String[] args) {
   LocalDate localDate = LocalDate.now();
   Period period = Period.between(localDate, localDate.plus(2, ChronoUnit.DAYS));
   System.out.println(period.getDays());
  }
}
LocalDate

LocalDate代表贰个IOS格式(yyyy-MM-dd卡塔尔国的日子,能够积累生辰、回看日等日子。 获取当前的日子:

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

localDate: 2017-07-20

LocalDate可以钦赐特定的日期,调用of或parse方法再次来到该实例:

LocalDate.of(2017, 07, 20);
LocalDate.parse("2017-07-20");

自然它还会有一对此外格局,我们一道来探视:

为即日加多一天,也等于获得后日

LocalDate tomorrow = LocalDate.now().plusDays(1);

从今天减去一个月

LocalDate prevMonth = LocalDate.now().minus(1, ChronoUnit.MONTHS);

上边写八个例证,分别深入深入分析日期 2017-07-20,获取周周中的星期和每月初的日

DayOfWeek thursday = LocalDate.parse("2017-07-20").getDayOfWeek();
System.out.println("周四: " + thursday);
int twenty = LocalDate.parse("2017-07-20").getDayOfMonth();
System.out.println("twenty: " + twenty);

推行二零一七年是还是不是闰年

boolean leapYear = LocalDate.now().isLeapYear();
System.out.println("是否闰年: " + leapYear);

判断是还是不是在日期在此之前或今后

boolean notBefore = LocalDate.parse("2017-07-20")
                .isBefore(LocalDate.parse("2017-07-22"));
System.out.println("notBefore: " + notBefore);
boolean isAfter = LocalDate.parse("2017-07-20").isAfter(LocalDate.parse("2017-07-22"));
System.out.println("isAfter: " + isAfter);

获取上个月的率后天:

LocalDate firstDayOfMonth = LocalDate.parse("2017-07-20")
                .with(TemporalAdjusters.firstDayOfMonth());
System.out.println("这个月的第一天: " + firstDayOfMonth);
firstDayOfMonth = firstDayOfMonth.withDayOfMonth(1);
System.out.println("这个月的第一天: " + firstDayOfMonth);

认清几近年来是不是是作者的寿辰,比方笔者的生日是 二〇〇八-07-20

LocalDate birthday = LocalDate.of(2009, 07, 20);
MonthDay birthdayMd = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());
MonthDay today = MonthDay.from(LocalDate.now());
System.out.println("今天是否是我的生日: " + today.equals(birthdayMd));
LocalTime

LocalTime表示多个时辰,而不是日期,上边介绍一下它的施用方法。

赢得以后的时光,输出15:01:22.144

LocalTime now = LocalTime.now();
System.out.println("现在的时间: " + now);

将贰个字符串时间深入分析为LocalTime,输出15:02

LocalTime nowTime = LocalTime.parse("15:02");
System.out.println("时间是: " + nowTime);

运用静态方法of成立一个时间

LocalTime nowTime = LocalTime.of(15, 02);
System.out.println("时间是: " + nowTime);

选拔深入解析字符串的点子并增添半个小时,输出16:02

LocalTime nextHour = LocalTime.parse("15:02").plus(1, ChronoUnit.HOURS);
System.out.println("下一个小时: " + nextHour);

获得时间的钟点、分钟

int hour = LocalTime.parse("15:02").getHour();
System.out.println("小时: " + hour);
int minute = LocalTime.parse("15:02").getMinute();
System.out.println("分钟: " + minute);

大家也足以透过事情发生前近似的API检查四个时间是还是不是在另二个时刻在此以前、之后

boolean isBefore = LocalTime.parse("15:02").isBefore(LocalTime.parse("16:02"));
boolean isAfter = LocalTime.parse("15:02").isAfter(LocalTime.parse("16:02"));
System.out.println("isBefore: " + isBefore);
System.out.println("isAfter: " + isAfter);

输出 isBefore: true, isAfter: false。

在LocalTime类中也将每一日的先导和得了作为常量供大家选取:

System.out.println(LocalTime.MAX);
System.out.println(LocalTime.MIN);

输出:
23:59:59.999999999
00:00

LocalTime就那一个了,下边大家来理解一下LocalDateTime。

LocalDateTime

LocalDateTime是用来表示日期和时间的,那是四个最常用的类之一。

赢稳当前的日期和时间:

LocalDateTime now = LocalDateTime.now();
System.out.println("现在: " + now);

输出
现在: 2017-07-20T15:17:19.926

上边选取静态方法和字符串的章程分别创设LocalDate提姆e对象

LocalDateTime.of(2017, Month.JULY, 20, 15, 18);
LocalDateTime.parse("2017-07-20T15:18:00");

同时LocalDateTime也提供了有关API来对日期和时间开展增减操作:

LocalDateTime tomorrow = now.plusDays(1);
System.out.println("明天的这个时间: " + tomorrow);
LocalDateTime minusTowHour = now.minusHours(2);
System.out.println("两小时前: " + minusTowHour);

本条类也提供一文山会海的get方法来获得特定单位:

Month month = now.getMonth();
System.out.println("当前月份: " + month);
日期格式化

在常常开支中大家用到最多的只怕正是日期、时间的格式化了,那在Java8种该怎么操作呢?

LocalDateTime now = LocalDateTime.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println("默认格式化: " + now);
System.out.println("自定义格式化: " + now.format(dateTimeFormatter));
LocalDateTime localDateTime = LocalDateTime.parse("2017-07-20 15:27:44", dateTimeFormatter);
System.out.println("字符串转LocalDateTime: " + localDateTime);

也得以接受DateTimeFormatter的format方法将日期、时间格式化为字符串

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String dateString = dateTimeFormatter.format(LocalDate.now());
System.out.println("日期转字符串: " + dateString);
日期周期

Period类用于改进给定日期或获得的多少个日子之间的不一致。

给初叶化的日子增多5天:

LocalDate initialDate = LocalDate.parse("2017-07-20");
LocalDate finalDate = initialDate.plus(Period.ofDays(5));
System.out.println("初始化日期: " + initialDate);
System.out.println("加日期之后: " + finalDate);

周期API中提须求大家能够比较四个日子的异样,像下边那样获取差别天数:

long between = ChronoUnit.DAYS.between(initialDate, finalDate);
System.out.println("差距天数: " + between);

地方的代码会回到5,当然你想博得多个日子相差多少时辰也是简约的。

与遗留代码转换

在事情发生早先的代码中你大概现身了大气的Date类,怎么样将它转变为Java8种的时光类呢?

Date和Instant相互转变

Date date = Date.from(Instant.now());
Instant instant = date.toInstant();

Date转换为LocalDateTime

LocalDateTime localDateTime = LocalDateTime.from(new Date());
System.out.println(localDateTime);

LocalDateTime转Date

Date date =
Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

LocalDate转Date

Date date =
Date.from(LocalDate.now().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());

转载自伯爵的技巧博客
原版的书文链接地址:http://biezhi.me/2017/07/20/keep-up-with-java8-datetime.html

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图