python模拟时间,找到每个月的结束

时间:2016-10-26 03:43:06

标签: python

我正在尝试模拟程序中的时间变化。例如,如果我从2016年10月26日开始(今天)(我的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")

2 个答案:

答案 0 :(得分:3)

这可能对您有用:

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来增加当前月份。这将在年底前正确包装。

答案 1 :(得分:2)

一小时有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_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_month != 12

OR

from dateutil.relativedelta import relativedelta

def next_month(current_datetime):
    return (current_datetime + relativedelta(months=1)).replace(day=1, hour=0, minute=0, second=0)


def hours_until(dt1, dt2):
    delta = dt2 - dt1
    hours = (delta.hours * 24) + (delta.seconds / 3600)
    return hours