如何在几毫秒内在Python中创建日期时间?

Jos*_*hua 112 python datetime

我可以通过java.util.Date(毫秒)在Java 创建一个类似的Date对象.如何在Python中创建可比较的?

分配Date对象并将其初始化以表示自标准基准时间(称为"epoch")以来的指定毫秒数,即1970年1月1日00:00:00 GMT.

var*_*tec 176

只需将其转换为时间戳即可

datetime.datetime.fromtimestamp(ms/1000.0)
Run Code Online (Sandbox Code Playgroud)

  • 为了在不使用浮点数的情况下保持精度,您还可以执行:`datetime.utcfromtimestamp(ms // 1000).replace(microsecond = ms%1000*1000)` (27认同)
  • 注意 - 在Python 3中,(/)将执行浮点除法.要执行积分除法,请使用(//). (12认同)
  • 当然,datetime总是支持它吗?如果我们有亚秒级的精度,将它丢弃似乎是错误的.如果我们不这样做没有伤害 - 我们只保留原始精度. (4认同)
  • 你真的不想要漂浮分裂吗?否则你将失去任何低于1秒的精度(保存在时间戳的小数部分).最好使用ms/1000.0而不截断. (2认同)
  • 此解决方案的另一个问题:“fromtimestamp() 可能会引发 ValueError,如果时间戳超出平台 C localtime() 或 gmtime() 函数支持的值范围。通常将此限制为 1970 年到 1970 年2038。” - 你的代码预计能持续多久??? (2认同)

小智 11

由于使用熊猫而有点重,但有效:

import pandas as pd
pd.to_datetime(msec_from_java, unit='ms').to_pydatetime()
Run Code Online (Sandbox Code Playgroud)


mik*_*ent 9

那这个呢?我认为它可以指望处理1970年之前和2038年之后的日期.

target_date_time_ms = 200000 # or whatever
base_datetime = datetime.datetime( 1970, 1, 1 )
delta = datetime.timedelta( 0, 0, 0, target_date_time_ms )
target_date = base_datetime + delta
Run Code Online (Sandbox Code Playgroud)

正如Python标准lib中提到的:

如果时间戳超出平台C localtime()或gmtime()函数支持的值范围,则fromtimestamp()可能引发ValueError.这种情况通常限于1970年至2038年.

  • 你可以使用`utc_time = datetime(1970,1,1)+ timedelta(毫秒=毫秒)` (6认同)

cah*_*hen 7

将毫秒转换为日期时间(UTC):

import datetime
time_in_millis = 1596542285000
dt = datetime.datetime.fromtimestamp(time_in_millis / 1000.0, tz=datetime.timezone.utc)
Run Code Online (Sandbox Code Playgroud)

遵循RFC3339标准(由 Open API 规范使用)将日期时间转换为字符串:

from rfc3339 import rfc3339
converted_to_str = rfc3339(dt, utc=True, use_system_timezone=False)
# 2020-08-04T11:58:05Z
Run Code Online (Sandbox Code Playgroud)

  • 这将是我接受的答案,因为 Java 的 Date 默认情况下也指 UTC(相对于 Python 的简单日期时间/未设置的 tz 指的是*本地时间*)。 (2认同)

Art*_*lov 6

import pandas as pd

Date_Time = pd.to_datetime(df.NameOfColumn, unit='ms')
Run Code Online (Sandbox Code Playgroud)