python函数返回javascript date.getTime()

时间:2014-07-18 16:22:30

标签: javascript python date datetime gettime

我正在尝试创建一个简单的python函数,它将返回与javascript new Date().getTime()方法相同的值。 正如here所写,javascript getTime()方法返回1970年1月1日的毫秒数

所以我只是编写了这个python函数:

def jsGetTime(dtime):
    diff = datetime.datetime(1970,1,1)
    return (dtime-diff).total_seconds()*1000

而参数dtime是python datetime对象。

但我得错了结果。我的计算有什么问题?

2 个答案:

答案 0 :(得分:4)

我觉得有必要在此指出的一件事是: 如果您尝试同步客户端时间和服务器时间,则需要将服务器时间传递给客户端并将其用作偏移量。否则,您总是会有点不同步,因为您的客户端/ Web浏览器将在具有自己的时钟的各种计算机上运行。然而,在统一庄园中使用纪元毫秒在客户端和服务器之间进行同步是一种常见的模式。

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 date manipulation的更多参考,请参阅此帖子。

答案 1 :(得分:0)

Javascript的日期无法像预期的那样发挥作用。但是你的python代码是正确的。

根据The epoch time listing,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时间。另请注意,JS Date中存在一个错误,其中月份实际上是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