我被这个浏览了 746000 次的问题惊住了

【python】epub的电子书繁体字与简体字转换 中文繁体与简体转换 阅读详情

给大家分享一个我最近发现的有点意思,但是卵用不大的小知识点。

先给你搞个程序看一下:

public class MainTest {

    public static void main(String[] args) throws Exception {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = simpleDateFormat.parse("1900-01-01 08:00:00");
        System.out.println(simpleDateFormat.format(date));
    }
}

你说上面的程序逻辑就是一个简单的时间格式化,你说输出结果是什么?

只是需要瞟一眼就知道,肯定是输出这个结果呀:

1900-01-01 08:00:00

但是,你把上面的程序拿出来,直接跑起来,你会发现输出结果竟然是这样的:

1900-01-01 08:05:43

当时就懵逼了。

我知道时差 8 小时,是因为有时区问题。

我知道时间差 1 小时,是因为有夏令时的原因。

但是这里差了 5 分 43 秒,有零有整,就让我有点摸不着头脑了。

上面这个案例就是一个读者分享给我的,他们在数据库里面默认时间是 1900-01-01,再加上时区问题,刚好变成了 1900-01-01 08:00:00,于是在通过程序做数据迁移的时候就踩到了这个莫名其妙的时间问题。

同时他还给我附送了一个关于这个 bug 的链接:

https://bugs.openjdk.java.net/browse/JDK-8266262

我乍一看,这个 bug 还挺新的呢,属于今年提出来的。

仔细又看了一眼发现是和之前的 bug 重复了:

但是这里提到了原因:

他说可以看一下这个链接 https://www.timeanddate.com/time/zone/china/shanghai?year=1900

这里面,在 1900 年的时候,发生了一个变化:

The timezone offset was UTC +8:05:43 hours all of the period.

虽然我没太看明白具体是什么意思,但是我看到了“5 分 43 秒”:

我理解就是由于时区的变化,导致时间发生了重置。

接着我顺藤摸瓜,在 stackoverflow 上找到了这个:

https://stackoverflow.com/questions/6841333/why-is-subtracting-these-two-times-in-1927-giving-a-strange-result

当时我就震惊了。

这个 10 年前被提出的问题居然已经被浏览过 746k 次了,非常热门的问题了,我居然没注意到过:

这个问题具体是这样的:

你就大概瞟一眼,我给你翻译翻译。

提问者说,他发现 1927-12-31 23:54:07 到 1927-12-31 23:54:08 之间差了 353 秒,按理来说应该是 1 秒才对啊?

但是把时间改成下面这样,又正常了:

String str3 = "1927-12-31 23:54:07";  
String str4 = "1927-12-31 23:54:08";

我把程序粘出来你也可以跑一下,看看结果非常的神奇啊:

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(ld4-ld3);
}

但是当我跑了一遍之后,我发现:我去,说好的 353 秒呢?

跑出来怎么是 1 秒呢,毫无毛病啊:

我甚至怀疑是 jdk 版本的问题,于是我换了 jdk 9,11,15 都跑了一下,都是 1 秒。

这就很奇怪了啊。

感觉这个问题提的就有问题啊。

但是当我读了下面最高赞的答案之后,我才仿佛窥见了一点端倪。

这个回答比较长,我先全部截图下来给你看看:

比较长的原因是作者修改了几次回答。

为什么会修改回答呢?

且往后看吧,一切的答案都藏在这里面。

我选关键的给你说。

首先看第一段:

他说(1927年) 12 月 31 日的时候,上海的时区发生了变化。

而关于 1927 年上海的详细情况,他附上了一个超链接,这个超链接就是前面出现的网站,点进去之后是这样的:

但是这个里面显示:

No further time changes in 1927 in Shanghai

翻译过来就是:1927 年上海的时间没有进一步变化。

这特么就和他下面说的那一坨内容对不上了啊?

他下面说,在 1927 年底的午夜时分,时钟往回走了 5 分 52 秒。因此,"1927-12-31 23:54:08"实际上发生了两次,而 Java 取的是第二次的的时刻,因此存在差异。

看到这里其实我都懵逼了,这玩意前后不符啊,于是我又接着开始搜索。

直到我发现了这个:

https://coolshell.cn/articles/5075.html/comment-page-2#comments

这也是十年前的文章。

这里面作者把当时网站截了个图:

当年的截图显示:

在1927年12月31日23:59:59时,往后面的一秒应该是1928年1月1日 0:0:0,但是这个时间被往后调整了5分52秒,而成了,1927年12月31日的,23:54:08,于是,完成了352秒的穿越。

这说明了什么?

说明数据发生了篡改,有人篡改了网页上的信息!

到底是怎么回事呢?

我们回到 stackoverflow 接着往下看:

这是他第一次修改回答,因为 History changes...

历史发了变化了...

他这里说,如果用 TZDB 的 2013a 版本的数据,原来的问题将不再表现出完全相同的行为。

在 2013a 中,结果将是 358 秒,过渡时间为 23:54:03,而不是 23:54:08。

他提到了一个 TZDB,这是个啥东西呢?

我也不知道,但是我搜索了一下。

他应该说的是这个的东西。

https://www.iana.org/time-zones

看名字你也知道了,它是一个时区数据库,里面应该是维护的时区相关的数据。

也就是说,在这个时区数据库里面,用 2013a 版本的数据,前面的代码就是另外一种输出了。

也就是说数据确实发生了变化。

而关键的回答在于下一次编辑:

History has changed again...

历史再次发生了变化。

在这个时区数据库里面,2014f 版本中,变化的时间已经移到了1900-12-31,现在只是一个 343 秒的变化。

343 秒?

不就是我们前面的 5 分 43 秒吗?

好了,现在时差能对上了,343 秒,但是时间还是没对上啊。

我们的测试时间 1900-01-01 08:00:00,他这里写的时间是 1900-12-31。

差了整整一年呢?

好,我们看他最后一次编辑的内容:

我个人理解他要表达的意思是这样的。

Java 为了在时区上统一标准,所以来了个一刀切的政策。

统一的标准就是让 UTC 时区下 1900 年之前的任何瞬间都是标准时间。

至于产生的时差嘛...

就在最开始的时候补上去吧。

所以,1900-01-01 00:00:00 加上 8 小时时差,是 1900-01-01 08:00:00,在这个基础上预先加上 27 年后来自 1927-12-31 那个午夜由于时间回拨带来的 343 秒。

1900-01-01 08:05:43,我个人认为就是这样来的。

而前面 stackoverflow 里面对应的那个程序,我们现在执行是输出 1,但是在 10 年前,输出结果确实是 353 。

就像我把程序改成这样:

最终的输出结果不是 1,而是 -342。

时间,发生了“倒流”。

好了,又是一个没啥卵用的知识点。

最后,再补充两个冷知识。

第一个是我在 jdk bug 列表里面追溯了一下,能找到最早提出相关问题的时间是 2005 年:

https://bugs.openjdk.java.net/browse/JDK-6281408

在这个里面,官方是这样回复的:

这个问题不会被修复,以避免任何兼容性问题。

意思就是:问题我知道了,但是这玩意不太好弄,bug 先变成 feature 吧,就先这样吧。

别问,问就是有历史原因在里面。

第二个冷知识是,前面提到的,时区在 1927 年发生了变化。

你知道为什么吗?

我在某网站上找到了这样的描述:

https://zh.wikipedia.org/wiki/%E4%B8%AD%E5%9C%8B%E6%99%82%E5%8D%80

1928 年,就是民国 17 年。

那一年,中共军史上最早的红军,中国工农红军第四军成立。

那一年,毛主席在井冈山建立农村革命根据地。

那一年,星星之火,已成燎原之势。

postman响应体:“msg“: “请求缺失签名Sign“、 “msg“: “请求缺失时间戳“ 请求标头有Sign、Timestamp,但是直接将网址复制到postman时,Headers没有自动生成这两个参数,所以运行时会报错。 阅读详情

相关推荐

S32DS IDE调试技巧:如何用Attach功能高效定位汽车电子MCU的Bootloader问题

本文详细介绍了在汽车电子MCU开发中,如何利用S32DS IDE的Attach调试模式高效定位Bootloader与应用程序的协同问题。通过对比常规调试与Attach模式的本质差异,并深入讲解工程配置、镜像合并及实战调试流程,帮助开发者在不复位、不重新下载程序的前提下,实时分析系统状态,快速解决内存映射冲突、中断向量表重定向等疑难杂症。

weixin_29168393的博客 265

java 和 javascript 对于 1900-01-01 00:00:00时间转换问题

java 和 javascript 对于 1900-01-01 00:00:00时间转换问题

DREAM_BOAT_1的博客 520

UWB灵犀遥控器方案介绍

UWB灵犀指向遥控器的技术原理和方案介绍

xiongdauwb的博客 3898

java 1900年_JDK与1900年01月01日

引子最近使用Spark SQL读取Date类型(精度为天)的数据时发现一个很有意思的问题:0: jdbc:hive2://0.0.0.0:10000> select cast('1900-01-01' as Date);+-------------+--+| _c0 |+-------------+--+| 1899-12-31 |+-------------+--+1 r...

weixin_39747049的博客 962

SpringBoot+Flowable 6.8.0实战:5分钟搞定免登录流程图设计器

本文详细介绍了如何通过SpringBoot与Flowable 6.8.0深度整合,快速实现免登录流程图设计器的集成方案。通过排除默认安全配置、自定义安全策略和用户模拟服务,开发者可在5分钟内完成设计器的部署,适用于快速原型开发和企业内部工具搭建。

weixin_29204205的博客 278

从零开始:手把手教你检查并更新英伟达GPU驱动和CUDA版本(Windows/Linux双平台)

本文详细指导如何在Windows和Linux系统上检查并更新英伟达GPU驱动和CUDA版本,解决版本不匹配导致的常见问题。涵盖驱动更新、CUDA Toolkit安装、版本冲突排解及性能优化技巧,帮助开发者高效管理GPU计算环境。

weixin_29237635的博客 701

奇怪的日期,丢失的5分52秒?

一个网友问到,我无法回答原因,求助大家了。论坛求助地址为:http://topic.youkuaiyun.com/u/20081103/06/af2335b0-5bd3-442e-99e8-2f59621d1bc9.htmlimport java.text.DateFormat;import java.text.SimpleDateFormat;public class Test {  public stat

老紫竹的专栏 2064

windows一键安装部署wvp-GB28181-pro视频监控平台

我们可以看到redis、mysql、zlm和wvp都正常运行了。该ip需要修改为wvp服务安装的 服务器的IP。默认用户名和密码分别为admin和admin。

zengliguang的专栏 5746

java.util.Calendar不能正确处理中国标准时间的"1900-01-01 08:00:00 000"

先来看看测试代码: import java.util.Calendar;import java.util.GregorianCalendar;public class TestDate ...{    public static void main(String[] args) ...{        Calendar cal = Calendar.getInstance();    

蛋蛋的窝 4746

华为OD机试真题 新系统 2026-04-26 Python&JS 实现【最大化游戏试玩资格分发】

新研发了一台游戏设备可以面向用户接受试玩。现有 n 个试玩申请,每个试玩有开始时间和结束时间。作为协调员,为了能让更多人体验到游戏,你需要对试玩申请进行选择,使得:

MISAYAONE的博客 289

华为OD面试八股文嵌入式C语言基础问题及答案(一)

本文总结了C语言编程中的10个关键知识点:1.宏定义MIN的实现方法;2.嵌入式无限循环的两种写法;3.变量a的8种不同定义方式;4.static关键字的三种作用;5.const关键字的含义和使用场景;6.volatile关键字的含义及三个应用实例;7.变量存储位置(栈区、静态区、堆区);8.32位系统指针位数;9.局部与全局变量重名规则;10.引用与指针的三点区别。这些内容涵盖了宏定义、变量声明、存储类别、指针等C语言核心概念,对嵌入式开发和系统编程具有重要参考价值。

m0_50382756的博客 160

我被这个浏览了 746000 次的问题惊住了!

给大家分享一个我最近发现的有点意思,但是卵用不大的小知识点。先给你搞个程序看一下:publicclassMainTest{ publicstaticvoidmain(...

HollisChuang's Blog 529

独家开源|RK3588 平台 YOLOv5 Android 源码级解析:NPU 量化、多线程与目标跟踪实战

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

m0_71589036的博客 193

GE VMIVME-7750-746000 VME64x单板计算机

摘要:GEVMVME-7750-746000是一款高性能VME64x单板计算机,采用PowerPC架构和传导冷却设计,专用于航空航天、军事和工业等恶劣环境中的实时控制与数据采集系统。该产品具有微秒级确定性响应能力,兼容传统VME模块,支持VxWorks/LinuxRT系统,符合MIL-STD-810抗冲击振动标准,能在-40°C至+71°C温度范围内稳定工作。其无风扇设计确保了长期可靠性,典型应用于卫星测试台、核设施控制等需要数十年稳定运行的场景。

guangzhouqiming的博客 531

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

笑出腹肌的注释,都是被代码耽误的诗人!

往期热门文章:1、CTO 说了,用错 @Autowired 和 @Resource 的人可以领盒饭了 2、100G内存下,MySQL查询200G大表会OOM么? 3、使用MySQL,请用好...

Java后端技术 316

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Stack Overflow,轰然倒下!

你好呀,我是歪歪。 前几天看到一个让我感慨万千的走势图: 本来想让你猜一猜这个走势图的内容是什么的。 但是结合标题你应该也能猜到了,和 Stack Overflow 有关。 这个走势图的数据是 Stack Overflow 从 2008 年开始到现在,每个月新问题的个数。 数据的来源是这个网站: h

cmdos的专栏 98

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

万万没想到之代码出错了?

一、背景 今天碰到两段有意思的代码,分享一下。你认为的“理所当然"是对的? 二、出乎意料的代码一 直接上代码: public static void main(String[] args) { TimeTest test = new TimeTest(); test.timeTest(); } public void timeTest() throws ParseException { SimpleDateFormat sim

无痕之剑的书橱 290

公司规定所有接口都用 POST请求,这是为什么?

往期热门文章:1、我被这个浏览了 746000 次的问题惊住了! 2、腾讯三面:40亿个QQ号码如何去重? 3、自从用完Gradle后,有点嫌弃Maven了!速度贼快! 4、一个员工的离职...

Java后端技术 417

字节终面:两个文件的公共URL怎么找?

往期热门文章:1、留在一线,逃离一线?我从上海举家回成都的生活经历告诉你 2、公司规定所有接口都用 POST请求,这是为什么? 3、我被这个浏览了 746000 次的问题惊住了! 4、腾讯...

Java后端技术 487

Stack Overflow,轰然倒下

前几天看到一个让我感慨万千的走势图:本来想让你猜一猜这个走势图的内容是什么的。但是结合标题你应该也能猜到了,和 Stack Overflow 有关。这个走势图的数据是 Stack Overflow 从 2008 年开始到现在,每个月新问题的个数。数据的来源是这个网站:它可以以 SQL 的形式查询相关的数据。从走势图可以看到,从 2008 年到 2014 年是陡增的趋势,可以说是高歌猛进,翻着翻的上涨。2014 年到 2020 年,数据起起伏伏,但总比 2020 年之后的一泻千里好的多。

m0_73735578的博客 859
上一篇: 当我看源码的时候,我在想什么?
下一篇: 裂开了,一次连接池参数导致的雪崩问题
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值