Javascript 将自历元起的天数转换为自历元起的秒数

Javascript 将自历元起的天数转换为自历元起的秒数,javascript,timestamp,time-t,Javascript,Timestamp,Time T,在我的新工作场所,它们代表了许多从纪元开始的日期,我以后称之为DSE。我在JavaScript中遇到了从DSE转换为秒的问题,因为UNIX时间戳已经存在。下面是我执行转换的函数: function daysToTimestamp(days) { return Math.round(+days * 86400); } 举个例子,当我通过13878,期望这代表2008年1月1日时,我得到了1199059200,而不是我期望的1199098800。为什么?这是因为它既不是时间的线性表示,也不

在我的新工作场所,它们代表了许多从纪元开始的日期,我以后称之为DSE。我在JavaScript中遇到了从DSE转换为秒的问题,因为UNIX时间戳已经存在。下面是我执行转换的函数:

function daysToTimestamp(days) {
    return Math.round(+days * 86400);
}

举个例子,当我通过13878,期望这代表2008年1月1日时,我得到了1199059200,而不是我期望的1199098800。为什么?

这是因为它既不是时间的线性表示,也不是UTC的真实表示,尽管它经常被误认为是UTC,因为它表示的时间是UTC,但它无法表示UTC闰秒


1199059200代表UTC 2007年12月31日。Python会话示例:

>>> import time
>>> time.gmtime(1199059200)
(2007, 12, 31, 0, 0, 0, 0, 365, 0)
请记住,所有时间值都与UTC相反:你必须根据你的时区进行相应的调整

编辑:由于您和我都在新西兰,以下是您获得1199098800值的方式:

>>> time.localtime(1199098800)
(2008, 1, 1, 0, 0, 0, 1, 1, 1)
这是因为在新西兰的新年夏季,这里的时区是+1300。做数学题,然后看-

对于UTC 2008年1月1日,将86400添加到1199059200,并获得1199145600

>>> time.gmtime(1199145600)
(2008, 1, 1, 0, 0, 0, 1, 1, 0)

自1970年1月1日起,Unix时间以秒表示,而不是以毫秒表示


我想你看到的是时区的不同。你的增量是11小时,你是如何得到期望值的?

你应该乘以86400000


1天=24小时*60分钟*60秒*1000毫秒=86400000

因为1199098800/86400=13878.4583333333,3永远重复,而不是13878.0。它被舍入到13878.0,因为它被存储为整数。如果您想了解它的不同之处,请尝试以下操作:.4583333333*86400=39599.999999712。即使这样也有点不正确,但这就是差异的来源,因为1199098800-1199059200=35600。

我不明白为什么要四舍五入。请您解释一下好吗?可能是因为他们也可以使用分数日期。注:自大纪元起为非闰秒。普夫兰扎的评论是正确的,但不是你问题的原因。我不会代表OP发言,但他利用mktime达到这个目的的可能性很大。还有一个关于在mktime之上实现mkgmtime的线程,但它很难看: