#! /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年前'''
 
  1. # -*- encoding=UTF-8 -*-
  2. import datetime
  3. def timebefore(d):
  4. chunks = (
  5. (60 * 60 * 24 * 365, u'年'),
  6. (60 * 60 * 24 * 30, u'月'),
  7. (60 * 60 * 24 * 7, u'周'),
  8. (60 * 60 * 24, u'天'),
  9. (60 * 60, u'小时'),
  10. (60, u'分钟'),
  11. )
  12. #如果不是datetime类型转换后与datetime比较
  13. if not isinstance(d, datetime.datetime):
  14. d = datetime.datetime(d.year,d.month,d.day)
  15. now = datetime.datetime.now()
  16. delta = now - d
  17. #忽略毫秒
  18. before = delta.days * 24 * 60 * 60 + delta.seconds  #python2.7直接调用 delta.total_seconds()
  19. #刚刚过去的1分钟
  20. if before <= 60:
  21. return u'刚刚'
  22. for seconds,unit in chunks:
  23. count = before // seconds
  24. if count != 0:
  25. break
  26. return unicode(count)+unit+u"前"

实例2:

‘’‘当前的时间上加一天或一年减一天等操作’‘’

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. from datetime import datetime,timedelta
  4. now = datetime.now()
  5. yestoday = now - timedelta(days=1)
  6. tommorow = now + timedelta(days=1)
  7. next_year = now + timedelta(days = 365)
  1. #使用replace()代替日期加减
  2. from datetime import datetime
  3. now1 = datetime.now()
  4. now1     # datetime.datetime(2017, 2, 10, 22, 29, 48, 288500)
  5. # 增加一天或减少一天
  6. now2 = now1.replace(day=9)
  7. now2  # datetime.datetime(2017, 2, 9, 22, 29, 48, 288500)
  8. # timestrap() 函数是把日期转化为时间戳,时间戳就是秒数
  9. time_span = now1.timestrap() - now2.timestrap()/(24*3600)
  10. 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(201441815377, tzinfo=<UTC>)
>>> localtime(dt)
datetime.datetime(201441823377, tzinfo=<LocalTimezone>)

有时候,我们需要将该时间与当前时间做比较,例如计算差值,你可能会想到直接这么做:

1
2
3
>>> import datetime
>>> now = datetime.datetime.now()
>>> now - dt

不过这是不对的,并告知如下错误:

1
2
3
Traceback (most recent call last):
  File "<console>", line 1in <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(201441815377)
>>> now - dt
datetime.timedelta(034108443000)

备注:1:timezone 获取的日期增加和修改(比如加一天减一天)

from django.utiles import timezone

from datetime

t1 = timezone.now()

# torrow

t1+datetime.timedelta(days=1,hours=1)

2:python得到两个时间段的每一天的列表

date_list = []
    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)
 
 
 

Python中时间的处理之——timedelta篇的更多相关文章

  1. python中时间的基本使用

    格式化日期 我们可以使用 time 模块的 strftime 方法来格式化日期,: time.strftime(format[, t]) #!/usr/bin/python # -*- coding: ...

  2. python中时间日期格式化符号

    python中时间日期格式化符号: import time print(time.strftime('%Y%H%M%S', time.localtime())) 运行结果: 2016092308 %y ...

  3. python中时间格式

    问题:通过MySQLdb查询datetime字段,然后通过浏览器显示出来,得到的格式是:         'Thu, 19 Feb 2009 16:00:07 GMT'   (http呈现出来的格式) ...

  4. python中时间的转换和使用datetime

    模块 一个完整大型的python程序是由模块和包的形式组织起来的,可见模块在python中的重要性.模块是一种组织型式,它许多有关联(关系)的代码组织放到单独的独立文件中.简单的说,可以把模块理解为一 ...

  5. 整理总结 python 中时间日期类数据处理与类型转换(含 pandas)

    我自学 python 编程并付诸实战,迄今三个月. pandas可能是我最高频使用的库,基于它的易学.实用,我也非常建议朋友们去尝试它.--尤其当你本身不是程序员,但多少跟表格或数据打点交道时,pan ...

  6. python中时间处理标准库DateTime加强版库:pendulum

    DateTime 的时区问题 Python的datetime可以处理2种类型的时间,分别为offset-naive和offset-aware.前者是指没有包含时区信息的时间,后者是指包含时区信息的时间 ...

  7. python中时间和时区

    1.时区 http://blog.csdn.net/cz157733055/article/details/38319195 2.时间 datetime.timedelta代表两个时间之间的的时间差 ...

  8. python中时间日期格式化符号:

    %y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-31) %H 24小时制小时数(0-23) %I 12小时制小时数( ...

  9. python中时间操作总结

    一.time 二.datetime 1.获取当前系统时间 datenow = datetime.datetime.now() 2.将datetime格式的时间转换成str datenow = date ...

随机推荐

  1. 【fedora】制作安装u盘

    找一台安装好linux系统的PC,将下载的LiveCD ISO文件复制到硬盘(这样速度快),查看U盘挂载的位置(用磁盘工具),在终端中使用dd命令: $ sudo dd if=<Live ISO ...

  2. 忘记windows的登陆密码

    http://user.qzone.qq.com/372806800/blog/1342261571

  3. Compress a Folder/Directory via Perl5

    Compress a Folder/Directory via Perl5 tested in Windows, Mac OS X, Ubuntu16.04 #!/usr/bin/perl #压缩指定 ...

  4. Linux 中open系统调用实现原理【转】

    转自:http://blog.chinaunix.net/uid-25968088-id-3426026.html 目录 OPEN系统调用过程 Open在内核里面的入口函数时sys_open Sys_ ...

  5. java对象的序列化与反序列化使用

    1.Java序列化与反序列化  Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道,当两个进程进 ...

  6. Web API 和 WCF 的比较

    现在有很多可用的技术允许你创建被不同客户端所消费的服务,这些客户端可能是Web应用程序.Windows应用程序和移动应用等.服务可以支持http协议或者其他协议.接下来的讨论仅限于ASP.NET We ...

  7. JavaEE基础(七)

    1.面向对象(构造方法Constructor概述和格式) A:构造方法概述和作用 给对象的数据(属性)进行初始化 B:构造方法格式特点 a:方法名与类名相同(大小也要与类名一致) b:没有返回值类型, ...

  8. HDU 5996:dingyeye loves stone(阶梯博弈)

    http://acm.hdu.edu.cn/showproblem.php?pid=5996 题意:在一棵树上进行博弈,每次只能将当前的结点的石子放到父节点上,最后不能移动的输. 思路:比赛的时候想的 ...

  9. C#:文件、路径(Path_File)

    public class Path_File { public string AppPath { get { return AppDomain.CurrentDomain.BaseDirectory; ...

  10. 事务的隔离级别及mysql对应操作

    /* 本次高并发解决之道 1,更改事务隔离级别为 read uncommitted读未提交 2,查询前设定延迟,延迟时间为随机 50-500 微秒 3,修改数据前将 超范围作为 限定修改条件 事务是作 ...