R 菜鸟生活篇 夏令时

真令人难以置信,昨天还在下雪,明天凌晨竟然要改夏令时了。谁能告诉我,春天在哪里?藏在小朋友的眼睛里?

夏时制,学名叫做日光节约时制。土木坛子曾经撰文详细介绍过(点我)。大家总是说某天要把表拨快或拨慢一小时,以前我一直弄不清楚到底是拨快还是拨慢,直到有一天发现了一个窍门,才再也不出错了。这个窍门就是:

夏天到的时候,欧洲的时间距离中国更近了。

为啥这就好记呢?因为给家中老人打电话的适宜时间(我睡醒后并且老人睡着前)就多出了一小时。亲近祖国,这跟德国的夏天一样给人的感觉是美好的。美好的感觉是容易记住的。

上面用 R 做出的这张拜罗伊特日出日落时刻图,虚线和实线分别显示的是不使用和使用夏时制的日出日落时刻。很容易看出夏时制的好处:夏天把这一小时往后挪了之后,不至于天亮之后过很久才需要上班,并且下班后距离天黑还有很长时间可以让人去泡吧,泡网,泡妞……不挪到下午的话,这一个小时在早上只够泡个澡。

R 在处理时间数据的时候充分考虑了夏时制,说起来这也是我用 R 处理数据时遇到的一件趣事,至今记忆犹新。由于明天凌晨 2 点钟要把时钟拨到 3 点,因此在德国时间里,2013 年 3 月 31 日 2:00:00 到 2:59:59 这段时间在地球上是不存在的!不信你可以在 R 里边试试,看看这段时间发生了什么:

a <- as.POSIXlt("2013-03-31 03:00:00", tz = "CET") # 中欧时间
a
## [1] "2013-03-31 03:00:00 CET"

# 3 点钟的前一秒难道不是 2:59:59 吗?
a - 1  
## [1] "2013-03-31 01:59:59 CET"

# 换个函数试试。
# a <- strptime("2013-03-31 03:00:00", format = "%Y-%m-%d %H:%M:%S", tz = "CET")
a
## [1] "2013-03-31 03:00:00 CEST"
a - 1
## [1] "2013-03-31 01:59:59 CET"

# 如果我硬来,非要找回 2 点钟呢?
# a <- as.POSIXlt("2013-03-31 02:00:00", tz = "CET")
a
## [1] "2013-03-31 CET"

# 换个函数试试?
a <- strptime("2013-03-31 02:00:00", format = "%Y-%m-%d %H:%M:%S", tz = "CET") # 
a
## [1] "2013-03-31 02:00:00 CET"

# 欧叶!但是......`
a - 1
## [1] NA
# 啊哦。

若要避免这种情况发生,还是强行都设置成 GMT 保险。

话说我上小学的时候正值我国推行夏时制那几年,记忆中仍能嗅到当年时钟调来调去给小学生带来的新鲜和烦恼的味道。我上小学时刚刚出生的那些小孩如今都在跟我一起读博士,聊起来对那几年丝毫没有记忆,这让高龄的我情何以堪啊!

原文链接

comments powered by Disqus