os.time获取的是距离0时区1970年1月1日0时的秒数,即所谓的时间戳。
os.time会考虑具体的时区差,因此这个方法的计算还得考虑具体的时区,目前发现2种可能出现为nil的情况:
1、在0时区的时候 os.time{year=1970, month=1, day=1, hour=0}执行结果为0,而在东八区的时候就返回nil了,因为当0时区0点的时候,其实东八区已经是8点了,所以要想执行结果为0,应写成os.time{year=1970, month=1, day=1, hour=8},而hour写成0肯定是8小,也就是执行结果小于0了。
2、夏令时问题,拿澳大利亚时区举例,澳大利亚夏令时从每年十月的第一个星期天夜间2点开始,全国都将时间拨快1小时,实行夏令时。至四月的第一个星期日结束。 2018年夏令时实施时间就是10.7号2点,也就是说在1:59分的时候,下一分钟会直接跳到3:00,因此对于实施夏令时的澳大利亚地区来说不存在10.7的2:00~2:59这个时间段,当把这个时间作为os.time参数时(os.time{year=2018, month=10, day=7, hour=2}),也是会返回nil.