天数指的是从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
从上面的经验来看,在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)