获取指定时区的天数,小时数

给定一个当前时间对应的epoch,如何获取北京时间(GMT+8)的天数

天数指的是从1970年1月1日0点开始数的天数

看上去很简单,如果有epoch值t表示当前时间,直接用公式(t-0)/86400秒

说明:

1. 0表示1970年1月1日0点对应的秒数

2. 86400秒表示一天的秒数,等于24(小时) * 3600(秒)


但是错了。注意时区不一样。epoch是UTC时区,而我们这里是GMT+8时区。我们想要的天数是从GMT+8时区的1970年1月1日0点开始的天数。GMT+8时区的1970年1月1日0点比UTC时区的1970年1月1日0点早8小时,也就是秒数大8 * 3600 秒。

首先公式里面用的都应该是GMT+8时区的值才准确。epoch代表UTC时区,加上8小时的秒数,就代表GMT+8时区的秒数。我们起个不正式的名字"local epoch", 代表相对于GMT+8时区的1970年1月1日0点开始的秒数。

local-epoch = epoch + 8 * 3600

这样公式变为:

北京时间自1970年1月1日0点开始的天数 = local-epoch/86400


给定一个当前时间对应的epoch,如何获取北京时间(GMT+8)的小时数

从上面的经验来看,在GMT+8时区,所有数都应该转换成对应的时区。

因此应该获取local epoch,然后计算当天的小时数。

不过newlisp提供了函数(date-list),经过测试可以方便的使用。

下面先获得GMT+8时区的时间字符串"20160708 234913"对应的epoch, 然后获得local epoch, 最后用date-list函数获得小时,第4个元素:23

> (datetime-str-to-epoch "20160708 234913""%Y%m%d %H%M%S" (* 8 3600))
1467992953
> (date-list (+ 1467992953 (* 8 3600)))
(2016 7 8 23 49 13 190 5)

现在来验证一下比较早的时间

> (datetime-str-to-epoch "20160708 004913""%Y%m%d %H%M%S" (* 8 3600))
1467910153
> (date-list (+ 1467910153 (* 8 3600)))
(2016 7 8 0 49 13 190 5)

0点也正确。


下面是完整的示例

#!/usr/bin/newlisp

(setq epoch (date-value))
(setq time-offset (* 8 3600))
(setq cn-epoch (+ epoch time-offset))
(setq cn-day-index (/ cn-epoch 86400))
(setq cn-hour-index ((date-list cn-epoch) 3))

(println "epoch: " epoch)
(println "time-offset: " time-offset)
(println "cn-epoch: " cn-epoch)
(println "cn-day-index: " cn-day-index)
(println "cn-hour-index: " cn-hour-index)

(exit)

结果输出为:

epoch: 1479954759
time-offset: 28800
cn-epoch: 1479983559
cn-day-index: 17129
cn-hour-index: 10


你可能感兴趣的:(#,时间日期)