【问题标题】:Python, get timestamp for specific timezonePython,获取特定时区的时间戳
【发布时间】:2016-03-03 03:40:18
【问题描述】:

我是 Python 新手,我试图从现有帖子中找到答案,我做了我的尝试,但我找不到我想要的。

当客户端向我的服务器发送请求时,我需要验证时间(基于中国时区)差异。

从我能找到的现有帖子中,我尝试过:

import calendar
import datetime
import pytz
import time

tz = pytz.timezone('Asia/Shanghai') # china timezone
cn_time = datetime.datetime.now(tz) # get datetime for china
print calendar.timegm(cn_time.timetuple())*1000 #try to get the milliseconds 

但我发现结果与我的java服务器Joda Time的答案相差甚远:

DateTime serverDt = new DateTime(DateTimeZone.forID("Asia/Shanghai"));
long milis = serverDt.getMillis();

一个测试用例是:

蟒蛇:1457005502000

java: 1456976702999

int secDiff = Seconds.secondsBetween(dt, serverDt).getSeconds(); 的差异为 -28799,即 -7 小时

注意:我的机器是中国时区。

【问题讨论】:

  • 在每种情况下你会得到什么?
  • @Selcuk ,请查看我更新的问题
  • 您的问题不清楚。你的意思是你想要time.time()?你的输入是什么?它是一个字符串吗?举个例子。 java服务器的输出与客户端发送的请求有什么关系吗?客户的时区是什么?

标签: python time timestamp


【解决方案1】:

您的代码尝试查找当前的 Unix 时间。该值不依赖于特定的时区(在所有具有同步(例如,使用 ntp)时钟的计算机上,无论它们使用什么(可能不同)时区,它都是相同的数字)。只需调用milis = time.time() * 1000,即可获得与 java 服务器相同的值。

如果您需要获取与给定时区感知日期时间相对应的 Unix 时间(例如由 datetime.now(tz) 在某些时候创建),则只需调用 posix_timestamp = cn_time.timestamp()

Python 2 上没有 datetime.timestamp() 方法。您可以轻松模拟它:

def timestamp(aware_dt, epoch=datetime(1970, 1, 1, tzinfo=pytz.utc)):
    return (aware_dt - epoch).total_seconds()

用法:posix_timestamp = timestamp(cn_time)。在this answer 中查看更多详细信息。

【讨论】:

  • milis = time.time() * 1000 取决于当地时区,但如果客户在非中国时区怎么办,我需要的是准确地获取亚洲/上海的时间戳。
  • @Jaskey:错误。 POSIX 时间戳是自 1970-01-01 00:00:00UTC(纪元)以来的秒数,不包括闰秒。无论本地时区如何,它在世界各地都是相同的值。点击链接并阅读更详细的答案(点击答案中的链接以获得更多详细信息)。查看答案中的明确公式。
  • 抱歉有些遗漏,我发现你的第一段只是为了指出我的错误,这确实不是我想要的,我想要的是一个时区感知的日期时间时间戳。我想知道@Selcuk 给出的答案是否正确? time.mktime(cn_time.timetuple()) * 1000,因为我将该值与我的服务器进行比较,它非常接近相同(仅几毫秒差异)
  • @Jaskey 1- selcuk 的答案是完全错误的(它会产生垃圾)。 2-如果您不想要 Joda 的 getMillis() 返回的值,请编辑您的问题并准确指定您需要的值。
  • 我想要的是验证时间差异。由于客户端可能在任何地方,所以我们需要比较中国时区时间。在服务器端,我们使用 joda 作为时间戳,在客户端,我们从客户端从 param 中获取时间戳,然后进行比较。所以总而言之,“china-timezone-aware datetime”是我在 python 中所需要的。那为什么time.mktime(cn_time.timetuple()) * 1000是错误的,因为它甚至与服务器时间相同(除了从客户端到服务器的一些时间成本)。?
猜你喜欢
  • 2016-08-23
  • 2012-03-23
  • 2019-06-14
  • 1970-01-01
  • 2012-08-03
  • 2021-12-21
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
相关资源
最近更新 更多