BIOS时间与系统时间(windowslinux时间同步问题)
写作动机
linux怎么读取windows文件
  双系统是不少⼈喜欢的⽅式,但安装双系统之后⼀般会出现两个系统时间不⼀样的问题,刚开始⽤双系统的时候也没怎么在意,就是装上后在⽹上相关解决⽅法,复制粘贴代码完事⼉。但是次数多了就有点烦了,每次都这样搞问题倒是解决了但是不知道原理。
  最近⼏次发现解决⽅法发⽣了改变,和之前的⽅法不⼀样了,于是打算⼀探究竟。如果你想了解原理请仔细阅读,句句都是重点。
  注意:以下并没有解决问题的实际代码,因为本⽂章是讲原理的!
术语解释
  设备上的时间:⼀是系统时间(Local time),⼀是硬件时间(RTC)。系统时间指操作系统的时间,可以认为就是我们看到的时间;硬件时间指 BIOS 中的时间,这⾥不解释 BIOS 是啥了(你可以认为是和操作系统同时且独⽴运⾏的另⼀个系统)。也就是说这俩可以有⾃⼰的不同的时间。
  真实的时间:世界统⼀时间(UTC),本地时间(中国=CST/UTC+8)。世界统⼀时间指地球上所有时间都以
⼀个地⽅的时间为基准,本地时间指在不同的地区根据世界时间作调整。具体怎么个算法不懂的⾃⼰去搜。
问题产⽣原因
  真实世界的时间不会出现问题,当我们知道中国处于东⼋区时世界时间就和本地时间绑定了,有 [本地时间=世界时间+8] 。
  系统时间和硬件时间就可能出现问题,系统时间虽然可以从⽹络同步,但在未联⽹时也需要显⽰时间啊,所以操作系统启动时需要读取硬件时间(BIOS中的时间⼀直在⾃同步)。
  问题就在于这两个系统对硬件时间的看法不⼀样 : ) 。Windows 认为硬件时间是本地时间,也就是取出来直接显⽰就对了;⽽ Linux 则认为硬件时间是世界时间,取出来再根据时区进⾏ "+8" 操作之后再显⽰才对。
  根据以上描述可以推断,双系统设备中的 Linux 系统时间将⽐ Windows 系统中的时间快⼋⼩时。
  另外如果你的设备上并不是这种情况,请根据以上原理⾃⾏查原因,并可参考如下所述的解决⽅案⾃⾏操作。
两⼤主流解法
  ⼀为修改 Linux 系统中的标准
    较早版本中通过修改配置⽂件,新版本中通过 "timedatectl" 进⾏控制,最终结果其实也是形成了⼀个配置⽂件,以便在以后系统取时间时使⽤正确的算法。
    其它⽂档说这个版本界限在Ubuntu中是 16.04 ,请⾃测。
  ⼀为修改 Windows 系统中的标准
    通过修改⼀个注册表参数来控制其系统时间,原理应该也是和 Linux 系统中⼀样的吧。
  这两种修改⽅法都可以使两个系统显⽰的时间是本地时间,其原理是统⼀这两个系统对于硬件时间的认知标准。
  我不建议修改 Windows 的配置⽂件,不是我认为 Windows 的标准是对的,⽽是觉得 Linux 更适合折腾。
偏门解法
  在查这个问题的时候发现了⼀些有意思的解法,其中有⼀个是修改系统中的时区。
  ⽐如 Linux 系统中使⽤了 [世界时间+8] 来计算显⽰错误,那么是因为其认为这⾥是 "UTC+8" 所以应该显⽰ [世界时间+8] 之后的时间;解决⽅案是设置 Linux 中时区为 "+0" 的时区,那么显⽰结果为 [世界时间+0]。恕我直⾔,这解法真是......太可爱了 0.0
  按照上述解法的思维,我也可以先在 Linux 系统同步时间⾄正确,然后再将 Windows 系统的时区设置为 "+16" 的时区,也可以使两个系统都显⽰正确,可能因为实际没有 "+16" 的时区,不然还真有这种解法呢。
⼀些思考
  操作系统启动后都需要去读取硬件时间,但硬件时间到底应该是世界时间还是本地时间呢?这个要真要有个能说了算的那⼀定是 BIOS 的创造者了,不过估计当时可能也没考虑到这个问题,毕竟时间这个东西也不是 BIOS 的主要功能,⾄于现在不同操作系统能否统⼀标准也不是我能说了算的......
  另外其实任何系统都完全有能⼒解决这个问题,但不知道为啥都视⽽不见
  这⾥⽃胆建议⼀下 Linux 系统下可⽤的解决⽅案:
    ⼀可在系统安装(假设Linux后安装)时,时区选择后让⽤户确认真实时间是 [硬件时间] 还是 [硬件时间+时区] ,再根据选择修改配置⽂件
    ⼆可在系统已经完成安装的情况下,当⽤户多次⼿动校准时间(⼿动设置或⽹络校准)时,计算校准前后时间差是否和时区值基本相等,以此判断硬件时间是否是本地时间
最后
  知识还是那么些知识,其它技术⽂档⾥基本都能到,我只是⽤⾃⼰的思维重新表述⼀下,⼀来做个笔记,再者希望可以帮助到别⼈
  原创⽂章,转发请注明