2015-04-23 3 views
0

Я пытаюсь получить сегодняшнее и вчерашнее время с помощью модуля PPython.Время - получить вчерашнюю дату

Это работает для меня на сегодняшний день сегодняшних:

dt = time.strptime(time.strftime("%d/%m/%Y"),'%d/%m/%Y') 

Но я не знаю, как получить Yesterdays даты. Я нашел много учебников, где используется модуль datetime, но ничего не используется, когда используется модуль time.

Как я могу это сделать? И есть ли лучший способ получить сегодняшнюю дату (struct_time)?

+0

Вы можете проверить этот ответ: http://stackoverflow.com/a/441152/870769 – sthzg

+0

@sthzg Спасибо за ответ, но есть модуль datetime, а не время. –

+0

Как вы ожидаете получить дату из класса, который не поддерживает даты? –

ответ

2

Чтобы получить вчерашний struct_time, используйте любого из многих existing datetime solutions и вызвать .timetuple() получить struct_time например .:

#!/usr/bin/env python 
from datetime import date, timedelta 

today = date.today() 
yesterday = today - timedelta(1) 
print(yesterday.timetuple()) 
# -> time.struct_time(tm_year=2015, tm_mon=4, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=112, tm_isdst=-1) 

Он производит правильный день в местном часовом поясе даже вокруг летнего времени переходов.

См. How can I subtract a day from a python date?, если вы хотите найти соответствующее время по UTC (получите вчера как осведомленный объект datetime).


Вы можете также получить вчера, используя только time модуль (но менее непосредственно):

#!/usr/bin/env python 
import time 

def posix_time(utc_time_tuple): 
    """seconds since Epoch as defined by POSIX.""" 
    # from https://gist.github.com/zed/ff4e35df3887c1f82002 
    tm_year = utc_time_tuple.tm_year - 1900 
    tm_yday = utc_time_tuple.tm_yday - 1 
    tm_hour = utc_time_tuple.tm_hour 
    tm_min = utc_time_tuple.tm_min 
    tm_sec = utc_time_tuple.tm_sec 
    # http://pubs.opengroup.org/stage7tc1/basedefs/V1_chap04.html#tag_04_15 
    return (tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 + 
      (tm_year-70)*31536000 + ((tm_year-69)//4)*86400 - 
      ((tm_year-1)//100)*86400 + ((tm_year+299)//400)*86400) 

now = time.localtime() 
yesterday = time.gmtime(posix_time(now) - 86400) 
print(yesterday) 
# -> time.struct_time(tm_year=2015, tm_mon=4, tm_mday=22, tm_hour=22, tm_min=6, tm_sec=16, tm_wday=2, tm_yday=112, tm_isdst=0) 

Он предполагает, что time.gmtime() принимает POSIX временную метку на данной платформе (Python's stdlib breaks otherwise, например, если не-POSIX TZ=right/UTC является используемый). calendar.timegm() можно использовать вместо posix_time(), но первый может использовать datetime внутренне.

Примечание: yesterday представляет собой локальное время в обоих решениях (gmtime() - это простой способ реализовать вычитание здесь). Оба решения используют наивные временные временные объекты, не знающие времени, и поэтому результат может быть неоднозначным или даже несуществующим временем, хотя, если вчера не был пропущен местный часовой пояс (например, Россия пропустила несколько дней в феврале 1918 года), то дата в любом случае правильная.

1

Если вы дали time объект, вы можете преобразовать его к datetime первым:

>>> import time 
>>> import datetime 

>>> dt = time.strptime(time.strftime("%d/%m/%Y"),'%d/%m/%Y') 
>>> # base time object: time.struct_time(tm_year=2015, tm_mon=4, tm_mday=23, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=113, tm_isdst=-1) 

>>> a_datetime_obj = datetime.datetime.fromtimestamp(time.mktime(dt)) 
>>> # convert to datetime: 2015-04-23 00:00:00 

>>> minus_one = a_datetime_obj - datetime.timedelta(days=1) 
>>> # subtract one day: 2015-04-22 00:00:00 

>>> print minus_one.timetuple() 
>>> # get time object from datetime: time.struct_time(tm_year=2015, tm_mon=4, tm_mday=22, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=112, tm_isdst=-1) 
2

Начнем с того, есть более прямой способ получить текущую дату:

dt = time.localtime() 

Чтобы получить дату предыдущего дня, вам необходимо вычесть 24 часа с текущего времени. Это может привести к некоторым сбоям в переходах DST, но я оставлю их как упражнение для читателя.

dt = time.localtime(time.time() - 86400) 
+0

У этого есть некоторые сбои вокруг перехода DST. Вот как их исправить: [Получить вчерашнюю дату в Python, DST-safe] (http://stackoverflow.com/a/15345272/4279) - решение использует модуль 'datetime'. Чтобы вместо этого получить кортеж времени, вызовите метод '.timetuple()' на объект 'datetime'. – jfs

+0

@ J.F.Sebastian Я бы предпочел также решение 'datetime', но OP специально отклоняет это. –

+0

OP требует 'struct_time', вот [простое решение' datetime', которое возвращает 'struct_time'] (http://stackoverflow.com/a/29832960/4279). – jfs

Смежные вопросы