Python中,处理时间和日期主要使用标准库中的 datetime 模块。这个模块提供了多种类来表示日期、时间和它们的组合,并支持各种操作,如创建、格式化、比较和计算日期时间差等。本文主要介绍Python中的时间日期(datetime)。

1、Python 时间日期(datetime)

Python中的时间日期不是其本身的数据类型,但是我们可以导入名为datetime的模块以将时间日期用作时间日期对象。

例如:

导入datetime模块并显示当前时间日期:

import datetime

x = datetime.datetime.now()
print(x)

2、输出时间日期

当我们从上面的示例执行代码时,结果将是:

2020-11-14 12:01:57.932172

该日期包含年,月,日,小时,分钟,秒和微秒。

datetime模块具有许多方法来返回有关日期对象的信息。

这里有一些示例,将在本章稍后了解更多有关它们的信息:

例如:

返回年份和工作日名称:

import datetime

x = datetime.datetime.now()

print(x.year)
print(x.strftime("%A"))

3、创建时间日期datetime对象

要创建日期,可以使用datetime模块的datetime()类(构造函数)。

datetime()类需要三个参数来创建日期:年,月,日。

例如:

创建一个日期对象:

import datetime

x = datetime.datetime(2020, 5, 17)

print(x)

datetime()类还接受时间和时区的参数(hour, minute, second, microsecond, tzone),但它们是可选的,其默认值为0,(tzone时区为None)。

4、strftime()方法 

datetime对象具有一种将日期对象格式化为可读字符串的方法。

该方法称为strftime(),它采用一个参数format来指定返回字符串的格式:

例如:

显示月份名称:

import datetime

x = datetime.datetime(2018, 6, 1)

print(x.strftime("%B"))

一个参考的所有合法的格式代码:

标识含义举例
%a星期简写Mon 
%A星期全称Monday 
%b月份简写 Mar
%B月份全称 March
%c适合语言下的时间表示May Mon May 20 16:00:02 2013 
%d一个月的第一天,
取值范围: [01,31].
 20
%H24小时制的小时,
取值范围[00,23].
17 
%I12小时制的小时,
取值范围 [01,12].
 10
%j一年中的第几天,
取值范围 [001,366].
120 
%m十进制月份,
取值范围[01,12].
 50
%M分钟,取值范围 [00,59]. 50
%p上、下午,AM 或 PM.PM
%S秒,取值范围 [00,61].30
%U这一年的星期数
(星期天为一个星期的
第一天,开年的第一个星期天
之前的天记到第0个星期)
趋势范围[00,53]。
20
%w星期的十进制表示,
取值范围 [0(星期天),6].
%W这一年的星期数(
星一为一个星期的第一天,
开年的第一个星期一
之前的天记到第0个星期)
趋势范围[00,53]。
20
%x特定自然语言下的日期表示05/20/13 
%X特定自然语言下的时间表示 16:00:02
%y年的后两位数,
取值范围[00,99].
13 
%Y完整的年2013
%Z时区名 CST(China Standard Time)
%%%字符

5、datetime模块介绍

datetime 模块提供了处理日期和时间的类和函数。它是Python标准库中专门用于日期和时间操作的模块之一,非常强大且灵活,可以处理日期、时间、时间差等多种操作。

1)datetime模块中包含如下类:

类名功能说明
date日期对象,常用的属性有year, month, day
time时间对象
datetime日期时间对象,常用的属性有hour, minute, second, microsecond
datetime_CAPI日期时间对象C语言接口
timedelta时间间隔,即两个时间点之间的长度
tzinfo时区信息对象

2)静态方法和字段

datetime.today()   # 返回一个表示当前本地时间的datetime对象;
datetime.now([tz]) # 返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间;
datetime.utcnow()  # 返回一个当前utc时间的datetime对象;#格林威治时间
datetime.fromtimestamp(timestamp[, tz]) # 根据时间戮创建一个datetime对象,参数tz指定时区信息;
datetime.utcfromtimestamp(timestamp)    # 根据时间戮创建一个datetime对象;
datetime.combine(date, time)  #根据date和time,创建一个datetime对象;
datetime.strptime(date_string, format) # 将格式字符串转换为datetime对象;

3)方法和属性

dt=datetime.now()#datetime对象
#dt.year、month、day、hour、minute、second、microsecond、tzinfo:
dt.date():获取date对象;
dt.time():获取time对象;
dt.replace([year[,month[,day[,hour[,minute[,second[,microsecond[,tzinfo]]]]]]]]):
dt.timetuple()
dt.utctimetuple()
dt.toordinal()
dt.weekday()
dt.isocalendar()
dt.isoformat([ sep] )
dt.ctime():返回一个日期时间的C格式字符串,等效于time.ctime(time.mktime(dt.timetuple()));
dt.strftime(format)

6、使用timedelta类实现时间加减

可以使用 timedelta 类来进行日期时间的加减操作。timedelta 表示两个 datetime 对象之间的差异,可以用于增加或减少日期和时间。可以使用 - 运算符来计算两个日期时间对象之间的差值。

#coding:utf-8
from  datetime import *

dt = datetime.now()
#日期减一天
dt1 = dt + timedelta(days=-1)#昨天
dt2 = dt - timedelta(days=1)#昨天
dt3 = dt + timedelta(days=1)#明天
delta_obj = dt3-dt
print type(delta_obj),delta_obj#<type 'datetime.timedelta'> 1 day, 0:00:00
print delta_obj.days ,delta_obj.total_seconds()#1 86400.0

7、tzinfo时区类

处理带时区信息的日期和时间可以使用 datetime 模块的 tzinfo 类及其子类。Python标准库提供了一些内置的时区类,也支持通过第三方库(如 pytz)来处理更复杂的时区操作。

#! /usr/bin/python
# coding=utf-8

from datetime import datetime, tzinfo,timedelta

"""
tzinfo是关于时区信息的类
tzinfo是一个抽象类,所以不能直接被实例化
"""
class UTC(tzinfo):
    """UTC"""
    def __init__(self,offset = 0):
        self._offset = offset

    def utcoffset(self, dt):
        return timedelta(hours=self._offset)

    def tzname(self, dt):
        return "UTC +%s" % self._offset

    def dst(self, dt):
        return timedelta(hours=self._offset)

#北京时间
beijing = datetime(2011,11,11,0,0,0,tzinfo = UTC(8))
print "beijing time:",beijing
#曼谷时间
bangkok = datetime(2011,11,11,0,0,0,tzinfo = UTC(7))
print "bangkok time",bangkok
#北京时间转成曼谷时间
print "beijing-time to bangkok-time:",beijing.astimezone(UTC(7))

#计算时间差时也会考虑时区的问题
timespan = beijing - bangkok
print "时差:",timespan

#Output==================
# beijing time: 2011-11-11 00:00:00+08:00
# bangkok time 2011-11-11 00:00:00+07:00
# beijing-time to bangkok-time: 2011-11-10 23:00:00+07:00
# 时差: -1 day, 23:00:00

推荐文档