python 函数返回 javascript 的 date.getTime()
我正在尝试创建一个简单的Python函数,目的是让它返回和JavaScript中new Date().getTime()
方法一样的值。正如这里所说,JavaScript的getTime()方法返回的是从1970年1月1日到现在的毫秒数。
所以我简单地写了这个Python函数:
def jsGetTime(dtime):
diff = datetime.datetime(1970,1,1)
return (dtime-diff).total_seconds()*1000
这里的参数dtime是一个Python的日期时间对象。
但是我得到的结果是错误的。我的计算出了什么问题呢?
2 个回答
JavaScript 的日期处理方式可能和你想的不一样,但你的 Python 代码是正确的。
根据 这个时间戳列表,2010年1月1日的时间戳应该是:
1262304000
Python: (看起来是正确的)
>>> (datetime(2010,1,1) - datetime(1970,1,1)).total_seconds()
1262304000.0
JavaScript: (看起来是错误的)
> new Date(2010,1,1).getTime()
1265011200000
或者
> new Date(2010,1,1).getTime()/1000
1265011200
这是因为 JavaScript 的日期处理方式和你预期的不一样。首先,它是根据你当前的时区来创建日期,而不是使用 UTC 时间。所以在 JavaScript 中获取当前时间时,得到的是客户端的时间,而 Python 返回的是 UTC 时间。此外,JavaScript 的日期处理还有一个小问题,就是月份是从 0 开始计算的,而不是从 1 开始。
> new Date(2010,1,1,0,0,0,0)
Date 2010-02-01T08:00:00.000Z
> new Date(2010,0,1,0,0,0,0)
Date 2010-01-01T08:00:00.000Z
JavaScript 可以从时间戳创建日期:
> new Date(1262304000000)
Date 2010-01-01T00:00:00.000Z
这是正确的。
另外,你可以使用以下的 JS 函数来获取更准确的时间,请注意月份仍然是从 0 开始,而不是 1。
> Date.UTC(2010,0,1)
1262304000000
我想在这里强调一点:如果你想让客户端的时间和服务器的时间保持一致,你需要把服务器的时间传给客户端,并用这个时间作为参考。否则,由于每个客户端或网页浏览器都在不同的机器上运行,拥有自己的时钟,你们的时间总会有些不同。不过,通常我们会使用统一的方式来参考时间,比如用“纪元毫秒”来在客户端和服务器之间进行同步。
Python代码示例:
import time, datetime
def now_milliseconds():
return int(time.time() * 1000)
# reference time.time
# Return the current time in seconds since the Epoch.
# Fractions of a second may be present if the system clock provides them.
# Note: if your system clock provides fractions of a second you can end up
# with results like: 1405821684785.2
# our conversion to an int prevents this
def date_time_milliseconds(date_time_obj):
return int(time.mktime(date_time_obj.timetuple()) * 1000)
# reference: time.mktime() will
# Convert a time tuple in local time to seconds since the Epoch.
mstimeone = now_milliseconds()
mstimetwo = date_time_milliseconds(datetime.datetime.utcnow())
# value of mstimeone
# 1405821684785
# value of mstimetwo
# 1405839684000
JavaScript代码示例:
d = new Date()
d.getTime()
想了解更多关于 JavaScript 日期处理 的内容,可以查看这篇文章。