java处理1927 12 31_java - 为什么将这两次相减(在1927年)会得出奇怪的结果? - 堆栈内存溢出...
正如其他人解释的那样,那里存在时间不连续性。 Asia/Shanghai对于1927-12-31 23:54:08有两种可能的时区偏移,但是对于1927-12-31 23:54:07只有一种偏移。 因此,根据使用的偏移量,可能会有一秒的差异或5分53秒的差异。
偏移量的这种微小变化,而不是我们通常习惯的一小时夏令时(夏季时间),使问题变得有些模糊。
请注意,时区数据库的2013a更新将这种不连续性提前了几秒钟,但是效果仍然可以观察到。
Java 8上新的java.time程序包使用户可以更清楚地看到它,并提供处理它的工具。 鉴于:
DateTimeFormatterBuilder dtfb = new DateTimeFormatterBuilder();
dtfb.append(DateTimeFormatter.ISO_LOCAL_DATE);
dtfb.appendLiteral(' ');
dtfb.append(DateTimeFormatter.ISO_LOCAL_TIME);
DateTimeFormatter dtf = dtfb.toFormatter();
ZoneId shanghai = ZoneId.of("Asia/Shanghai");
String str3 = "1927-12-31 23:54:07";
String str4 = "1927-12-31 23:54:08";
ZonedDateTime zdt3 = LocalDateTime.parse(str3, dtf).atZone(shanghai);
ZonedDateTime zdt4 = LocalDateTime.parse(str4, dtf).atZone(shanghai);
Duration durationAtEarlierOffset = Duration.between(zdt3.withEarlierOffsetAtOverlap(), zdt4.withEarlierOffsetAtOverlap());
Duration durationAtLaterOffset = Duration.between(zdt3.withLaterOffsetAtOverlap(), zdt4.withLaterOffsetAtOverlap());
然后, durationAtEarlierOffset将为一秒,而durationAtLaterOffset将为五分钟53秒。
而且,这两个偏移量是相同的:
// Both have offsets +08:05:52
ZoneOffset zo3Earlier = zdt3.withEarlierOffsetAtOverlap().getOffset();
ZoneOffset zo3Later = zdt3.withLaterOffsetAtOverlap().getOffset();
但是这两个是不同的:
// +08:05:52
ZoneOffset zo4Earlier = zdt4.withEarlierOffsetAtOverlap().getOffset();
// +08:00
ZoneOffset zo4Later = zdt4.withLaterOffsetAtOverlap().getOffset();
与1927-12-31 23:59:59和1928-01-01 00:00:00 ,您会看到相同的问题,但是,在这种情况下,是较早的偏移量会产生较长的差异,而正是有两个可能的偏移量的较早日期。
解决此问题的另一种方法是检查是否正在进行过渡。 我们可以这样做:
// Null
ZoneOffsetTransition zot3 = shanghai.getRules().getTransition(ld3.toLocalDateTime);
// An overlap transition
ZoneOffsetTransition zot4 = shanghai.getRules().getTransition(ld3.toLocalDateTime);
您可以使用isOverlap()检查过渡是否是重叠的(在这种情况下,该日期/时间有多个有效偏移量)或间隔(在这种情况下,日期/时间对那个区域ID无效isOverlap()和isGap()上的方法zot4 。
我希望这可以帮助人们在Java 8广泛可用之后,或者对于那些采用JSR 310反向移植的使用Java 7的人们,解决此类问题。
java处理1927 12 31_java - 为什么将这两次相减(在1927年)会得出奇怪的结果? - 堆栈内存溢出...相关推荐
- oracle 异常返回值,oracle - java.sql.SQLException:无效的列类型:调用具有行类型返回值的函数时为1111 - 堆栈内存溢出...
我在一个名为" MyPackage"的Oracle软件包中有一个函数: FUNCTION MyFunction(name IN VARCHAR2) RETURN MyTable%r ...
- java画个半径为1地圆_java - 绘制一个半径为圆的圆并围绕边缘指向 - 堆栈内存溢出...
圆上的点可以指定为角度θ的函数: x = a + r cos(θ) y = b + r sin(θ) 这里,示出了2π/ 8的增量. 附录:正如@ChristofferHammarström在评论中所 ...
- Java筛选重复名字输出单一的,java - 输入:一个单词的字符串。 打印给定字符串的所有重排,而无需重复。 爪哇 - 堆栈内存溢出...
这是我想到的最简单的方法 String str= "abc"; ArrayList letters = new ArrayList(); HashSet combinations ...
- java处理1927 12 31_为什么减去这两次(在1927年)给出一个奇怪的结果?
正如其他人所解释的那样,那里有一段时间不连续 . Asia/Shanghai 在 Asia/Shanghai 有两种可能的时区偏移,但 1927-12-31 23:54:07 只有一个偏移 . 因此, ...
- 为什么将这两次相减(在1927年)会得出奇怪的结果?
如果我运行以下程序,该程序将解析两个日期字符串,它们分别引用间隔为1秒的时间并进行比较: public static void main(String[] args) throws ParseExce ...
- java随机产生若干个偶数完成求和_java - 创建随机生成器以生成并计算奇数对偶数 - 堆栈内存溢出...
我真的非常困惑. 我已经进行过几次网络搜索,但找不到任何可以帮助我解决这一精确作业问题的信息. 涉及:Java,while循环,随机生成数字和扫描仪控制台输入. 我们必须完成main方法中的代码,以便 ...
- axis2 java客户端内存溢出怎么办_java - Axis2-总是出现404错误 - 堆栈内存溢出
我试图将一些Web服务存根从Metro移到Axis2,但是在使用wsdl2java生成存根后,每次尝试进行服务调用时,我都会不断收到404错误. 16/12/2010 11:14:57 AM org. ...
- java 处理byte_java - 文件到Java中的byte [] - 堆栈内存溢出
===============>>#1 票数:1222 例: import java.io.File; import java.nio.file.Files; File file; // ...
- android和flask交互,java - 当我从Android向Flask Web服务发送参数时,如何解决“ SSL库故障”? - 堆栈内存溢出...
我确实尝试将一些值作为" application / json "从Android应用程序发送到Flask Web服务. 这是我的Java代码 : Thread thread = ...
最新文章
- 题目1176:树查找
- Linux(二)——基础入门(2)
- 常用的Linux命令合集,建议收藏保存!
- jQuery Mobile Data 属性
- pytorch修改tensor的维度(修改为任意维度,或单纯的增减维度)
- 【Flink】Flink Flink 1.14 新特性预览
- java 命名参数动态替换_使用Kettle的命名参数动态执行作业
- (c语言)求x的y次方
- 1145: 零起点学算法52——数组中删数II
- vscode 转到实现方法失效_动图炫技23个鲜为人知的VS Code快捷键
- HashMap底层结构
- npp 插件html,Notepad++中常用的插件
- excel教程自学网_企业Office办公软件自学视频教程word/excel/ppt 2003 2013 2016全套
- 今日头条推荐算法相关博客集合
- 大数据在生活中有什么应用(一)
- 移动200/300M网速只有最高5M/s(3G太快了),提高网速的办法和具体处理方式
- kali虚拟机小键盘区不能使用解决
- UnityShader 图片像素化风格渲染
- Android 5.1.1 源码目录结构说明
- 交易码 MWS X7 会计科目表 XXX 没有在表 T030K 中定义/交易码 VST J2 会计科目表 XXX 没有在表 T030K 中定义