python 函数返回 javascript 的 date.getTime()

7 投票
2 回答
11709 浏览
提问于 2025-04-18 13:52

我正在尝试创建一个简单的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 个回答

1

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
10

我想在这里强调一点:如果你想让客户端的时间和服务器的时间保持一致,你需要把服务器的时间传给客户端,并用这个时间作为参考。否则,由于每个客户端或网页浏览器都在不同的机器上运行,拥有自己的时钟,你们的时间总会有些不同。不过,通常我们会使用统一的方式来参考时间,比如用“纪元毫秒”来在客户端和服务器之间进行同步。

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 日期处理 的内容,可以查看这篇文章。

撰写回答