夏令时持续时间

2024-02-03

我有一个对象Shift,有两个字段:startDateTime and endDateTime as DateTime来自乔达时间。

我的轮班包括英国夏令时的变化。它开始于25/03/2017 13:00并结束于26/03/2017 02:00(基本上应该结束于26/03/2017 01:00,但该日期不存在,并且endDate平移+1小时)。根据这个site https://www.timeanddate.com/time/change/uk/london:

当当地标准时间即将到达时 2017 年 3 月 26 日,星期日 01:00:00 时钟向前拨 1 小时 2017 年 3 月 26 日星期日,当地时间 02:00:00。

现在,如果我想跟踪员工的工作小时数new Duration(startDateTime, endDateTime).toStandardHours().getHours()会给我13个小时。

如何使用 Joda-Time 检测夏令时是否在轮班期间开始或结束?


您可以使用org.joda.time.DateTimeZone班级。它包含有关世界上所有时区的 DST 更改的信息,因此您无需检测 DST 更改:如果您正确告知您正在使用哪个时区,则 API 会为您完成这项工作。

当您使用英国时区时,您可以直接使用Europe/London时区 - 这些名称的格式Continent/City来自IANA 数据库 https://www.iana.org/time-zones,它被 Joda-Time、Java 和许多其他 API 使用。您可以通过致电获取所有时区的列表DateTimeZone.getAvailableIDs().

当您使用DateTimeZone,它已经包含历史记录中的所有 DST 变化,因此 API 会为您完成所有数学计算。你只需要创建你的DateTime该时区的实例:

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.Duration;

// London timezone - it contains all info about DST shifts
DateTimeZone london = DateTimeZone.forID("Europe/London");

// Start on 25/03/2017 13:00
DateTime start = new DateTime(2017, 3, 25, 13, 0, london);
// ends on 26/03/2017 02:00
DateTime end = new DateTime(2017, 3, 26, 2, 0, london);

// get the difference between start and end
Duration duration = new Duration(start, end);
System.out.println(duration.getStandardHours()); // 12

输出将是12(API 使用的信息DateTime的时区来计算差异,包括 DST 变化)。

您还可以使用:

duration.toStandardHours().getHours()

或者班级org.joda.time.Hours:

Hours.hoursBetween(start, end).getHours()

全部回归12,并且它们都是等价的。


Java 新的日期/时间 API

Joda-Time 即将停产并被新的 API 取代,因此如果您正在考虑迁移,您可以开始使用新的日期/时间 API,但如果您有一个使用 Joda 的大型代码库或者不想迁移它现在,您可以考虑答案的其余部分。

无论如何,即使在乔达的网站 http://www.joda.org/joda-time它说:“请注意,Joda-Time 被认为是一个很大程度上“完成”的项目。没有计划进行重大增强。如果使用 Java SE 8,请迁移到 java.time (JSR-310)。”.*

如果您正在使用Java 8,考虑使用新的 java.time API https://docs.oracle.com/javase/tutorial/datetime/。更容易,与旧 API 相比,漏洞较少且不易出错 https://stackoverflow.com/questions/1969442/whats-wrong-with-java-date-time-api。我不确定它是否已适用于所有 Android 版本(但请参阅下面的替代方案)。

如果您正在使用Java ,您可以使用三十向后移植 http://www.threeten.org/threetenbp/,Java 8 新日期/时间类的一个很好的向后移植。而对于Android,有一种方法可以使用它,通过三十ABP https://github.com/JakeWharton/ThreeTenABP(更多关于如何使用它here https://stackoverflow.com/a/38922755/7605325).

下面的代码适用于两者。 唯一的区别是包名称(在 Java 8 中是java.time在 ThreeTen Backport(或 Android 的 ThreeTenABP)中是org.threeten.bp),但是类和方法names是相同的。

新的 API 还使用 IANA 时区名称,并包含有关 DST 转变的相同历史信息(以获取所有时区的列表:ZoneId.getAvailableZoneIds())。代码非常相似,而且也有不止一种方法可以得到差异:

import java.time.Duration;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;

// London timezone
ZoneId london = ZoneId.of("Europe/London");

// Start on 25/03/2017 13:00
ZonedDateTime start = ZonedDateTime.of(2017, 3, 25, 13, 0, 0, 0, london);
// ends on 26/03/2017 02:00
ZonedDateTime end = ZonedDateTime.of(2017, 3, 26, 2, 0, 0, 0, london);

// get the difference in hours
System.out.println(ChronoUnit.HOURS.between(start, end)); // 12

// get the duration in hours
Duration duration = Duration.between(start, end);
System.out.println(duration.toHours()); // 12

// using until() method
System.out.println(start.until(end, ChronoUnit.HOURS)); // 12

以上三种方法(ChronoUnit.HOURS.between(), duration.toHours() and start.until()) 返回12。根据javadoc https://docs.oracle.com/javase/8/docs/api/java/time/temporal/ChronoUnit.html#between-java.time.temporal.Temporal-java.time.temporal.Temporal-, between and until是等价的,因为第一个只是在内部调用第二个 http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/43cb25339b55/src/share/classes/java/time/temporal/ChronoUnit.java#l270。用一个Duration也是等效的,因为它使用它们之间的纳秒并将其转换为小时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

夏令时持续时间 的相关文章

随机推荐

  • 在 fp-ts 的管道中混合 Either 和 TaskEither

    当没有一个函数是异步的时 我有以下程序可以正常工作 interface Product count number pricePerItem number interface Tax tax number interface Delivery
  • UITableView 上的动画 reloadData

    你会怎样动漫 reloadData on UITableView 数据源已开启UIFetchedResultsController所以我不能玩 insertSections withRowAnimation deleteSections w
  • 从 UITableView 中的 URL 加载图像速度缓慢。

    我正在从 UITableView 中的 URL 加载图像 但加载视图时速度非常慢 这是一个例子 UIImage image nil image UIImage imageWithData NSData dataWithContentsOfU
  • asp.net c# 中是否有等效的 echo

    我有一个 php 代码 我已将其转换为 asp net 代码 PHP 代码只是回显客户端读取和解释的响应 但是在 asp net 中 生成的输出被迫采用 html 格式 这正是因为我使用 asp net 标签来打印输出 有没有一种方法可以实
  • 将整个文档移动到 iframe 中

    我想做的是将一个完整的网站包装在一个iframe不破坏任何样式或 JavaScript 这是我尝试过的 var frame css position fixed top 0 left 0 width 100 height 100 appen
  • Spring @Autowired 不工作 - BeanCreationException

    当我尝试在服务器上部署文件时发生错误 我很困惑 因为这段代码有效 例外 Failed to enable lec2ear 1 0 ear Unexpected HTTP response 500 Request address gt dep
  • 如何仅使用标准网络库发送 HTTP 响应?

    我正在 Web 编程课程中完成我的第一个作业项目 即用 Java 编写一个简单的 Web 服务器 我正处于来回传输数据的阶段 在未经训练的人看来 我的小型服务器似乎工作正常 但是 我找不到发送适当回复的方法 换句话说 无效的页面请求将显示
  • 现有字符串加倍

    如何将现有字符串更改为双精度字符串 我有这样的代码声明为字符串 但实际上它从数据库获取数字 我正在做数字转换 但现在我不想将其转换为字符串并将其一路获取为数字 private String example1 example1 new Str
  • 我可以拆分grails的config.groovy文件吗?

    由于里面有敏感代码config groovy文件 我担心我的朋友会犯这个文件中的错误 当得到svn更新后 我们也会得到有问题的配置代码 我可以将代码拆分为config groovy是否可以使敏感代码保持不变 而其他代码可以经常更改 在主配置
  • Matlab模拟:点(符号)从起点移动到终点并返回

    我想创建一个动画来演示基于 LDPC 编码和积算法 http en wikipedia org wiki Belief propagation 到目前为止 我已经创建了一个图表 显示符号节点 左 和奇偶校验节点 右 之间的连接替代文本htt
  • 您将如何使用 Sklearn 的 VotingClassifier 进行 RandomizedSearchCV ?

    我正在尝试调整我的投票分类器 我想在 Sklearn 中使用随机搜索 但是 由于我当前使用两种算法 不同的树算法 如何为我的投票分类器设置参数列表 我是否必须单独运行随机搜索并稍后在投票分类器中将它们组合在一起 有人可以帮忙吗 代码示例将受
  • Docker Maven Spotify 插件 - 可以切换到非安全注册表

    我正在使用Spotify Maven 插件 http mvnrepository com artifact com spotify docker maven plugin在执行某些 Maven 目标时自动构建和部署 docker 镜像 但是
  • jQuery if 语句,语法

    什么是一个简单的 jQuery 语句 该语句声明仅当 A 和 B 为 true 时操作才会继续 如果 A 不为真 则停止 如果 A 和 B 为真 则继续 jQuery 只是一个增强 Web 浏览器中 DOM 功能的库 底层语言是 JavaS
  • 使用 org.postgresql.core.Utils.escapeLiteral 足以防止 SQL 注入吗?

    在构建 SQL 查询和更新以提交到我的数据库之前 我需要清理一些用户输入的数据 我知道最好使用准备好的陈述 https www owasp org index php SQL Injection Prevention Cheat Sheet
  • 为什么 C++ 编译器不做更好的常量折叠?

    我正在研究加速大部分 C 代码的方法 该代码具有用于计算雅可比的自动导数 这涉及在实际残差中做一些工作 但大部分工作 基于分析的执行时间 是计算雅可比矩阵 这让我感到惊讶 因为大多数雅可比都是从 0 和 1 向前传播 所以工作量应该是函数的
  • 导入 R. (android)

    我已经通过 Stack Overflow 进行了搜索 因为我知道这是一个常见问题 但似乎没有一个解决方案适合我 这包括清理我的项目 删除所有导入 删除项目并完全重新开始 我正在使用 Eclipse 专门用于 mac 上的 android A
  • 使用最大流算法查找网络的边缘连通性

    我想使用最大流算法 Edmond Karp Ford Fulkerson 算法 找到无向图的边连通性 即要删除以断开图连接的最小边数 我知道我可以通过找到图的每两个节点之间的最小最大流量来完成此任务 但这将导致 O V 2 数量的流量网络
  • Twitter Bootstrap CSS 静态流体表单定位

    我正在使用 Twitter Bootstrap 框架尝试获得如下布局 现在看起来是这样的 jsFiddle 全屏 https jsfiddle net flackend YxKfc show jsFiddle https jsfiddle
  • Spring Boot 关闭钩子

    如何注册 添加在 Spring Boot 应用程序关闭时触发的自定义关闭例程 场景 我将 Spring Boot 应用程序部署到 Jetty servlet 容器 即没有嵌入式 Jetty 我的应用程序使用 Logback 进行日志记录 并
  • 夏令时持续时间

    我有一个对象Shift 有两个字段 startDateTime and endDateTime as DateTime来自乔达时间 我的轮班包括英国夏令时的变化 它开始于25 03 2017 13 00并结束于26 03 2017 02 0