python模拟时间并找到每个月的末尾

python模拟时间并找到每个月的末尾,python,Python,我试图在我的程序中模拟时间变化。例如,如果我从2016年10月26日的0开始(今天)(我的var“param”从0开始),那么在现实世界中的一秒钟将是我程序中的一小时。所以每1秒通过我的'param+=1'。然后我可以用小时来模拟时间的变化 现在我想在每个月的开始做一些统计。在这种情况下,我想做的第一个统计是2016年11月1日凌晨0点。我的问题是,如何通过'param'的值找到这一点(每个月初) today = date.today() if t0 == '0': ti

我试图在我的程序中模拟时间变化。例如,如果我从2016年10月26日的0开始(今天)(我的var“param”从0开始),那么在现实世界中的一秒钟将是我程序中的一小时。所以每1秒通过我的'param+=1'。然后我可以用小时来模拟时间的变化

现在我想在每个月的开始做一些统计。在这种情况下,我想做的第一个统计是2016年11月1日凌晨0点。我的问题是,如何通过'param'的值找到这一点(每个月初)

today = date.today()
    if t0 == '0':
        time_now = today.strftime("%Y-%m-%d %H")
    else:
        time_now = (today + relativedelta(hours=int(param))).strftime("%Y-%m-%d %H")

一小时有3600秒。因此,您的游戏时间总是经过的“实时”(timedelta)乘以3600

import datetime
def time_shift(t1, t2):
    '''returns the game-time timedelta based on two 'real' datetime objects'''
    real_elapsed = t2 - t1
    game_elapsed = real_elapsed * 3600
    return game_elapsed
例如:

>>> t1 = datetime.datetime(year=2016, month=10, day=26)
>>> delta = datetime.timedelta(seconds=30) 
#lets say 30 seconds realtime passes
#that should be 1 day 6 hours game-time.
>>> t2 = t1 + delta
>>> time_shift(t1, t2)
datetime.timedelta(1, 21600) #1 day, 21600 seconds IE 1 day and 6 hours
#You can translate that to a specific date for the game, too
>>> game_date = t1 + time_shift(t1, t2)
>>> game_date
datetime.datetime(2016, 10, 27, 6, 0)
如果你想知道下个月的第一天。我们可以这样做。我假设游戏中的当前日期/时间为
current\u datetime

cur_month, cur_year = current_datetime.month, current_datetime.year
try:
    next_month = datetime.datetime(year=cur_year, month=cur_month+1, day=1)
except ValueError:
    #If it was december
    next_month = datetime.datetime(year=cur_year+1, month=1, day=1)
until_next_month = next_month - current_datetime
您也可以简单地测试
if cur\u month!=12


一小时有3600秒。因此,您的游戏时间总是经过的“实时”(timedelta)乘以3600

import datetime
def time_shift(t1, t2):
    '''returns the game-time timedelta based on two 'real' datetime objects'''
    real_elapsed = t2 - t1
    game_elapsed = real_elapsed * 3600
    return game_elapsed
例如:

>>> t1 = datetime.datetime(year=2016, month=10, day=26)
>>> delta = datetime.timedelta(seconds=30) 
#lets say 30 seconds realtime passes
#that should be 1 day 6 hours game-time.
>>> t2 = t1 + delta
>>> time_shift(t1, t2)
datetime.timedelta(1, 21600) #1 day, 21600 seconds IE 1 day and 6 hours
#You can translate that to a specific date for the game, too
>>> game_date = t1 + time_shift(t1, t2)
>>> game_date
datetime.datetime(2016, 10, 27, 6, 0)
如果你想知道下个月的第一天。我们可以这样做。我假设游戏中的当前日期/时间为
current\u datetime

cur_month, cur_year = current_datetime.month, current_datetime.year
try:
    next_month = datetime.datetime(year=cur_year, month=cur_month+1, day=1)
except ValueError:
    #If it was december
    next_month = datetime.datetime(year=cur_year+1, month=1, day=1)
until_next_month = next_month - current_datetime
您也可以简单地测试
if cur\u month!=12


这可能适合您:

from datetime import datetime
from dateutil.relativedelta import relativedelta


def seconds_until_next_month():
    return (datetime(year=datetime.now().year, month=datetime.now().month, day=1) +
            relativedelta(months=1) - datetime.now()).seconds


def hours_until_next_month():
    return seconds_until_next_month()/60.0/60.0

这里的技巧是使用
dateutil.relativedelta
增加当前月份。这将在年底前完成。

这可能适合您:

from datetime import datetime
from dateutil.relativedelta import relativedelta


def seconds_until_next_month():
    return (datetime(year=datetime.now().year, month=datetime.now().month, day=1) +
            relativedelta(months=1) - datetime.now()).seconds


def hours_until_next_month():
    return seconds_until_next_month()/60.0/60.0

这里的技巧是使用
dateutil.relativedelta
增加当前月份。这将在接近年底时正确结束。

当月值
%m
从其以前的值更改时,您输入了一个新的月份。当月值
%m
从其以前的值更改时,您输入了一个新的月份。也许我的问题不是很清楚。我真正想知道的是现在和月底在小时或时间上的区别days@wildcolor啊,我现在明白了。对不起,我弄错了。我已经编辑了我的答案以包含这些信息。谢谢你的回答。实际上我已经有了自己的答案。但是你的回答也很有帮助。您能告诉我如何将“直到下个月”改为“小时数”吗?@wildcolor在这种情况下,
直到下个月
将是一个
datetime.timedelta
对象,它以天/秒/微秒表示时间增量。要将其转换为小时,您可以执行
hours=(直到下个月.days*24)+(直到下个月.seconds/3600)
@wildcolor我还添加了一个建议,使用
relativedelta
找到合适的日期,并显示如何获得两个日期之间的小时数。也许我的问题不是很清楚。我真正想知道的是现在和月底在小时或时间上的区别days@wildcolor啊,我现在明白了。对不起,我弄错了。我已经编辑了我的答案以包含这些信息。谢谢你的回答。实际上我已经有了自己的答案。但是你的回答也很有帮助。您能告诉我如何将“直到下个月”改为“小时数”吗?@wildcolor在这种情况下,
直到下个月
将是一个
datetime.timedelta
对象,它以天/秒/微秒表示时间增量。要将其转换为小时,您可以执行
hours=(直到下个月.days*24)+(直到下个月.seconds/3600)
@wildcolor我还添加了一个建议,使用
relativedelta
找到合适的日期,并显示如何获得两个日期之间的小时数。relativedelta是一个很好的方法。我原本以为2月可能会出现问题(即
Jan30+relativedelta(months=1)
),但它恰如其分地将2月29日定为2月29日,而不是我想象中的3月。@sytech是的。这就是为什么它会出现在下个月的第一天,而不是增加天数或其他什么。这会处理好闰年等所有事情。relativedelta是一个很好的方法。我原本以为2月可能会出现问题(即
Jan30+relativedelta(months=1)
),但它恰如其分地将2月29日定为2月29日,而不是我想象中的3月。@sytech是的。这就是为什么它会出现在下个月的第一天,而不是增加天数或其他什么。所有闰年之类的事情都会处理好。