高级JAVA开发必备技能:java8 新日期时间API((一)JSR-310:ZoneId 时区和偏移量)(JAVA 小虚竹)
技术活,该赏
点赞再看,养成习惯
大家好,我是小虚竹。之前有粉丝私聊我,问能不能把JAVA8 新的日期时间API(JSR-310)知识点梳理出来。答案是肯定的,谁让我宠粉呢。由于内容偏多(超十万字了),会拆成多篇来写。
闲话就聊到这,请看下面的正文。
文章目录
- 第一节:概念知识
- 时区
- UTC
- GMT
- CST
- DST
- ISO-8601
- 第二节:JDK8之前:时区/偏移量TimeZone
- 第三节:JDK8开始支持:时区/偏移量 ZoneId/ZoneOffset
- 时区的规则发生变化时,如何同步时区
- TZUpdater 工具介绍
- TZUpdater 工具用法
- 手动升级
- 操作步骤:
- 服务自动化升级
- 思路步骤:
- 此思路的好处:
- 系统默认的**ZoneId**
- 指定字符串得到ZoneId和获取所有的zoneIds
- 从日期中获取时区
- ZoneOffset(时区偏移量)
- 最小/最大偏移量
- 时分秒构造偏移量
- ZoneRegion(地理区域)
- ZoneId的实例是ZoneOffset或ZoneRegion
- 推荐相关文章
- hutool日期时间系列文章
- 其他
- 参考:
- JSR-310:新日期时间API(一)
第一节:概念知识
时区
由于世界各国家与地区经度不同,地方时也有所不同,因此会划分为不同的时区。
正式的时区划分包括24个时区,每一时区由一个英文字母表示,每隔经度15°划分一个时区。
为了克服时间上的混乱,1884年在华盛顿召开的一次国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。规定英国(格林尼治天文台旧址)为中时区(零时区)、东1—12区,西1—12区。每个时区横跨经度15度,时间正好是1小时。最后的东、西第12区各跨经度7.5度,以东、西经180度为界。每个时区的中央经线上的时间就是这个时区内统一采用的时间,称为区时,相邻两个时区的时间相差1小时。
例如,中国东8区的时间总比泰国东7区的时间早1小时,而比日本东9区的时间晚1小时。
–引用自百度百科
时区经度分布如列表所示:
时区 | 时区经度范围 | 时区中心线 |
---|---|---|
UTC(0时区) | 7.5°W~7.5°E | 0° |
UTC+1(东1区) | 7.5°E~22.5°E | 15°E |
UTC+2(东2区) | 22.5°E~37.5°E | 30°E |
UTC+3(东3区) | 37.5°E~52.5°E | 45°E |
UTC+4(东4区) | 52.5°E~67.5°E | 60°E |
UTC+5(东5区) | 67.5°E~82.5°E | 75°E |
UTC+6(东6区) | 82.5°E~97.5°E | 90°E |
UTC+7(东7区) | 97.5°E~112.5°E | 105°E |
UTC+8(东8区) | 112.5°E~127.5°E | 120°E |
UTC+9(东9区) | 127.5°E~142.5°E | 135°E |
UTC+10(东10区) | 142.5°E~157.5°E | 150°E |
UTC+11(东11区) | 157.5°E~172.5°E | 165°E |
UTC12(东、西12区) | 172.5°E~172.5°W | 180° |
UTC-11(西11区) | 172.5°W~157.5°W | 165°W |
UTC-10(西10区) | 157.5°W~142.5°W | 150°W |
UTC-9(西9区) | 142.5°W~127.5°W | 135°W |
UTC-8(西8区) | 127.5°W~112.5°W | 120°W |
UTC-7(西7区) | 112.5°W~97.5°W | 105°W |
UTC-6(西6区) | 97.5°W~82.5°W | 90°W |
UTC-5(西5区) | 82.5°W~67.5°W | 75°W |
UTC-4(西4区) | 67.5°W~52.5°W | 60°W |
UTC-3(西3区) | 52.5°W~37.5°W | 45°W |
UTC-2(西2区) | 37.5°W~22.5°W | 30°W |
UTC-1(西1区) | 22.5°W~7.5°W | 15°W |
实际上,常常1个国家或1个省份同时跨着2个或更多时区,为了照顾到行政上的方便,常将1个国家或1个省份划在一起。例如,中国幅员宽广,差不多跨5个时区,但为了使用方便简单,实际上在只用东八时区的标准时即北京时间为准。
UTC
协调世界时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。
协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。
国际原子时的准确度为每日数纳秒,而世界时的准确度为每日数毫秒。许多应用部门要求时间系统接近世界时UT,对于这种情况,一种称为协调世界时的折中时标于1972年面世。为确保协调世界时与世界时相差不会超过0.9秒,在有需要的情况下会在协调世界时内加上正或负闰秒。因此协调世界时与国际原子时之间会出现若干整数秒的差别,两者之差逐年积累,便采用跳秒(闰秒)的方法使协调时与世界时的时刻相接近,其差不超过1s。它既保持时间尺度的均匀性,又能近似地反映地球自转的变化。
–引用自百度百科
协调世界时跟地区位置没有相关,不代表当前时刻某个地方的时间,所以在说某个地方时间时要加上时区。例如:中国就是UTC+8。
UTC是时间标准,这个标准把世界分成UTC-12到UTC+12共24个时区。
GMT
GMT(Greenwich Mean Time)别名:格林尼治时间(有时候翻译也叫格林威治),中文名:世界时。
GMT是指格林尼治所在地的标准时间,也是表示地球自转速率的一种形式。以地球自转为基础的时间计量系统。地球自转的角度可用地方子午线相对于地球上的基本参考点的运动来度量。为了测量地球自转,人们在地球上选取了两个基本参考点:春分点(见分至点)和平太阳点,由此确定的时间分别称为恒星时和平太阳时。
–引用自百度百科
GMT并不等于UTC,只是格林尼治刚好在0时区上。所以GMT = UTC+0才是对的。
CST
CST可视为美国、澳大利亚、古巴或中国的标准时间
美国中部时间:Central Standard Time (USA) UT-6:00
澳大利亚中部时间:Central Standard Time (Australia) UT+9:30
中国标准时间:China Standard Time UT+8:00
古巴标准时间:Cuba Standard Time UT-4:00
–引用自百度百科
所以在换算CST时间时,要注意对应的时区。这是一个坑。
美国中部时间:CST=UTC/GMT-6;
中国标准时间:CST=UTC/GMT+8;
DST
DST(Daylight Saving Time)中文名:夏令时。
表示为了节约能源,人为规定时间的意思。也叫夏时制,夏令时(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。全世界有近110个国家每年要实行夏令时。
–引用自百度百科
中国实现DST时间范围:1986年至1991年。
ISO-8601
国际标准化组织的国际标准ISO 8601是日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》。目前最新为第三版ISO8601:2004,第一版为ISO8601:1988,第二版为ISO8601:2000
–引用自百度百科
年由4位数字组成YYYY,或者带正负号的四或五位数字表示±YYYYY。以公历公元1年为0001年,以公元前1年为0000年,公元前2年为-0001年。
月、日用两位数字表示:MM、DD。
只使用数字为基本格式。使用短横线"-"间隔开年、月、日为扩展格式。
小时、分和秒都用2位数表示,对UTC时间最后加一个大写字母Z,其他时区用实际时间加时差表示。如UTC时间下午2点30分5秒表示为14:30:05Z或143005Z,当时的北京时间表示为22:30:05+08:00或223005+0800,也可以简化成223005+08。
注:大家还记得java的Date类吗?它默认就是使用ISO-8601表示的。
第二节:JDK8之前:时区/偏移量TimeZone
在JDK8之前,我们一直用java.util.TimeZone来表示和处理时区和偏移量。
TimeZone.getDefault() 获得当前JVM所运行的时区,那它是怎么获取默认时区的呢,之前有写过分析文章,有兴趣的可以了解下,这里就不再重复了。
JDK获取默认时区的风险和最佳实践
有时候需要做时区的时间转换,比如一个时间要用北京时间和纽约时间显示。实现:
这里没有到SimpleDateFormat 来格式化时间是因为它是线程不安全的。选用线程安全的FastDateFormat,
Apache Commons Lang包支持。
有兴趣可以了解下FastDateFormat 的源码分析:java的SimpleDateFormat线程不安全出问题了,虚竹教你多种解决方案
String patternStr = "yyyy-MM-dd HH:mm:ss";// 北京时间(new出来就是默认时区的时间)Date bjDate = new Date();// 得到纽约的时区TimeZone newYorkTimeZone = TimeZone.getTimeZone("America/New_York");// 根据此时区 将北京时间转换为纽约的DateFastDateFormat fastDateFormat = FastDateFormat.getInstance(patternStr,newYorkTimeZone);System.out.println("这是北京时间:" + FastDateFormat.getInstance(patternStr).format(bjDate));System.out.println("这是纽约时间:" + fastDateFormat.format(bjDate));
19-7=12 北京时间比纽约时间快12小时。
第三节:JDK8开始支持:时区/偏移量 ZoneId/ZoneOffset
JDK8中ZoneId表示时区的ID,ZoneOffset表示Greenwich/UTC的偏移量。
ZoneId 是用来替换java.util.TimeZone 的。
我们来研究下ZoneId ,ZoneId代表一个时区的ID,它是确定的。但是时区ID是有对应的规则,规则变化为java.time.zone.ZoneRules 决定。像夏令时规则是由各国政府定的,可能会变化,不同的年还不一样,这个就交给JDK底层机制来保持同步,我们调用者不需要关心(不!要关心!当技术不再是黑盒时,才能做到心里有底! )。
时区的规则发生变化时,如何同步时区
TZUpdater 工具介绍
提供的 TZUpdater 工具 允许您使用更新的时区数据更新已安装的 Java 开发工具包 (JDK) 和 Java 运行时环境 (JRE) 软件,以适应不同国家/地区的夏令时 (DST) 更改。Oracle 依赖于通过 IANA 的时区数据库公开提供的时区数据。
如果您无法使用 Oracle 最新的 JDK 或 JRE 更新版本,或者如果最新版本上的时区数据不是最新可用的,TZUpdater 工具提供了一种更新时区数据的方法,同时保持其他系统配置和依赖项不变.
TZUpdater 工具用法
TZUpdater 工具用于执行该工具的 JDK/JRE 软件实例。每次执行都会修改 JDK/JRE 软件。要将工具管理到 JDK/JRE 软件的多个实例。
在安装的 JDK/JRE 软件上运行 TZUpdater 工具之前,您必须停止操作系统上的 JDK/JRE 软件的任何正在运行的服务。
使用以下命令运行 TZUpdater 工具:
java -jar tzupdater.jar options
要成功更新时区数据,您应该确保您有足够的权限来修改JDK_HOME
/jre/lib
或JRE_HOME
/lib
目录。
如果未指定任何选项,则会显示用法消息。要更新时区数据,请使用-l
或-f
选项。
选项 | 描述 |
---|---|
-h, --help
|
将用法打印到stdout 并退出。如果指定此选项,则其他选项将被忽略。
|
-V, --version
|
打印工具版本、JRE 中的 tzdata 版本以及工具将更新到的 tzdata 版本,然后退出。 |
-l, --location url-link-to-archive-file
|
从提供的tzdata.tar.gz 包中编译、测试和更新 JRE 时区数据,例如-l https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz . 支持的 URL 协议:http://、https://、file://。如果未提供 URL 链接,该工具将使用位于 的最新 IANA tzdata 包https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz 。
|
-f, --force
|
强制 tzdata 更新。如果更新到较旧的 tzdata 版本,请使用此选项。 |
-v, --verbose
|
向 显示详细消息stdout 。
|
手动升级
注意:
1、在安装的 JDK/JRE 软件上运行 TZUpdater 工具之前,您必须停止操作系统上的 JDK/JRE 软件的任何正在运行的服务。
2、要成功更新时区数据,您应该确保您有足够的权限来修改JDK_HOME
/jre/lib
或JRE_HOME
/lib
目录。(linux系统:JRE目录要有写权限;windows系统:用管理员身份运行cmd)
3、如果系统上有多个JDK/JRE ,需要将该工具用于每个JDK/JRE中(每个JDK/JRE都要操作一遍)
4、更新成功后,要重新启动此 JDK/JRE 实例上的应用程序服务(如果还没更新,重启下服务器试试)
操作步骤:
1、下载Oracle官方提供的tzupdater.jar包;下载地址
https://www.oracle.com/java/technologies/javase-tzupdater-downloads.html
把tzupdater.jar放到java目录bin目录下,比如
“C:\Program Files\JAVA\java-1.8.0-openjdk-1.8.0.201\bin\tzupdater.jar”;
2、查看当前时区数据库版本,以windows为例,用管理员身份运行cmd,切换到tzupdater.jar对应的目录:
java -jar tzupdater.jar -V
3、在线更新,以windows为例,用管理员身份运行cmd,切换到tzupdater.jar对应的目录:(第3种和第4种更新方式任选一种)
java -jar tzupdater.jar -l https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz
如图所示,已经更新成功到了tzdata2021a版本了。
更新后的文件是放在jre/lib/tzdb.dat ,如图所示,它有备份历史的版本。
4、离线更新:要先下载最新的时区数据,下载地址:
https://data.iana.org/time-zones/releases/
以windows为例,用管理员身份运行cmd。切换到tzupdater.jar对应的目录:
java -jar tzupdater.jar -l file:///[path]/tzdata.tar.gz
注:
windows建议放在C盘根目录下,路径目录也不要有中文;
用管理员身份运行cmd(需要写权限);
如上面的命令所示,file后面的/是3个
5、以上执行完后,用第2步的查看当前时区数据库版本命令,查看是否更新成功。
服务自动化升级
思路步骤:
1、设置定时任务(操作系统配置就行),执行tzupdater 更新时区的命令脚本;
2、新开一个时区服务,用来对外提供时区和夏令时规则读取服务,独立部署;
3、在时区服务中,写个同步按钮,用来执行tzupdater 更新时区的命令脚本;
4、在时区服务中,将timeZone数据定时写到自定义的时区表中。提供维护功能,可以自定义新增修改删除timeZone数据。
此思路的好处:
1、其他服务不需要停止服务来更新时间,直接通过调用时区服务的数据,可保证获取到最新的时区数据;
2、自动化的好处,避免了手动维护时区的繁琐,人工介入有引发问题的风险;
3、时区服务和其他业务服务是拆分的,方便未来的扩展。
系统默认的ZoneId
@Testpublic void timeZoneTest2(){System.out.println("JDK 8之前做法:"+TimeZone.getDefault());System.out.println("JDK 8之后做法:"+ZoneId.systemDefault());}
ZoneId.systemDefault()方法实现上是调用了TimeZone:public static ZoneId systemDefault() {return TimeZone.getDefault().toZoneId();}
所以两个的结果是一样的(Asia/Shanghai),这个很正常。
TimeZone.toZoneId() 是java8 后加的方法。
/*** Converts this {@code TimeZone} object to a {@code ZoneId}.** @return a {@code ZoneId} representing the same time zone as this* {@code TimeZone}* @since 1.8*/public ZoneId toZoneId() {String id = getID();if (ZoneInfoFile.useOldMapping() && id.length() == 3) {if ("EST".equals(id))return ZoneId.of("America/New_York");if ("MST".equals(id))return ZoneId.of("America/Denver");if ("HST".equals(id))return ZoneId.of("America/Honolulu");}return ZoneId.of(id, ZoneId.SHORT_IDS);}
指定字符串得到ZoneId和获取所有的zoneIds
System.out.println(ZoneId.of("America/New_York"));System.out.println(ZoneId.of("Asia/Shanghai"));
@Testpublic void ZoneIdTest2(){Set<String> zoneIds = ZoneId.getAvailableZoneIds();System.out.println("zoneIds长度:"+zoneIds.size());for(String zoneId : zoneIds){System.out.println(zoneId);}}
指定的字符串不能乱写,不然会报错,要在ZoneId.getAvailableZoneIds() 的集合范围里。
从日期中获取时区
System.out.println(ZoneId.from(ZonedDateTime.now()));System.out.println(ZoneId.from(ZoneOffset.of("+8")));
从日期中获取时区只支持带有时区的TemporalAccessor ,像LocalDateTime,LocalDate是不可以的,会报错。
try {System.out.println(ZoneId.from(LocalDateTime.now()));}catch (Exception e){e.printStackTrace();}try {System.out.println(ZoneId.from(LocalDate.now()));}catch (Exception e){e.printStackTrace();}
ZoneId是抽象类,它有两个继承实现类:
- ZoneOffset:时区偏移量
- ZoneRegion:地理区域
ZoneOffset(时区偏移量)
时区偏移量是时区与Greenwich/UTC之间的时间差,一般是固定的小时数和分钟数。
最小/最大偏移量
@Testpublic void ZoneIdTest5(){System.out.println("最小偏移量:" + ZoneOffset.MIN);System.out.println("最小偏移量:" + ZoneOffset.MAX);System.out.println("中心偏移量:" + ZoneOffset.UTC);// 超出最大范围System.out.println(ZoneOffset.of("+100"));}
超出最大范围会报错
时分秒构造偏移量
@Testpublic void ZoneIdTest6(){System.out.println(ZoneOffset.ofHours(10));System.out.println(ZoneOffset.ofHoursMinutes(10, 10));System.out.println(ZoneOffset.ofHoursMinutesSeconds(10, 10, 10));System.out.println(ZoneOffset.ofHours(-10));}
挺方便的,也简单好理解。偏移量可以精确到秒级。
ZoneRegion(地理区域)
ZoneRegion表示地理区域,格式是:洲(州、国家)/城市。最常见的区域分类是时区数据库(TZDB)。
which defines regions such as ‘Europe/Paris’ and ‘Asia/Tokyo’.(TZDB使用“Europe/Paris”和“Asia/Tokyo”来区分地区。)
final class ZoneRegion extends ZoneId implements Serializable {...
}
由源码可知,地理区域ZoneRegion是ZoneId的继承实现类。
但是我们发现这个不是对外使用的,ZoneRegion的修饰符是default(只能由同包下的类调用)。只能通过ZoneId来操作。
@Testpublic void ZoneIdTest7(){ZoneId zoneId = ZoneId.systemDefault();System.out.println(zoneId);}
博主在厦门,所以默认获取的时区ID是Asia/Shanghai。
ZoneId的实例是ZoneOffset或ZoneRegion
ZoneId of(String zoneId, boolean checkAvailable) 源码分析:
/*** Parses the ID, taking a flag to indicate whether {@code ZoneRulesException}* should be thrown or not, used in deserialization.** @param zoneId the time-zone ID, not null* @param checkAvailable whether to check if the zone ID is available* @return the zone ID, not null* @throws DateTimeException if the ID format is invalid* @throws ZoneRulesException if checking availability and the ID cannot be found*/static ZoneId of(String zoneId, boolean checkAvailable) {Objects.requireNonNull(zoneId, "zoneId");if (zoneId.length() <= 1 || zoneId.startsWith("+") || zoneId.startsWith("-")) {return ZoneOffset.of(zoneId);} else if (zoneId.startsWith("UTC") || zoneId.startsWith("GMT")) {return ofWithPrefix(zoneId, 3, checkAvailable);} else if (zoneId.startsWith("UT")) {return ofWithPrefix(zoneId, 2, checkAvailable);}return ZoneRegion.ofId(zoneId, checkAvailable);}private static ZoneId ofWithPrefix(String zoneId, int prefixLength, boolean checkAvailable) {String prefix = zoneId.substring(0, prefixLength);if (zoneId.length() == prefixLength) {return ofOffset(prefix, ZoneOffset.UTC);}...}
由源码可知:
- zoneId长度小于等于1位,或者以“+”或“-”开头的,创建的是ZoneOffset实例
- 以“UTC”,“UT”或“GMT”开头的,创建的是ZoneRegion实例
- 不符合以上两种的,创建的是ZoneRegion实例
@Testpublic void ZoneIdTest8(){ZoneId zoneId1 = ZoneId.of("+8");ZoneId zoneId2 = ZoneId.of("+08:00");ZoneId zoneId3 = ZoneId.of("UT+8");ZoneId zoneId4 = ZoneId.of("Asia/Shanghai");System.out.println();}
推荐相关文章
hutool日期时间系列文章
1DateUtil(时间工具类)-当前时间和当前时间戳
2DateUtil(时间工具类)-常用的时间类型Date,DateTime,Calendar和TemporalAccessor(LocalDateTime)转换
3DateUtil(时间工具类)-获取日期的各种内容
4DateUtil(时间工具类)-格式化时间
5DateUtil(时间工具类)-解析被格式化的时间
6DateUtil(时间工具类)-时间偏移量获取
7DateUtil(时间工具类)-日期计算
8ChineseDate(农历日期工具类)
9LocalDateTimeUtil(JDK8+中的{@link LocalDateTime} 工具类封装)
10TemporalAccessorUtil{@link TemporalAccessor} 工具类封装
其他
要探索JDK的核心底层源码,那必须掌握native用法
万字博文教你搞懂java源码的日期和时间相关用法
java的SimpleDateFormat线程不安全出问题了,虚竹教你多种解决方案
源码分析:JDK获取默认时区的风险和最佳实践
参考:
JSR-310:新日期时间API(一)
时区:https://baike.baidu.com/item/%E6%97%B6%E5%8C%BA/491122?fr=aladdin
UTC:https://baike.baidu.com/item/%E5%8D%8F%E8%B0%83%E4%B8%96%E7%95%8C%E6%97%B6/787659?fromtitle=UTC&fromid=5899996&fr=aladdin
GMT:https://baike.baidu.com/item/%E4%B8%96%E7%95%8C%E6%97%B6/692237?fromtitle=GMT&fromid=6026868&fr=aladdin
CST:https://baike.baidu.com/item/CST/14822063?fr=aladdin
DST:https://baike.baidu.com/item/%E5%A4%8F%E4%BB%A4%E6%97%B6/1809579?fromtitle=DST&fromid=1203186&fr=aladdin
ISO-8601:https://baike.baidu.com/item/ISO%208601/3910715?fr=aladdin
TZUpdater :https://www.oracle.com/java/technologies/javase/tzupdater-readme.html
IANA时区数据版本:https://data.iana.org/time-zones/releases/
JRE 软件中的时区数据版本:https://www.oracle.com/java/technologies/tzdata-versions.html
高级JAVA开发必备技能:java8 新日期时间API((一)JSR-310:ZoneId 时区和偏移量)(JAVA 小虚竹)相关推荐
- 高级JAVA开发必备技能:时区的规则发生变化时,如何同步JDK的时区规则(实战方案,建议收藏)
技术活,该赏 点赞,收藏再看,养成习惯 场景 服务器安装JDK时,默认会有支持JDK版本对应的时区规则.但是时区规则可能会变化的,那如何保持时区规则是最新的呢? TZUpdater 工具介绍 提供 ...
- JDK8新特性:新日期时间API全面学习
旧版jdk对时间和日期的设计非常差 1.设计不合理 在java.util和Java.sql 包中都有日期类,java.util.Data同时包含日期和时间 而Java.sql.Date仅仅包含日期 此 ...
- 【小家java】java8新特性之---全新的日期、时间API(JSR 310规范),附SpringMVC、Mybatis中使用JSR310的正确姿势
[小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小家java ...
- java8新日期时间类使用
java8之后提供了新的日期和时间相关类,接口和枚举,放在了java.time包下(之前旧的日期时间类放在java.util包),使设置日期时间更加方便.java8的新日期时间类的设计,借鉴了joda ...
- java 包结构 枚举类_Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类...
因为Jdk7及以前的日期时间类的不方便使用问题和线程安全问题等问题,2005年,Stephen Colebourne创建了Joda-Time库,作为替代的日期和时间API.Stephen向JCP提交了 ...
- java date只保留年月日_Java日期时间API系列14-----Jdk8中日期API类,日期计算1,获取年月日时分秒等...
通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...
- java date加一天_Java日期时间API系列15-----Jdk8中API类,java日期计算2,年月日时分秒的加减等...
通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...
- jsr303自定义验证_JSR 310新日期/时间API的自定义JSR 303 Bean验证约束
jsr303自定义验证 借助JSR 310,Java 8终于为我们带来了不错的日期和时间API. 对于仍在使用Java 7的那些人(就像我目前在我的当前项目中一样),有很好的反向移植,请访问www.t ...
- JSR 310新日期/时间API的自定义JSR 303 Bean验证约束
借助JSR 310,Java 8终于为我们带来了不错的日期和时间API. 对于仍在使用Java 7的那些人(例如我目前在我的当前项目中),有很好的反向移植,请访问www.threeten.org了解更 ...
最新文章
- 强化学习是针对优化数据的监督学习?
- Python学习小结---粗略列表解析
- 系统相关的信息模块: import sys
- Android --- 漂亮的 Loader 加载动画
- android—资源文件(res)的引用
- 用excel 2016连接mysql_excel导入mysql数据库方法(最新,2016年2月19日)
- php artisan key,Laravel:php artisan key:generate三种报错解决方案,修改默认PHP版本(宝塔面板)...
- Android 内核的开发“顽疾”如何解决?
- 比特币蒸发 1 万亿;中兴入局无人驾驶;特斯拉 Model 3 在华降价 | 极客头条
- iOS开发--底部按钮和应用图标显示未读消息
- html 收藏本页,设为首页与加入收藏的JS代码(多浏览器支持)
- 沟通的艺术I:什么是沟通
- 第二门课 改善深层神经网络:超参数调试、正则化以及优化(Improving Deep Neural Networks:Hyperparameter tuning…)
- 给盲目跟风网络营销的商户们一个忠告——搞不好你会死得很惨
- 使用python实现win10系统和arduino usb串口通信
- 园区网络三层架构实验
- APP与小程序—信息收集
- 有12个球,外形相同,其中一个小球的质量与其他11个不同,给一个天平,需要几次把这个小球找出来并且求出这个小球是比其他的轻还是重
- 玩游戏计算机配置,玩大型游戏需要什么配置
- 开曼丨鞘氨醇-1-磷酸说明书