Tôi có một datetime.datetime
đối tượng Python . Cách tốt nhất để trừ một ngày là gì?
Tôi có một datetime.datetime
đối tượng Python . Cách tốt nhất để trừ một ngày là gì?
Câu trả lời:
Bạn có thể sử dụng một đối tượng timedelta :
from datetime import datetime, timedelta
d = datetime.today() - timedelta(days=days_to_subtract)
timedelta(minutes=12)
ví dụ.
import datetime as DT; DT.datetime.today()
hoạt động trên cả Python 2 và 3. Nó tương đương với DT.datetime.now()
.
Nếu đối tượng datetime Python của bạn nhận thức được múi giờ hơn bạn nên cẩn thận để tránh các lỗi xung quanh chuyển đổi DST (hoặc thay đổi trong bù UTC vì các lý do khác):
from datetime import datetime, timedelta
from tzlocal import get_localzone # pip install tzlocal
DAY = timedelta(1)
local_tz = get_localzone() # get local timezone
now = datetime.now(local_tz) # get timezone-aware datetime object
day_ago = local_tz.normalize(now - DAY) # exactly 24 hours ago, time may differ
naive = now.replace(tzinfo=None) - DAY # same time
yesterday = local_tz.localize(naive, is_dst=None) # but elapsed hours may differ
Nói chung, day_ago
vàyesterday
có thể khác nhau nếu bù UTC cho múi giờ địa phương đã thay đổi vào ngày cuối cùng.
Ví dụ: thời gian tiết kiệm ánh sáng ban ngày / thời gian mùa hè kết thúc vào Chủ nhật 2 tháng 11 năm 2014 lúc 02:00:00 sáng ở Mỹ / múi giờ Los_Angele do:
import pytz # pip install pytz
local_tz = pytz.timezone('America/Los_Angeles')
now = local_tz.localize(datetime(2014, 11, 2, 10), is_dst=None)
# 2014-11-02 10:00:00 PST-0800
sau đó day_ago
và yesterday
khác nhau:
day_ago
chính xác là 24 giờ trước (so với now
) nhưng lúc 11 giờ sáng, không phải lúc 10 giờ sáng nhưnow
yesterday
là ngày hôm qua lúc 10 giờ sáng nhưng là 25 giờ trước (so với now
), không phải 24 giờ.pendulum
mô-đun xử lý nó tự động:
>>> import pendulum # $ pip install pendulum
>>> now = pendulum.create(2014, 11, 2, 10, tz='America/Los_Angeles')
>>> day_ago = now.subtract(hours=24) # exactly 24 hours ago
>>> yesterday = now.subtract(days=1) # yesterday at 10 am but it is 25 hours ago
>>> (now - day_ago).in_hours()
24
>>> (now - yesterday).in_hours()
25
>>> now
<Pendulum [2014-11-02T10:00:00-08:00]>
>>> day_ago
<Pendulum [2014-11-01T11:00:00-07:00]>
>>> yesterday
<Pendulum [2014-11-01T10:00:00-07:00]>
Chỉ cần Xây dựng một phương pháp thay thế và Trường hợp sử dụng mà nó hữu ích:
from datetime import datetime, timedelta print datetime.now() + timedelta(days=-1) # Here, I am adding a negative timedelta
from datetime import datetime, timedelta print datetime.now() + timedelta(days=5, hours=-5)
Nó có thể được sử dụng tương tự với các tham số khác, ví dụ giây, tuần, v.v.
Ngoài ra chỉ là một chức năng hay khác mà tôi muốn sử dụng khi tôi muốn tính toán tức là ngày đầu tiên / ngày cuối cùng của tháng trước hoặc các mốc thời gian tương đối khác, v.v ...
Hàm relativingelta từ hàm dateutil (một phần mở rộng mạnh mẽ cho lib datetime)
import datetime as dt
from dateutil.relativedelta import relativedelta
#get first and last day of this and last month)
today = dt.date.today()
first_day_this_month = dt.date(day=1, month=today.month, year=today.year)
last_day_last_month = first_day_this_month - relativedelta(days=1)
print (first_day_this_month, last_day_last_month)
>2015-03-01 2015-02-28