`
mycream
  • 浏览: 55429 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java Date 类的一个神级误差

    博客分类:
  • JAVA
 
阅读更多

源自 Stack Overflow 的一个问题,原文点此外连接

问题很简单,跑如下代码:

 

public static void main(String[] args) throws ParseException {
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    String str3 = "1927-12-31 23:54:07";  
    String str4 = "1927-12-31 23:54:08";  
    Date sDt3 = sf.parse(str3);  
    Date sDt4 = sf.parse(str4);  
    long ld3 = sDt3.getTime() /1000;  
    long ld4 = sDt4.getTime() /1000; 
    System.out.println(ld3);  
    System.out.println(ld4);  
    System.out.println(ld4-ld3);
}

 预期 ld4 - ld3 的结果为 1。然后实际结果是:

 

-1325491905
-1325491552
353

即 Java 中 1927年12月31日 23时54分07秒 与 1927年12月31日 23时54分08秒存在 353 秒的误差。

 

导致问题的原因解答如下:

 

 写道
See this page for details of 1927 in Shanghai. Basically at midnight at the end of 1927, the clocks went back 5 minutes and 52 seconds. So "1927-12-31 23:54:08" actually happened twice, and it looks like Java is parsing it as the later possibly instant for that local date/time - hence the difference.

Just another episode in the often weird and wonderful world of time zones.

 写道

此外查看1927年上海时区详情。简单的说在1927年最后一天的午夜,标准时间被回调了5分52秒。所以"1927-12-31 23:54:08"确切地说出现了两次。现在看来,Java 对这一时间的解析采用了“晚点”的本地时间实现,用以区分。

这只是又一个关于时区的神秘而神奇的案例。

 

代码的世界,无奇不有。有些东西,你不知道,你就真的不知道啊。呵呵

分享到:
评论

相关推荐

    Java 计算两个日期之间相差的月数

    在Java编程语言中,计算两个日期之间相差的月数是一个常见的任务,这通常涉及到日期处理和时间计算。本文将深入探讨如何使用Java实现这个功能,包括标准库中的API以及一些高级方法。 首先,Java 8引入了`java.time`...

    27个java常用的工具类

    为了提高开发效率,Java提供了一系列的工具类,这些类通常包含了各种实用方法,可以帮助开发者简化代码,提高代码的可读性和可维护性。下面将详细介绍这27个常用的Java工具类及其关键知识点。 1. **Arrays**: 这个...

    Java Date Time 教程-时间测量.docx

    `System.currentTimeMillis()`函数是Java提供的一个基础时间测量工具,它返回自1970年1月1日午夜(UTC)以来的毫秒数。然而,这个方法并不提供微秒级别的精度,因此在连续多次调用之间可能会存在不精确性。为了获得...

    达内JAVA培训综合笔记

    多线程是Java编程中一个重要的高级特性,笔记中详细介绍了Thread线程类及多线程的使用,以及线程池的概念,这些都对于编写高效、可维护的并发程序至关重要。同时,还涉及了Socket网络编程和双缓冲队列,这些是构建...

    java8帮助文档中文版API

    4. **日期和时间API**:Java 8用`java.time`包替换了过时的`java.util.Date`和`java.util.Calendar`,提供了`LocalDate`, `LocalTime`, `LocalDateTime`, `ZonedDateTime`等新类,以及`Duration`和`Period`来处理...

    28个java常用的工具类

    在Java编程语言中,工具类库是程序员日常工作中不可或缺的一部分,它们提供了许多实用的功能,可以极大地提高开发效率。以下是对28个Java常用工具类的详细介绍: 1. **Arrays**: 提供了对数组进行操作的各种静态...

    java1.8中文文档 谷歌翻译版

    1. Date 和 Time API:Java 8 引入了全新的 java.time 包,提供了更强大和易用的时间日期处理功能,包括 LocalDate、LocalTime 和 LocalDateTime 等类,取代了旧的 java.util.Date 和 Calendar 类。 2. Nashorn ...

    java jdk api 中文文档 谷歌翻译 1.8

    Java JDK 1.8是Java的一个重要版本,它引入了许多新特性,包括: 1. **Lambda表达式**:这是Java 8最具代表性的新特性,允许开发者以简洁的方式处理函数式编程。Lambda表达式可以作为方法参数,或者存储在变量中,...

    Java实用经验总结--日期、数字篇

    - Java 提供了 `NumberFormat` 类用于数字的格式化,如 `DecimalFormat` 是一个子类,用于处理十进制数字。例如,`DecimalFormat df = new DecimalFormat("#.00")` 可以将数字格式化为两位小数。 - 对于数学运算,...

    java 写的定时器

    `TimerTask` 是一个抽象类,需要我们继承并重写 `run()` 方法来定义要执行的任务。 ```java import java.util.Timer; import java.util.TimerTask; public class TimerExample { public static void main(String...

    JAVA_API_1.8帮助文档google翻译

    Java 1.8是Java发展中的一个重要里程碑,引入了许多新的特性和改进。以下是一些关键知识点: 1. **Lambda表达式**:Java 1.8引入了lambda表达式,这是一种简洁的匿名函数写法,使得处理函数式接口变得更加方便,...

    java复习题总结.docx

    未重写`equals()`时,它会调用Object类中的`equals()`方法,比较的是两个对象的内存地址是否相同,即是否为同一个对象。 6、Java8新特性 Java8引入了Lambda表达式、函数式编程、Stream API、Date和Time API、默认...

    Java实现时间动态显示方法汇总

    在`TimeFrame`的构造函数中,创建一个`Timer`实例并调用`scheduleAtFixedRate()`方法,将`JLabelTimerTask`作为参数传递,设定初始延迟(new Date())和周期(ONE_SECOND,即1000毫秒)。`scheduleAtFixedRate`确保...

    java农历与阳历互转.doc

    ### Java农历与阳历互转知识点...综上所述,`ChineseCalendar` 类提供了一个简单而有效的框架来实现农历与阳历之间的转换。通过理解上述数据结构和算法逻辑,开发者可以更好地掌握这一功能,并将其应用于实际项目中。

    java中每月等额与先息后本计算

    `MoneyUtils.MATHCONTEXT`通常是一个预定义的`MathContext`对象,用来控制计算的精度。 总之,理解并正确计算每月等额与先息后本的还款方式对于借贷双方都至关重要,它涉及到财务规划、风险管理和成本控制。在Java...

    获取当前时间农历················

    在IT行业中,获取当前时间的农历是一个常见的需求,特别是在开发涉及到日期和时间处理的应用程序时。农历,又称阴历,是中国传统的一种历法,与阳历(即公历)不同,它以月相的变化周期为基础,同时考虑了太阳对地球...

    JDK 1.8 api文档英文版

    这份英文版文档对于深入理解Java语言和其库功能至关重要,尤其是在某些中文翻译可能存在误差的情况下。** **一、Java基础** JDK 1.8 API文档详细阐述了Java的基本概念,包括数据类型(如原始类型和引用类型)、控制...

    JDK 1.8 API 文档(纯英文版本)

    8. **日期和时间API**:Java 8引入了新的`java.time`包,取代了原有的`java.util.Date`和`Calendar`,提供了更加直观和强大的日期、时间处理能力。 9. **Lambda表达式和函数式编程**:Java 1.8引入了Lambda表达式,...

    2021-2022计算机二级等级考试试题及答案No.15623.docx

    ` 这表示创建一个一维数组,其中每个元素都是一个数组,这里没有指定第二维的长度,可以在初始化时具体指定。 4. Word 格式栏上的 B、I、U 分别代表粗体、斜体和下划线,它们是用于格式化文本的工具。 5. 运行 ...

    jdk1.8中文版

    JDK 1.8是Java编程语言的一个重大版本,发布于2014年,它引入了许多新特性、改进和优化,极大地提升了Java的生产力和性能。此中文版是基于JDK 1.8的API文档,通过谷歌翻译为中文,虽然可能存在一些翻译不准确的地方...

Global site tag (gtag.js) - Google Analytics