【问题标题】:python function to return javascript date.getTime()python函数返回javascript date.getTime()
【发布时间】:2014-09-09 20:53:30
【问题描述】:

我正在尝试创建一个简单的 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 日期时间对象。

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

【问题讨论】:

  • 不是你的问题的答案,但time.time() 做同样的事情。另外,如果总秒数是你所追求的,你为什么要乘以 1000?我不认为total_seconds() 返回毫秒数。
  • @TheSoundDefense:总 毫秒,而不是秒。
  • @MartijnPieters 哎呀,原来我看不懂。
  • @TheSoundDefense: 和 time.time() 不做同样的事情;此函数返回 给定datetime 对象 与纪元的偏移量,而time.time() 只为您提供当前时间戳。
  • @TheSoundDefense:我也明白这一点。 :-P

标签: javascript python date datetime gettime


【解决方案1】:

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

【讨论】:

  • 所以,如果我理解正确的话,javascript会根据客户端时区创建日期,而我的python计算不会。那么,考虑到夏令时,如何使用 python 获得本地时区偏移量?
【解决方案2】:

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

蟒蛇

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

【讨论】:

  • 其实我并没有尝试同步服务器和客户端的时间。目前我不想照顾不同的时区。我正在尝试做一个 python 函数,它将返回与 javascript getTime() 相同的结果,就好像它们都在同一台机器上运行一样。
  • 这正是我的回答。即 python:import time; int(time.time() * 1000) 返回 1405793073980L 和 javascript:d = new Date(); d.getTime() 返回 1405793121544
  • 我在给定的日期时间需要这个。 time.time() 只给我当前时间的时间戳。
猜你喜欢
  • 1970-01-01
  • 2011-01-25
  • 2013-07-22
  • 2018-05-14
  • 2013-09-27
  • 1970-01-01
  • 2015-01-26
  • 2016-04-25
  • 1970-01-01
相关资源
最近更新 更多