JAVA8-时间日期API

java8之前用过的时间日期类。

Date

Calendar

SimpleDateFormat

有很多致命的问题。

1.没有时区概念

2.计算麻烦,实现困难

3.类是可变的,线程不安全

之前都是用的这个公认的第三方插件来操作:JodaTime

认识一下Joda

http://joda.org/

  • Joda-Time 时间的转换

  • Joda-Money 钱币类型的转换

  • Joda-Beans JavaBean的转换

  • Joda-Convert 类型的转换

  • Joda-Collect 集合的操作

  • Joda-Primitive 针对于原生类型的集合

了解JAVA8的时间插件的背景-Joda-Time。

Joda - time

public boolean isAfterPayDay(DateTime datetime) {
if (datetime.getMonthOfYear() == 2) { // February is month 2!!
return datetime.getDayOfMonth() > 26;
}
return datetime.getDayOfMonth() > 28;
}

... 自行查阅官网吧:http://joda.org/

关于日期与时间:

  1. 格林威治标准时间(全球时间的基准)

  2. UTC时间(不带时区的标准时间) : 2010-12-1T11:22:33.567Z+8:00

  3. ISO8601

  4. 网络时区的概念(自行Google)

Joda-Time的学习

demo入门- 用起来简单,功能强大。(相对于原生API )

package com.dawa.jdk8.joda;

import org.joda.time.DateTime;
import org.joda.time.LocalDate; public class JodaTimeTest {
public static void main(String[] args) {
//java.util.time , 原来的时间对象是可变的. - 线程不安全
//使用joda提供的DateTime
DateTime today = new DateTime();
DateTime tomorrow = today.plusDays(3); // 当前日期加三天 System.out.println(today.toString("yyyy-MM-dd"));
System.out.println(tomorrow.toString("yyyy-MM-dd")); System.out.println("------");
//修改月中的天
DateTime time = today.withDayOfMonth(1); //当前时区的时间
LocalDate localDate = new LocalDate();
System.out.println(localDate);
System.out.println("------"); //获取某个时间的某个月的最大的一天.
LocalDate localDate1 = localDate.plusMonths(3);//当前日期加三个月
System.out.println(localDate1);
System.out.println("------");
LocalDate.Property property = localDate1.dayOfMonth();
System.out.println(property);
LocalDate localDate2 = property.withMaximumValue();//这个月的最大天数
System.out.println(localDate2);
System.out.println("------"); //计算两年前的第三月最后一天的日期
DateTime dateTime = new DateTime();
DateTime dateTime1 = dateTime.minusYears(2).
monthOfYear().setCopy(3).
dayOfMonth().withMaximumValue();
System.out.println(dateTime1);
}
}

查阅API会用,能满足你的功能性需求就OK了。

Java Date 和 joda Time 是可以相互转换的。

新的demo-通过简单的Demo对其有一个新的认识。


public class JodaTimeTest3 {
//标准UTC的时间: 2014-11-04-T09:22:52
//给定一个UTC标准时间的字符串,转换成Date类型
//由服务器来决定时间
public static Date convertUTC2Date(String utcDate){
try {
DateTime parse = DateTime.parse(utcDate, DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"));
return parse.toDate();
} catch (Exception e) {
return null;
}
} //传输的时候,使用绝对的UTC格式时间字符串. 由客户端决定如何呈现.
//客户在哪个时区,时间就是哪个时区的时间.
public static String convertDate2UTC(Date javaDate) {
DateTime dateTime = new DateTime(javaDate, DateTimeZone.UTC);
return dateTime.toString();
} public static String covertDate2LocalByDateFormat(Date date, String dateFormat) {
DateTime dateTime = new DateTime(date);
return dateTime.toString(dateFormat);
} //所以:用标准的UTC时间来存储日期的话,是不会受时区影响的
public static void main(String[] args) {
System.out.println(JodaTimeTest3.convertUTC2Date("2019-11-04T09:22:54.876Z"));//结果会受影响
System.out.println(JodaTimeTest3.convertDate2UTC(new Date())); //返回标准的UTC时间.
System.out.println(JodaTimeTest3.covertDate2LocalByDateFormat(new Date(),"yyyy-MM-dd"));
}
}

JAVA8-新的时间日期API

Java8的所有的日期和API都是不可变的:确保线程的安全

之前的API对象,都是可变的:是线程不安全的

JAVA8-新日期API的简单使用

LocalDate

LocalTime

MonthDay

...

package com.dawa.jdk8.joda;

import java.time.*;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalUnit;
import java.util.Set;
import java.util.TreeSet; public class JavaTimeTest {
public static void main(String[] args) {
// 获取当前的本地时间.
LocalDate localDate = LocalDate.now();
localDate.getYear();//年
localDate.getMonth();// 月 英文形式
localDate.getMonthValue();//月 1-12
localDate.getDayOfMonth(); //得到当月的几号.
System.out.println("-------"); //LocalDate 直接使用数字构造.
LocalDate localDate1 = LocalDate.of(2019, 3, 3);
System.out.println(localDate1);
System.out.println("-------"); //月-天 (没有年的)
//使用场景:你只关注月和日. 如生日.等 去除年份,不考虑年份.
MonthDay monthDay = MonthDay.of(3, 24); //自定义构造
MonthDay monthDay1 = MonthDay.from(localDate1);//从时间中获取 //年-月 (没有日的)
YearMonth yearMonth = YearMonth.of(1990, 2);
System.out.println(yearMonth);
System.out.println(yearMonth.lengthOfMonth()); //月的长度是多少天
System.out.println(yearMonth.lengthOfYear()); //一年有多少天
System.out.println(yearMonth.isLeapYear());//是否是闰年 //localDate 关注年月日
//localTime 关注时分秒
LocalTime now = LocalTime.now();
now.plusHours(3); //增加小时
now.plusMinutes(30); //增加分钟
now.plusSeconds(30);//增加秒 System.out.println("-------");
localDate.plus(2, ChronoUnit.WEEKS); //增加时间的通用方法. System.out.println("-------");
localDate.minus(3, ChronoUnit.MONTHS); //减少时间的通用方法 System.out.println("-------");
Clock clock = Clock.systemDefaultZone(); //时刻
clock.millis();//毫秒数 System.out.println("---------");
//判断两个时间的关系. 之前还是之后,ect...
System.out.println(localDate.isAfter(localDate1));
System.out.println(localDate.isBefore(localDate1));
System.out.println(localDate.isEqual(localDate)); //关于时区的概念: ZoneId
Set<String> set = ZoneId.getAvailableZoneIds();
set.forEach(System.out::println); //列举出所有的时区的. 国家:名字
//按照顺序打印. 构造块.TreeSet的一个子类的构造块.
TreeSet<String> treeSet = new TreeSet<String>() {
{
addAll(set);
}
};
treeSet.forEach(System.out::println); //查看实现类的 底层的toString方法就知道了.
//关于时区的操作:Asia/Shanghai
ZoneId zoneId = ZoneId.of("Asia/Shanghai");
LocalDateTime localDateTime = LocalDateTime.now();
// ZonedDateTime from = ZonedDateTime.from(localDateTime);//带有时区的时间
// System.out.println(from); System.out.println("------");
//判断两个日期之间相隔的:年月日 (周期) Period类的应用.
LocalDate localDate2 = LocalDate.now();
LocalDate localDate3 = LocalDate.of(2018, 8, 4);
Period period = Period.between(localDate2, localDate3);
System.out.println(period.getYears());//相差的年
System.out.println(period.getMonths());//相差的月
System.out.println(period.getDays());//相差的天 // Instant类的使用 . UTC时间的呈现
System.out.println(Instant.now()); }
}

ChronoUnit 枚举(类型的类型)

        System.out.println("-------");
localDate.plus(2, ChronoUnit.WEEKS); //增加时间的通用方法. System.out.println("-------");
localDate.minus(3, ChronoUnit.MONTHS); //减少时间的通用方法

不用去管这个月多少天,多少周,只管去增加,减少就行了。

Clock类

System.out.println("-------");
Clock clock = Clock.systemDefaultZone(); //时刻
clock.millis();//毫秒数

Period类, 周期函数(判断两个时间的 年,月,日。)


如有需要自行查看JDK8提供的时间日期API。

JAVA8学习——总结与回顾

Lambda表达式

函数式接口

传递值&传递行为

函数式编程思想

方法引用

默认方法

收集器和比较器(Collectors&Comparators)

流的使用

流的底层运行原理

并行与串行

Optional类

时间API

函数式接口的使用

函数式接口出现的原因

方法引用和比较器(Collector)

基础的重要性(和业务没关系)

技术不是孤立的,兼容并包的一些心态。(万一你最初的想法就是错的呢)

需要学习和了解的还有很多


2020年01月08日16:25:21 JAVA8新特性课程学习结束。

JAVA8学习——新的时间日期API&Java8总结的更多相关文章

  1. Java 8 新的时间日期 API

    1. 概述 1.1 简介 Java 8 引入了一套全新的时间日期API,操作起来更简便.简单介绍下,LocalDate和LocalTime和LocalDateTime的使用: java.util.Da ...

  2. java8新特性——时间日期API

    传统的时间 API 存在线程安全的问题,在多线程开发中必须要上锁,所以 java8 现在为我们提供了一套全新的时间日期 API ,今天进来学习一下java8 的时间日期 API. 一.使用 Local ...

  3. Java8获取当前时间、新的时间日期类如Java8的LocalDate与Date相互转换、ZonedDateTime等常用操作包含多个使用示例、Java8时区ZoneId的使用方法、Java8时间字符串解析成类

     下面将依次介绍 Date转Java8时间类操作 ,Java8时间类LocalDate常用操作(如获得当前日期,两个日期相差多少天,下个星期的日期,下个月第一天等) 解析不同时间字符串成对应的Java ...

  4. Java8新特性时间日期库DateTime API及示例

    Java8新特性的功能已经更新了不少篇幅了,今天重点讲解时间日期库中DateTime相关处理.同样的,如果你现在依旧在项目中使用传统Date.Calendar和SimpleDateFormat等API ...

  5. java8新的时间日期库及使用示例

    转自:https://www.cnblogs.com/comeboo/p/5378922.html 来自:Java译站 链接:http://it.deepinmind.com/java/2015/03 ...

  6. Java 8新的时间日期库的20个使用示例

    原文链接 作者:Javin Paul 译者:之诸暇 除了lambda表达式,stream以及几个小的改进之外,Java 8还引入了一套全新的时间日期API,在本篇教程中我们将通过几个简单的任务示例来学 ...

  7. Java 8新的时间日期库,这二十个案例看完你还学不会算我的!!!

    Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的.看来Java已经意识到需要为时间及 ...

  8. Java8新特性(三)——Optional类、接口方法与新时间日期API

    一.Optional容器类 这是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. 查看结构图可以看到有如下常用方法: of(T)—— ...

  9. Java 8 的时间日期 API

    上一篇文章『Java 的时间日期 API』中,我们学习了由 Date.Calendar,DateFormat 等组成的「传统时间日期 API」,但是传统的处理接口设计并不是很友好,不易使用.终于,Ja ...

随机推荐

  1. 互联网医疗行业PEST分析实践

    前言 今年开始逐步切入产品与数据工作,完全脱离了原来的舒适区,确实有一些挑战.开始以为只做数仓建设的事情,就仓促的学习了一些数仓相关的知识,但没搞多久,还要负责公司BI的工作,又开始补习数分相关的知识 ...

  2. 【记录一个问题】golangci-lint.exe中,盘符大写就会执行出错

    golangci-lint.exe版本为1.31.0 执行:golangci-lint.exe run d:\source\github.com\ahfuzhang\go_xxx_server\src ...

  3. jQuery ajax get与post后台交互中的奥秘

    这两天在做关注功能模块(类似于Instagram).多处页面都需要通过一个"关注"按钮进行关注或者取消该好友的操作.一个页面对应的放一个按钮,进行操作.效率低维护性差.因此想通过j ...

  4. 函数的参数python教程

    一:函数 什么是函数? 函数就类似于工具 提前定义之后可以反复使用 代码冗余 结构清晰 修改繁杂等问题 二:函数的语法结构 def 函数名(参数1,参数2) '''函数注释''' 函数体代码 retu ...

  5. mysql加强(4)~多表查询

    mysql加强(4)~多表查询:笛卡尔积.消除笛卡尔积操作(等值.非等值连接),内连接(隐式连接.显示连接).外连接.自连接 一.笛卡尔积 1.什么是笛卡尔积: 数学上,有两个集合A={a,b},B= ...

  6. Jupyter Notebook 更改字体、字体大小、行高

    (废话):今天在做实验的时候遇到了一点问题,就问了问本科的室友,结果室友推荐我使用Jupyter Notebook来写代码,以前看其他同学使用过,但是一直在用Pycharm写,需要的时候顶多是Debu ...

  7. LoadRunner编写socket性能测试脚本

    利用LoadRunner编写socket性能测试脚本 一.概述 Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作. 二.socke ...

  8. jsp 中的绝对路径和相对路径 ./ 和 ../的区别?

    原文地址! https://www.cnblogs.com/brucetie/p/4109913.html 1. 相对路径 相对路径,当前的文件,以根目录为基准,相对于另一个文件的位置. 2.绝对路径 ...

  9. v76.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式 | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(共享内存篇) | 进程间最快通讯方式 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) | 同样 ...

  10. 隐式参数arguments

    类数组对象中(长得像一个数组,本质上是一个对象):arguments 常见的对arguments的操作是三个 获取参数的长度  arguments.length 根据索引值获取某一个参数 argume ...