鳞翅目动物的诅咒:玩java.time

流行测验:这个小程序的输出是什么?

public class DateFun {public static void main(String[] args) {long hours = getHoursOfDay(LocalDate.now(), ZoneId.systemDefault());System.out.println(hours);}private static long getHoursOfDay(LocalDate date, ZoneId zoneId) {ZonedDateTime startOfDay = date.atStartOfDay(zoneId);Duration duration = Duration.between(startOfDay, startOfDay.plusDays(1));return duration.toHours();}
}

就像最有趣的问题一样,答案是“取决于”。 它如何依赖? 好吧,让我们尝试一些例子:

  • getHoursOfDay(LocalDate.of(2014, 7, 15), ZoneId.of("Asia/Colombo"))返回24 。 符合预期
  • getHoursOfDay(LocalDate.of(2014, 7, 15), ZoneId.of("Europe/Oslo"))也返回24
  • 但这是一个有趣的版本: getHoursOfDay(LocalDate.of(2014, 3, 30), ZoneId.of("Europe/Oslo"))返回23 ! 这是夏令时。
  • 同样: getHoursOfDay(LocalDate.of(2014, 10, 26), ZoneId.of("Europe/Oslo"))也返回25
  • 当然,下面一切都颠倒了: getHoursOfDay(LocalDate.of(2014, 10, 5), ZoneId.of("Australia/Melbourne"))得出23。
  • 当然,除了昆士兰州: getHoursOfDay(LocalDate.of(2014, 10, 5), ZoneId.of("Australia/Queensland")) => 24。

夏时制:程序员的祸根!

实行夏令时的目的是通过提供更多的带灯工作时间来提高工人的生产率。 许多研究未能证明它可以按预期工作。

取而代之的是,当我检查挪威的夏令时的历史时,发现它是由高尔夫球手和蝴蝶收藏家(“鳞翅目动物”)游说的,以便他们在下班后能更好地追求自己的爱好。 因此,此博客文章的名称。

大多数时候,您可以忽略夏令时。 但是,当您无法做到这一点时,它确实可以将您咬在背后。 例如:从夏令时更改为标准时间的那一天,电源计划的每小时生产看起来是什么样的? 同事给我的另一个例子:电视时间表。 事实证明,在秋天的额外一小时内,有些电视频道根本就不愿意显示节目。 否则他们将显示同一小时的编程两次。

Joda-Time API和现在的Java 8 time API java.time可以提供帮助。 如果正确使用。 这是显示每小时值表的代码:

void displayHourlyTable(LocalDate date, ZoneId zoneId) {ZonedDateTime startOfDay = date.atStartOfDay(zoneId);ZonedDateTime end = startOfDay.plusDays(1);for (ZonedDateTime current = startOfDay; current.isBefore(end); current = current.plusHours(1)) {System.out.println(current.toLocalTime() + ": " + current.toInstant());}
}

鉴于2014/10/26和奥斯陆,此打印:

00:00: 2014-10-25T22:00:00Z
01:00: 2014-10-25T23:00:00Z
02:00: 2014-10-26T00:00:00Z
02:00: 2014-10-26T01:00:00Z
03:00: 2014-10-26T02:00:00Z
....

并在2014/3/30上打印:

00:00: 2014-03-29T23:00:00Z
01:00: 2014-03-30T00:00:00Z
03:00: 2014-03-30T01:00:00Z
04:00: 2014-03-30T02:00:00Z
....

因此,如果您发现自己正在编写这样的代码: for (int hour=0; hour<24; hour++) doSomething(midnight.plusHours(hour)); 您可能要重新考虑! 该代码每年(可能)会中断两次。

从表面上看,时间是一个简单的概念。 当您开始研究细节时,有一个原因java.time库包含20个类(如果不计算子包的话)。 正确使用时,时间计算很简单。 如果使用不当,时间计算看起来很简单,但包含一些细微的错误。

下次,也许我应该仔细考虑周数的一些要点。

翻译自: https://www.javacodegeeks.com/2014/08/the-lepidopterists-curse-playing-with-java-time.html

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

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

相关文章

jq 方法函数(淡入淡出,查找元素,过滤)遍历

淡入淡出&#xff1a;fadeIn fadeOut fadeToggle fadeTo 淡入&#xff1a;fadeIn&#xff08;speed[,callback]&#xff09; 速度和回调函数 回调函数可以写匿名函数&#xff0c;或者方法名不加括号。 speed 为‘slow’或 1000 毫秒数不加引号 淡出&#xff1a;fadeOut …

Elasticsearch的用例:灵活的查询缓存

在前两篇有关Elasticsearch用例的文章中&#xff0c;我们已经看到Elasticsearch 可用于存储甚至大量文档 &#xff0c;并且我们可以通过Query DSL使用Lucene的全文功能访问那些 文档 。 在这篇较短的文章中&#xff0c;我们将把两个用例放在一起&#xff0c;以了解读取繁重的应…

Vue底层架构及其应用(上)转

https://mp.weixin.qq.com/s?__bizMzIzNjcwNzA2Mw&mid2247486427&idx1&sn61f9579bbe1dfe26da4b53eb538fee13&chksme8d28643dfa50f557c56ce8b5bc9b0597a157a20791e21b1812fe2a30ff4cf2c813608473b43&mpshare1&scene23&srcid#rd 一、前言 市面上有很…

jquery笔记一:下载安装、语法、选择器、遍历选择元素的方法、jQuery动画

目前 jQuery 兼容于所有主流浏览器, 包括 IE 6&#xff01;开发时常用 jquery.js&#xff0c;上线用 jquery.min.js。 jq插件 目前jQuery有三个大版本&#xff1a; &#xff08;1&#xff09;1.x.x: 兼容ie6,7,8&#xff0c;使用最为广泛&#xff0c;官网只做BUG维护&#xff…

jquery简介 each遍历 prop attr

一、JQ简介 jQuery是一个快速、简洁的JavaScript框架&#xff0c;它封装了JavaScript常用的功能代码&#xff0c;提供一种简便的JavaScript设计模式&#xff0c;优化HTML文档操作、事件处理、动画设计和Ajax交互。 装载的先后次序&#xff1a;  jQuery封装库在上&#xff0…

如何让Visitor变得可爱1

本文转自&#xff1a;http://www.cnblogs.com/idior/archive/2005/01/19/94280.html 在wayfarer的文章中提到了如何利用visitor模式实现添加新的功能。如他所说&#xff0c;在实际过程中显的不是那么可爱。不过他为我们提供了一个可行的解决方案&#xff0c;本文将在此基础上使…

EJB 3.x:生命周期和并发模型(第1部分)

Java EE组件生命周期和与并发相关的详细信息对于经验丰富的专业人员而言可能不是新知识&#xff0c;但是对于初学者而言&#xff0c;这可能需要花费一些时间。 就EJB而言&#xff0c;了解其生命周期 &#xff08;以及相关的并发场景&#xff09;对于确保使用EJB的正确用法和解…

链表定义

public class Node {//节点内容&#xff0c;成员变量int data;//下一个节点&#xff0c;定义成员变量&#xff0c;类型为Node类型&#xff0c;不进行初始化Node next;//定义构造函数&#xff0c;获取参数data的值public Node(int data) {this.datadata;}//为节点追回节点public…

单独使用 laydate 日期时间组件

layui 日期和时间组件官方文档 需要注意几点&#xff1a; 下载压缩包后&#xff0c;复制整个 laydate 文件夹放到项目中&#xff0c;里面的文件不要改动位置&#xff0c;否则会报错&#xff1b;在移动端使用时&#xff0c;要给 input 添加 readonly 属性&#xff0c;否则点击…

从零开始学习SVG

1 什么是SVG&#xff1f; MDN中的定义是&#xff1a;SVG即可缩放矢量图形&#xff08;Scalable Vector Graphics&#xff0c;SVG)&#xff0c;是一种用来描述二维矢量图形的 XML 标记语言。 简单地说&#xff0c;SVG 面向图形&#xff0c;HTML 面向文本。SVG 与 Flash 类似&am…

Flash/Flex学习笔记(39):弹性运动

动画中的弹性运动 从视觉效果上接近 物理经典力学中的单摆运动或弹簧(胡克定律FKx)振动 先看下面的模拟演示&#xff1a; 规律&#xff1a; 小球先从出发点(初始为最左侧)向目标点(中心点)加速狂奔&#xff0c;奔的过程中速度越来越大&#xff0c;但加速度越来越小&#xff0c;…

layui 关于layDate设置时间限制问题

前面是尝试结果&#xff0c;有兴趣的可以康康&#xff0c;赶时间的可以直接翻到底下 ----->直达车 因为只有一个页面&#xff0c;没什么标准&#xff0c;所以自己就使用了layui的时间控件&#xff0c;并且作为独立组件。 第一次尝试 - 使用 min 一开始只想让结束时间有个…

QQ聊天记录快速迁移

QQ聊天记录快速迁移 在工作中大家经常会用到QQ来沟通&#xff0c;但是很多时候在其它设备上登录QQ就无法查看到之前的聊天记录和图片&#xff0c;这是因为电脑上的QQ聊天记录一般都是保存在电脑本地硬盘里&#xff0c;所以我们在换设备登录QQ后&#xff0c;是无法查看到之前电脑…

DOM相关知识点

内容待补充。。。 DOM相关注意题目&#xff1a;DOM的最小组成单位叫做 //节点 NodeDOM 有自己的国际标准&#xff0c;目前的通用版本是 //DOM 3DOM 树的根节点 //HTML元素 Element 的 NodeType 值为 //1 和Node. ELEMENT_NODE<div idx></div> x的值 //就是这…

Hawtio和Jolokia的休眠统计

企业Java的很大一部分处理数据。 在企业设置中使用数据的所有不同方式中&#xff0c;仍然存在使用任何种类的O / R映射的行之有效且广泛教授的方法。 JPA标准使每个人都可以轻松使用它&#xff0c;并且它也应该是可移植的。 但是&#xff0c;我们不要谈论迁移细节。 O / R映射的…

laydate 时间控件去掉秒以及解决在移动端不能滑动的问题

一、时间控件去掉秒&#xff0c;保留时分 二、时间控件在移动端不能滚动 一、时间控件去掉秒&#xff0c;保留时分 方法一&#xff1a;使用 ready 回调函数 ready 控件在打开时触发。打开控件时让秒消失。 <script> laydate.render({elem: #endTime, //指定元素trigg…

Entity Framework Code First属性映射约定 转载https://www.cnblogs.com/libingql/p/3352058.html

Entity Framework Code First属性映射约定 Entity Framework Code First与数据表之间的映射方式有两种实现&#xff1a;Data Annotation和Fluent API。本文中采用创建Product类为例来说明tity Framework Code First属性映射约定的具体方式。 1. 表名及所有者 在默认约定的情况下…

应用的大数据:医疗保健的经济学

这次我的标题不太挑衅&#xff0c;因为我的上一篇博客文章&#xff08;http://brianoneill.blogspot.com/2014/04/big-data-fixes-obamacare.html&#xff09;显然煽动了政治大战。 在本文中&#xff0c;我希望通过详细介绍大数据如何以无党派方式帮助我们的医疗保健系统来避免…

innerHTML的用法

<!doctype html> <html> <head> <meta charset"utf-8"> <title>无标题文档</title> <style type"text/css">#div1 {width: 200px;height: 200px;border: 1px solid black;} </style> </head><bo…

3G门户宣讲+笔试

作为一个门户网站&#xff0c;估计盈利模式同sina、sohu没啥差异。而3G就专注于手机。有点担心被人抄袭或者本来的大门户网站发展手机门户之后&#xff0c;3G的优势在哪里。 就宣讲会自身宣传来看&#xff0c;主持人估计是市场/销售的&#xff0c;很活泼&#xff0c;送礼物带动…