Java8的产品周期_java8的时间和`Date`的对比

java8提供了新的时间接口。相对Date,Calendar,个人感觉最大的好处是对时间操作的学习成本很低,比Calendar低。

1. LocalDate,LocalTime,LocalDateTime

LocalDate 代表日期,LocalTime表示时刻,类似11:23这样的时刻。 LocalDateTime就是前面2个的结合,这个可以从java.time.LocalDateTime#toString的代码看出一二:

136be34314a57ba454d97dfa8ef5d707.png

date,time 在java.time.LocalDateTime中

136be34314a57ba454d97dfa8ef5d707.png

实际使用中,计算日期就用LocalDate,计算日期加时刻用LocalDateTime,如果只有时刻就是LocalTime(感觉在说废话) 这三个的用法基本上一样,通过方法名就知道用法那种

1.1 获取当前时间的对象

136be34314a57ba454d97dfa8ef5d707.png

localDateTime相比Date更像是一个工具类,就是为了时间操作使用。其构造方法是私有的。

1.2 从字符串中解析

字符串 2019-01-11

136be34314a57ba454d97dfa8ef5d707.png

DateTimeFormatter的包路径是java.time.format和LocalDate一样在java.time下面,而SimpleDateFormat和Date是不同的。所以当判断引入路径的时候更容易判断。 当解析失败的时候,两个异常的抛出不一样,DateTimeFormatter抛出的是DateTimeParseException,继承自RuntimeException,而ParseException明显继承的是Exception。

个人感觉这个思路是,前者如果抛出异常那就是编程上错误,而后者则是的程序代码的不稳定性。我更倾向于第一种的异常设计,应该加强对入参的检测判断,而不是通过捕获异常去处理入参的错误。(类似NumberFormatException)

1.3 LocalDate比Date更强的初始化时间

Date 设置某个日期,基本上3个方式,时间戳/Calendar/字符串解析。相对的LocalDate就简单了很多

LocalDate.of(2019,1,12);

其他的也一样

136be34314a57ba454d97dfa8ef5d707.png

1.4 时间戳的转换

时间戳和时区关系的参考 时间转换代码参考

在这里时间戳的转换不如Date直接。主要因为LocalDate本身是没有时区的。

136be34314a57ba454d97dfa8ef5d707.png

####LocalDateTime转时间戳

136be34314a57ba454d97dfa8ef5d707.png

关于时区的计算也很简单,就是相差几个小时就加上多少秒

136be34314a57ba454d97dfa8ef5d707.png

136be34314a57ba454d97dfa8ef5d707.png

1.5 和Date互转

136be34314a57ba454d97dfa8ef5d707.png

Instant 和 LocalDate或LocalDateTime 就不赘述了…

代码来自 Java 日期时间传统互操作性

1.6 更好的理解和操作方式

Date、Calendar的操作,例如设置月份,day of week 都有些让人迷惑,例如1月的定义是0,周一是0。1号好像也是0吧(我真没咋用过这东西,现用现百度…

LocalDate感觉好多了。例如DayOfWeek是枚举类型。使用枚举就不会理解错了吧

136be34314a57ba454d97dfa8ef5d707.png

很多日期和时间操作,无非就是加减时间和比较. 使用‘加’的示例:

136be34314a57ba454d97dfa8ef5d707.png

不用再去使用一个不熟悉的Calendar去操作了(Calendar提供的接口都是啥玩意,get,set的)

136be34314a57ba454d97dfa8ef5d707.png

2. 线程安全性比较

LocalDate…系列是线程安全的 额..每一个字段都用了final关键字了,都变不了… 所以进行操作后都是返回新的copy对象

136be34314a57ba454d97dfa8ef5d707.png

至于说Date线程不安全,get,set的肯定在多线程的时候容易出现问题,不过set方法已经都@Deprecated废弃了。当然不是因为线程安全问题废弃的,是因为有了更好的替代

Calendar.set(Calendar.DAY_OF_MONTH, int date)

不过感觉还是不如这个更清晰明了

LocalDate.of(2019,1,12);

2.1 SimpleDateFormat的线程安全性

参考:深入理解Java:SimpleDateFormat安全的时间格式化

在一定负载情况下,SimpleDateFormat会出问题的。简单测试一下

package open.note;

import java.text.SimpleDateFormat;

import java.time.LocalDateTime;

import java.time.format.DateTimeFormatter;

import java.util.Date;

import java.util.concurrent.CountDownLatch;

import java.util.function.Consumer;

public class UnSafeTest {

private static String time = “2019-01-11 11:11:11”;

private static long timestamp = 1547176271000L;

private static LocalDateTime dateTime = LocalDateTime.of(2019,1,11,11,11,11);

private static SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);

private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”);

public static void main(String[] args) {

dateFormatTest((obj)->{

try {

Date date = dateFormat.parse(time);

if (date.getTime() != timestamp){

System.out.println(date);

}

} catch (Exception e) {

System.out.println(e.getMessage());

}

});

System.out.println(“—————“);

dateFormatTest((obj)->{

try {

LocalDateTime dateTime = LocalDateTime.parse(time,formatter);

if (!dateTime.isEqual(UnSafeTest.dateTime)){

System.out.println(dateTime);

}

} catch (Exception e) {

System.out.println(e.getMessage());

}

});

}

private static void dateFormatTest(Consumer runnable){

CountDownLatch countDownLatch = new CountDownLatch(1000);

for (int i = 0; i < 1000; i++) {

new Thread(()->{

runnable.accept(null);

countDownLatch.countDown();

}).start();

}

try {

countDownLatch.await();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

输出结果

136be34314a57ba454d97dfa8ef5d707.png

测试过程中,SimpleDateFormat 1000个线程里,有5次,时间解析错了,5次异常了(时间错了,比抛出异常还可怕) DateTimeFormatter只是对比参考一下,未出现异常(人家已经声明是线程安全了…) 当然SimpleDateFormat线程不安全应该人尽皆知的,但依然有不安全的使用,但每次使用都new一个实例,当负载大的时候也不好。所以一个线程一个SimpleDateFormat实例应该可以的。

最后

java8 对时间操作的类还有很多 到java.time包下去看看,以后总会用得到的地方。

136be34314a57ba454d97dfa8ef5d707.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java cpu高_Java中的CPU占用高和内存占用高的问题排查

下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程。如果是Java面试&#xff0c;这2个问题在面试过程中出现的概率很高&#xff0c;所以我打算在这里好好总结一下。1、Java CPU过高的问题排查举个例子&#xff0c;如下&#xff1a;package com.classloading;public…

solr 时间转成java_solr时区设置解决时间多8小时问题

今天发现我博客里文章的时间与实际时间差了8小时&#xff0c;正好比原来时间多出8小时&#xff0c;想想应该是时区不一致的问题。用solr web工具查询出来的数据原样&#xff1a;"create_time": "2018-01-18T11:22:06Z"{"original": 1,"crea…

php变量原格式输出,PHP格式化输出打印变量

PHP 常用的输入变量函数print_r&#xff0c;但是输出没有换行&#xff0c;看起来很费力 我们可以自定义一个函数来实现变量的格式化输出&#xff0c;代码如下&#xff1a; function dump($vars, $label , $return false) {if (ini_get(html_errors)) {$content "\n&quo…

JAVA语言写的,用java语言写

Caballariistatic int argument;static int count0;public static void main(String[] args){argument5;printResult("",argument);System.out.println("总共"count"种");}public static void printResult(String result,int left){if(left1){Sy…

php语录网站,杨泽业:给你的wordpress博客添加经典语录功能,适合所有php网站

我们做一个网站就是要不断给访客提供最佳的用户体验&#xff0c;同时提升自己的品牌价值&#xff0c;而文章结束的经典语录的功能&#xff0c;完全可以实现我们所要达到的效果。(如下图)给你的wordpress博客添加经典语录功能这个是怎样实现的呢&#xff1f;其实很简单&#xff…

matlab搭建的应用层架构逻辑,软件设计的三层架构

1&#xff1a;三层架构是什么&#xff1f;三层架构是一个分层式的软件体系架构设计理念。把软件架构分为三层&#xff1b;1&#xff1a;UI层 (user interface layer) 界面层2&#xff1a;BLL层 (business logic layer) 业务逻辑层3&#xff1a;DAL层 (data access laye…

mysql null 0 空,MySQL的空值和NULL区别

从本质上区别&#xff1a;1、空值不占空间2、null值占空间通俗的讲&#xff1a;空值就像是一个真空转态杯子&#xff0c;什么都没有&#xff0c;而null值就是一个装满空气的杯子&#xff0c;虽然看起来都是一样的&#xff0c;但是有着本质的区别。例子&#xff1a;创建一个test…

强制关机对电脑的影响_笔记本电脑需要每天关机吗?长期开机对电脑有影响么?...

笔者之前写过一些选购笔记本的文章&#xff0c;就有不少网友问了这个问题&#xff1a;笔记本电脑需要每天关机么&#xff1f;一直开着有没有问题&#xff1f;这里说得一直开着是选择了合盖睡眠(或者休眠)的方式。使用时翻开笔记本盖子就可以工作&#xff0c;工作做完后合上盖子…

python关闭exe程序_Win 10 中使用 Python 碰到的奇怪现象

优质文章&#xff0c;第一时间送达&#xff01;作者&#xff1a;流光飞舞来源&#xff1a;https://shuhari.dev/blog/2019/11/win10-store-python最近在使用 Python 的时候发生了很奇怪的现象&#xff1a;从命令行执行 python.exe并不会进入 REPL&#xff0c;似乎也没有其他反应…

mulitpartfile怎么接收不到值_手机有时接收不到微信消息通知,怎么办?超全解决方案...

不知道大家在使用微信的过程中有没有遇到以下情况&#xff0c;在自己看视频或者刷其他网页的时候&#xff0c;没有接收到微信的任何通知和提示的消息。等到你进入微信页面后&#xff0c;突然发现有很多未读信息。这种情况时有发生&#xff0c;很多人都反应说微信接收消息总是会…

生活 list.php,list.php

require_once config.php;// 接收传来的分类id$categoryId$_GET[categoryId];//3// 查询当前分类下的文章// echo $categoryId;// 连接数据库$connectmysqli_connect(DB_HOST,DB_USER,DB_PWD,DB_NAME);// 写sql$sql"select p.id,p.title,p.feature,p.content,p.created,p.…

苹果呼叫转移设置不了_怎么设置别人电话打不进来

您可以尝试输入【**21*888888#】并按下拨打键&#xff0c;开启本机的呼叫转移功能&#xff0c;在开启之后别人拨打您的电话会转移到888888这个空号&#xff0c;实现别的电话无法打入的效果。以下就是相关的步骤介绍&#xff1a;1、只需要在安卓或者苹果iOS 11系统的手机的拨号界…

jdk db版本_企业视频会议系统音视频通话EasyRTC-SFU版本研发中更合适的配置文件格式-TOML配置介绍 - TSINGSEE...

在 EasyRTC-SFU 版本的开发过程中&#xff0c;很多配置需要存储在配置文件中。开发人员经常使用的配置文件有 ini、json、xml、yaml 等格式&#xff0c;在综合分析各种文件格式的优劣后&#xff0c;我们最终确认使用 toml 格式作为配置文件格式。ini 文件格式是最传统的配置文件…

PHP开源管理系统 Gms,GMS 一个成熟的gms系统,拥有基本的权限管理和分类,后台很好 Windows Develop 249万源代码下载- www.pudn.com...

文件名称: GMS下载 收藏√ [5 4 3 2 1 ]开发工具: PHP文件大小: 14012 KB上传时间: 2016-01-03下载次数: 0提 供 者: 马继康详细说明&#xff1a;一个成熟的gms系统,拥有基本的权限管理和分类&#xff0c;后台很好-a good gms system文件列表(点击判断是否您需要的文件&a…

numpy序列预处理dna序列_个人隐私DNA亲子鉴定序列

个人隐私DNA亲子鉴定序列DNA亲子鉴定是基于医学&#xff0c;法律或个人原因解决亲子关系的最先进&#xff0c;最准确的方法。周转时间&#xff1a;凭借先进的DNA技术&#xff0c;亲子鉴定准确&#xff0c;快速且价格合理。现在可以在样品到达实验室后的3至7个工作日内确定亲子关…

usb接口驱动_关于电脑上的USB接口,都在这儿了!

美美的周末时光到来了&#xff01;今天给大家科普一点电脑的常识。想必大家在日常使用电脑的时候&#xff0c;会经常看到电脑右侧有一些不同的借口&#xff0c;看着像USB借口&#xff0c;但是标志却很奇怪&#xff0c;那到底为什么呢&#xff1f;还有&#xff0c;这些接口是2.0…

kibana 查看索引库中文档个数_百度索引量是什么意思?和百度收录量的区别。...

百度索引量表示所有网名最多会从百度看到的这个网站页面数量&#xff0c;用官方的话来说就是可以被搜索用户搜索到的网站数据库。 百度索引量是什么意思&#xff1f; 百度索引量表示所有网名最多会从百度看到的这个网站页面数量&#xff0c;用官方的话来说就是可以被用户搜索到…

blob 在线解码_「沙发管家」腾讯极光盒子3Pro发布!4+32G内存8K解码

10月22日&#xff0c;腾讯携手创维数字&#xff0c;推出了首款 8K 高清电视盒子——腾讯极光盒子 3Pro 。这款产品的定位是“8K 星耀旗舰家庭娱乐主机”&#xff0c;盒子外观是高级黑加上一些不规则形状设计&#xff0c;磨砂材质&#xff0c;边缘还有一道蓝色的荧光&#xff0c…

360手机浏览器_网信办:UC、QQ、360、搜狗等8款手机浏览器被纳入首批整治范围...

点击蓝字 关注我们UC、QQ、华为、360、搜狗、小米、vivo、OPPO等8款影响力较大的手机浏览器被纳入首批重点整治范围为有效解决网民反映强烈的手机浏览器网络传播乱象&#xff0c;国家网信办即日起对手机浏览器进行专项集中整治&#xff0c;重点聚焦行业突出问题实施“靶向治疗”…

重建索引一般需要多久_游泳小白学游泳,一般需要多久才能学会?猜猜看

由于每个人的身体条件不同&#xff0c;所以每个人从零基础到学会游泳需要的时间也不同。从我一对一的教学经验来看&#xff0c;一般正常体能的人需要5节课就能学会游泳&#xff0c;每节课1个小时。/01/ 零基础一般需要学什么泳姿&#xff1f;在国内来说&#xff0c;一般零基础先…