将纪元时间截断为小时/天的开始

truncate epoch time to start of hour / day

我想将纪元时间(以毫秒为单位)截断为小时的开始或一天的开始。我创建了以下功能,它们工作正常。我现在正在执行 3 个步骤 - 将 input_epoch 转换为日期时间 -> 截断日期时间 -> 将日期时间转换回 epoch_time。有没有办法直接截断纪元时间(不将其转换为 datetime 对象)? 有什么建议吗?

from datetime import datetime

def to_epoch_millis(dt):
    return int((dt - datetime.utcfromtimestamp(0)).total_seconds() * 1000.0)

def truncate_to_hour(dt):
    return dt.replace(microsecond=0, second=0, minute=0)

def truncate_to_day(dt):
    return dt.replace(microsecond=0, second=0, minute=0, hour=0)


# input - 1647548963623 - Thu Mar 17 2022 20:29:23
input_epoch = 1647548963623
print(to_epoch_millis(
    truncate_to_day(datetime.utcfromtimestamp(input_epoch / 1000))))  # 1647475200000 - Thu Mar 17 2022 00:00:00
print(to_epoch_millis(
    truncate_to_hour(datetime.utcfromtimestamp(input_epoch / 1000))))  # 1647547200000 - Thu Mar 17 2022 20:00:00

一天有 86400000 毫秒。 一小时有3600000毫秒。

找到模数并减去它,这样您将获得一天或一小时的开始时间。 您实质上是在整数除法中删除剩余的毫秒数,向下舍入。

input_epoch = 1647548963623

truncate_day_epoch = input_epoch - (input_epoch % 86400000)

truncate_hour_epoch = input_epoch - (input_epoch % 3600000)