#! /usr/bin/python # coding=utf-8 from datetime import datetime,timedelta """ timedelta代表兩個datetime之間的時間差 """ now = datetime.now() past = past = datetime(2010,11,12,13,14,15,16) timespan = now - past #這會得到一個負數 past - now attrs = [ ("days","日"),( 'seconds',"秒"),( 'microseconds',"毫秒") #('min',"最小"),( 'max',"最大"), ] for k,v in attrs: "timespan.%s = %s #%s" % (k,getattr(timespan, k),v) """ 總共相差的秒數 """ timespan.total_seconds() """ 實例化一個timespan 請注意它的參數順序 timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]]) """ timespan = timedelta(days=1) now - timespan #返回的是datetime型 now + timespan timespan * 2 #還可以乘哦。代表二倍 timespan / 13 #增加一個月 from calendar import monthrange now + timedelta(days=monthrange(start.year,start.month)[1])
實例1:
'''時間d距離now()的長度,比如:1分鍾前,1小時前,1月前,1年前'''
- # -*- encoding=UTF-8 -*-
- import datetime
- def timebefore(d):
- chunks = (
- (60 * 60 * 24 * 365, u'年'),
- (60 * 60 * 24 * 30, u'月'),
- (60 * 60 * 24 * 7, u'周'),
- (60 * 60 * 24, u'天'),
- (60 * 60, u'小時'),
- (60, u'分鍾'),
- )
- #如果不是datetime類型轉換后與datetime比較
- if not isinstance(d, datetime.datetime):
- d = datetime.datetime(d.year,d.month,d.day)
- now = datetime.datetime.now()
- delta = now - d
- #忽略毫秒
- before = delta.days * 24 * 60 * 60 + delta.seconds #python2.7直接調用 delta.total_seconds()
- #剛剛過去的1分鍾
- if before <= 60:
- return u'剛剛'
- for seconds,unit in chunks:
- count = before // seconds
- if count != 0:
- break
- return unicode(count)+unit+u"前"
實例2:
‘’‘當前的時間上加一天或一年減一天等操作’‘’
- #!/usr/bin/env python
- # -*- coding:utf-8 -*-
- from datetime import datetime,timedelta
- now = datetime.now()
- yestoday = now - timedelta(days=1)
- tommorow = now + timedelta(days=1)
- next_year = now + timedelta(days = 365)
- #使用replace()代替日期加減
- from datetime import datetime
- now1 = datetime.now()
- now1 # datetime.datetime(2017, 2, 10, 22, 29, 48, 288500)
- # 增加一天或減少一天
- now2 = now1.replace(day=9)
- now2 # datetime.datetime(2017, 2, 9, 22, 29, 48, 288500)
- # timestrap() 函數是把日期轉化為時間戳,時間戳就是秒數
- time_span = now1.timestrap() - now2.timestrap()/(24*3600)
- time_span # 1
日期常用問題
1: Datetime中offset-naive與offset-aware時間的計算
在使用Django時,默認是開啟對多時區的支持的,在獲取時間的時候會是如下形式:
datetime.datetime(2014, 4, 18, 15, 37, 7, tzinfo=<UTC>)
我們可以利用django.utils.timezone中提供的localtime方法來將該時間轉換為本地時間:
1
2
3
4
|
>>> dt
datetime.datetime(
2014
,
4
,
18
,
15
,
37
,
7
, tzinfo
=
<UTC>)
>>> localtime(dt)
datetime.datetime(
2014
,
4
,
18
,
23
,
37
,
7
, tzinfo
=
<LocalTimezone>)
|
有時候,我們需要將該時間與當前時間做比較,例如計算差值,你可能會想到直接這么做:
1
2
3
|
>>>
import
datetime
>>> now
=
datetime.datetime.now()
>>> now
-
dt
|
不過這是不對的,並告知如下錯誤:
1
2
3
|
Traceback (most recent call last):
File
"<console>"
, line
1
,
in
<module>
TypeError: can't subtract offset
-
naive
and
offset
-
aware datetimes
|
問題就出在利用datetime.datetime.now()得到的當前時間是offset-naive的,而另外一個卻是offset-aware的,因此我們需要將這里的dt轉成與now一樣的形式,可以這么做:
1
2
3
4
5
|
>>> dt
=
dt.replace(tzinfo
=
None
)
>>> dt
datetime.datetime(
2014
,
4
,
18
,
15
,
37
,
7
)
>>> now
-
dt
datetime.timedelta(
0
,
34108
,
443000
)
|
備注:1:timezone 獲取的日期增加和修改(比如加一天減一天)
from django.utiles import timezone
from datetime
t1 = timezone.now()
# torrow
t1+datetime.timedelta(days=1,hours=1)
2:python得到兩個時間段的每一天的列表
begin_date = datetime.datetime.strptime(begin_date, "%Y-%m-%d") end_date = datetime.datetime.strptime(end_date, "%Y-%m-%d") while begin_date <= end_date: date_str = begin_date.strftime("%m-%d") date_list.append(date_str) begin_date += datetime.timedelta(days=1) print date_list
# 方法2(安裝boto3 庫 pip install boto3):
from datetime import datetime
from dateutil.rrule import rrule, DAILY
a = datetime(2009, 5, 30)
b = datetime(2009, 6, 9)
for dt in rrule(DAILY, dtstart=a, until=b):
print dt.strftime("%Y-%m-%d")
# 在原來日期上增加一年
from dateutil.relativedelta import relativedelta
from django.utils import timezone
t1 = timezone.now()
neww_year = t1 + relativedelta(years=1)