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

2024-06-16 10:40:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个简单的python函数,它将返回与javascriptnew 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对象。

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


Tags: 方法函数datetimedatereturnheredefdiff
2条回答

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中的“get current time”将是客户端时间,而python将返回utc时间。还要注意,JS Date中有一个bug,其中月份实际上是基于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

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

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的更多参考,请参阅本文。

相关问题 更多 >