尴尬了,我连根据秒数来计算天数差值都搞不定,求解!

2017-06-22 02:52:13 +08:00
 wl879

是我笨蛋了吗, 计算天数是不是用 “时间戳 / (60 秒 * 60 分 * 24 小时)” (单位是秒)

先请问是我这公式不对吗,如果对,可我计算出来会有问题,如:

2017.6.1 07:00 与 2017.6.1 09:00 所得结果会多出 1 天,什么原因

why,why,why

3983 次点击
所在节点    问与答
28 条回复
Rice
2017-06-22 08:56:29 +08:00
@Rice #20 操,时区……算了
nirocfz
2017-06-22 09:04:17 +08:00
这好像不是个关于时间,更不关于时区的问题

不提这样算天数差值好不好。

光看 那个结果,没多出一天啊,17318.041666666668 - 17317.958333333332 怎么大于 1 了,明明是 0.08333333333575865 (天)

0.08333333333575865 * 60 * 60 * 24 = 7200。7200 秒,两小时,7 点到 9 点
oicebot
2017-06-22 09:05:32 +08:00
是我没睡醒,还是楼主的问题描述有歧义?

到底是问“这两个时间戳的日期差值” 还是“这两个时间戳之间差了多少天”?

如果说是两个时间戳的日期差值,那才是分别把秒换算成 UTC 日期,然后日期相减得出差值……

如果说差了多少天,那肯定是先相减算出差了多少秒,再把秒换算成天(时间长度单位)吧?
lifanxi
2017-06-22 09:07:10 +08:00
你那个算法里面假设了太多的东西,表面上看就是个时区的问题,实际上还有别的问题。要简单一点归避掉时区的问题的话,你可以先做减法再做除法。

然而,我想说的时,任何有关时间的计算,请使用标准库的数据结构与实现,避免依赖本地时间进行计算。自己土法实现的(比如除以 24,除以 60,除以 365 等等),99%都在某种场景下是错的。

因为有关时间,你不但要考虑一般的时区、闰年这种特性,还有考虑闰秒、夏时制、非整数时区等这些稍微有点特殊的场景,还得考虑其它本地时间不连续等更为复杂的场景。这也就是为什么 Linux 系统里有个需要不定期更新的 tzdata 包的原因。
infong
2017-06-22 09:54:38 +08:00
楼主的问题出在这里:
var time1 = new Date("2017-6-1 7:00:00");
var time2 = new Date("2017-6-1 9:00:00");

这里定义的时间是有时区的,通过 time1.toString() 能看到时间是 "Thu Jun 01 2017 07:00:00 GMT+0800 (CST)"
所以 time1 所对应的时间戳为 "Thu May 31 2017 23:00:00 GMT" 的时间戳

猜猜下面输出是什么?
var time3 = new Date('1970-1-1 00:00:00');
console.log(time3/86400);
amlun
2017-06-22 10:48:15 +08:00
talk is cheap,show me the code!
dinghua
2017-06-22 11:37:12 +08:00
我来解释解释;

楼主看到结果一个是 17317.x , 一个是 17318.x, 就认为是两个时间不是在同 1 天。

至于为什么,大家都提了,时区的问题。
hicdn
2017-06-22 17:39:41 +08:00
@wl879

var time1 = new Date("2017-6-1 7:00:00");
var time2 = new Date("2017-6-1 9:00:00");

console.log(time1, time1.getTime() / (60*60*24*1000))

// 输出:Thu Jun 01 2017 07:00:00 GMT+0800 (CST) 17317.958333333332

console.log(time2, time2.getTime() / (60*60*24*1000))

// 输出:Thu Jun 01 2017 09:00:00 GMT+0800 (CST) 17318.041666666668

你这个都是按照浏览器的 +8 时区 输出的本地时间,然而时间戳是按 0 时区算的。
转换成 0 时区
time1 2017.05.31 23:00 GMT+0000
time2 2017.06.01 01:00 GMT+0000

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/370190

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX