Управление объектами DateTime и TimeDelta в Python

Мне интересно, как управлять объектами Datetime и Time delta. Я пишу игру, в которой разные планеты имеют разные временные рамки. И мне было интересно, как можно модифицировать объекты datetime.

Например, если у меня есть объект даты и времени - какой-то прошлый объект datetime, мне было интересно, можно ли узнать, сколько раз 6 часов могут переходить в разные и каков остаток в минутах?

Например...

now = datetime.now()
then = some datetime object
diff = now - then
num 6 hour blocks = diff / 6 (rounded down)
minutes = diff % 6

Спасибо!


person Mars J    schedule 02.04.2012    source источник
comment
Не могли бы вы лучше объяснить свой вопрос. Напишите псевдокод или покажите, что вы пробовали.   -  person jon    schedule 02.04.2012
comment
или я предполагаю, что это был бы другой способ сформулировать это, есть ли способ справиться с объектами timedelta как с двойными или плавающими?   -  person Mars J    schedule 02.04.2012
comment
Вы также можете поэкспериментировать с созданием собственного класса datetime. Зависит от того, как вы моделируете свою вселенную, но может быть проще просто работать с постоянной секундой, и тогда каждая планета будет иметь количество секунд на один оборот (дневной / ночной цикл) и количество секунд на один обход местной звезды.   -  person aychedee    schedule 03.04.2012


Ответы (2)


Объекты timedelta имеют метод total_seconds в Python 2.7. Так что вы можете использовать это, чтобы решить эту проблему. Вы получаете объект timedelta, когда вычитаете один объект datetime из другого.

from datetime import timedelta

minutes = 60
hours = 60 * minutes
days = 24 * hours

diff = timedelta(days=6)

days_in_the_past = int(diff.total_seconds() / days)
hours_remainder = diff.total_seconds() % days

hours_in_the_past = int(diff.total_seconds() / hours)
seconds_remainder = diff.total_seconds() % hours

Это в значительной степени то, чем вы хотели заниматься? Если вы используете старую версию Python, вы можете определить функцию, которая выполняла бы то же самое, что и метод total_seconds, например:

def total_seconds(timedelta_object):
    return timedelta_object.days * 86400 + timedelta_object.seconds
person aychedee    schedule 02.04.2012

timedelta объекты имеют только поля days, seconds и microseconds, поэтому я думаю, что в течение нескольких часов и минут вам придется использовать seconds:

num_blocks = diff.seconds//(6*3600)
minutes = (diff.seconds%(6*3600))//60
person Lev Levitsky    schedule 02.04.2012