你确信你了解时间吗?
你还记得“软件真的好难做”中的那个有意思的例子吗?那个例子告诉我们软件开发中假设可能会是致命的事。今天,我又在StackOverflow上看到一个关于时间的问题——为什么1927年12月31日的午夜时间这么奇怪?提问题的这个人给了下面的一段java代码(我做一些修改,保证让你可以copy过去就可以编译运行)
我在其中高亮了几行,这个程序就是想比较一下“1927-12-31 23:54:07” 和 “1927-12-31 23:54:08” 差几秒,很明显,是差一秒。但是程序的输出却不是这样的。
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.TimeZone;
class time{
public static void main(String[] args) throws ParseException {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
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);
}
}
下面,让我们来看看程序的输出:(是的,差出353秒钟来)
-1325491905
-1325491552
353
Stackoverflow真的很强大,在大家要求发问者给出时区(中国上海)的15分钟内就解决了这个问题。相当的令人惊叹。原因是什么呢?大家需要围观一下这个网页。(为了怕被墙或是被和谐,我已习惯了抓屏保存,如果有人能开发一个软件能随看随抓,然后如果源被删了可以P2P的从已下载了的人那里获取,那么这个软件应该会很有国内市场。蛋扯远了,Sorry)
从上图中我们可以看到—— 在1927年12月31日23:59:59时,往后面的一秒应该是1928年1月1日 0:0:0,但是这个时间被往后调整了5分52秒,而成了,1927年12月31日的,23:54:08,于是,完成了352秒的穿越。于是我们的Java程序出了这样的一个问题,这真是一个奇迹。
为什么会有这个调整呢?我居然Google不到,不过,我在这个timeanddate.com上查看了一下北京的时间,发现北京的时间只到1970年,于是我猜想,中国近代历史乱七八糟的政权交替可能是这个原因。于是我看 了一下北京和上海物理时差,果然,北京上海的时差在5分50秒左右。因此,我觉得这个时间的变化应该是从上海(南京)时间变成了北京时间。至于你信不信,反正我是信了。
从这个事,我得到下面的一些启示:
Java在的时区实现相当的强大啊。这种细节都能考虑到。
本地时间的完全就是一锅粥,应该尽量不用。
如果你要开发和时区有关系的程序,你的系统里一定要使用GMT标准时间,仅在显示的时候才转成本地时间。
各位无证程序员们,看到这个例子,你们是不是感到编程的压力了?呵呵。
转载于酷壳CoolShell 无删改 仅以此纪念陈皓(左耳朵耗子)
听说开车导航有气压计过高架比较好是不是。 我看了一下不用 root 随便刷机带谷歌框架 支持全网的 目前只有三星 s21 ,大家还有其他推荐吗。 基本上带防水的手机都有气压计…
求传授一点经验 昨晚 10 点多线上出 bug 了,忙到现在 1 点半了。还是我们组长帮我一起看才找到问题了。 碰到 bug 就很慌,担心影响线上业务,束手无策。求大佬指点…
本科毕设,选了导师的深度学习题目-基于多特征融合和深度信念网络的植物叶片识别,在网上找到一模一样的论文,是一篇研究生 2016 年的论文,但是没有相关的训练代码了。 目前来说对…