7

我正在尝试创建一个简单的 python 函数,它将返回与 javascriptnew 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 日期时间对象。

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

4

2 回答 2

9

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

蟒蛇

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 日期操作的更多参考,请参阅这篇文章。

于 2014-07-18T18:02:00.430 回答
1

Javascript 的 Date 不像你期望的那样工作。但是你的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 时间。另请注意,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
于 2014-07-18T17:28:06.530 回答