Skip to content

python中的日期时间处理类——datetime

本文梳理了 python 中的日期时间处理类 datetime,记录了一些日常用法。

UTC#

What is UTC or GMT Time?

  • GMT: Greenwich Mean Time
  • UTC: Universal Time Coordinated

UTC – The World's Time Standard

  • UTC is A Standard, Not a Time Zone;
  • GMT is now a Time Zone.

Coordinated Universal Time (UTC, GMT, CUT)

时间服务器

Epoch Converter

datetime#

datetime

NAME
    datetime - Fast implementation of the datetime type.

CLASSES
    builtins.object
        date
            datetime
        time
        timedelta
        tzinfo
            timezone

class datetime.date

  • An idealized naive date, assuming the current Gregorian calendar always was, and always will be, in effect. Attributes: year, month, and day.

class datetime.time

  • An idealized time, independent of any particular day, assuming that every day has exactly 246060 seconds. (There is no notion of “leap seconds” here.) Attributes: hour, minute, second, microsecond, and tzinfo.

class datetime.datetime

class datetime.timedelta

  • A duration expressing the difference between two date, time, or datetime instances to microsecond resolution.

now & today#

调用 datetime.datetimenow()today() 返回当前时间:

>>> dt_now = datetime.datetime.now()
>>> dt_now
datetime.datetime(2025, 11, 10, 22, 0, 35, 665900)

>>> dt_today = datetime.datetime.today()
>>> dt_today
datetime.datetime(2025, 11, 10, 22, 1, 10, 516142)

调用 datetime.date.today() 返回今日 datetime.date 对象:

>>> d_today = datetime.date.today()
>>> d_today
datetime.date(2025, 11, 10)

调用 datetime.datetime.combine() 方法,将 date 对象和 time 对象(默认构造零点)合并为 datetime 对象:

>>> dt_today = datetime.datetime.combine(d_today, datetime.time())
>>> dt_today
datetime.datetime(2025, 11, 10, 0, 0)

strftime#

strftime: Return a string representing the datetime/date

  • datetime.strftime(format)
  • date.strftime(format)

datetimedate 对象都支持 strftime() 方法,按格式输出日期字符串:

>>> import datetime

>>> datetime_now = datetime.datetime.now()
>>> datetime_now
datetime.datetime(2018, 4, 24, 15, 51, 2, 399371)
>>> datetime_now.strftime('%Y-%m-%d %H:%M:%S')
'2018-04-24 15:51:02'

type-specific formatting 等效写法:

>>> import datetime
>>> d=datetime.datetime(2018, 4, 25, 13, 0, 0)
>>> '{:%Y-%m-%d %H:%M:%S}'.format(d)
'2018-04-25 13:00:00'

strptime#

strptime: Return a datetime/date corresponding to date_string, parsed according to format.

  • classmethod datetime.strptime(date_string, format)
  • classmethod date.strptime(date_string, format)

datetimedate 对象都支持 strptime() 方法,从日期字符串按格式构造 datetime/date 对象:

>>> datetime_now = datetime.datetime.strptime('20180424', '%Y%m%d')
>>> datetime_begin = datetime.datetime.strptime('20180323', '%Y%m%d')
>>> datetime_count = datetime_now-datetime_begin
>>> datetime_count
datetime.timedelta(32)
>>> datetime_count.days
32

fromisoformat#

Return a datetime/date corresponding to a date_string in any valid ISO 8601 format.

  • classmethod datetime.fromisoformat(date_string)
  • classmethod date.fromisoformat(date_string)

datetimedate 对象都支持 fromisoformat() 方法,从日期字符串构造 datetime/date 对象:

>>> datetime.datetime.fromisoformat('2011-11-04')
datetime.datetime(2011, 11, 4, 0, 0)
>>> datetime.datetime.fromisoformat('20111104')
datetime.datetime(2011, 11, 4, 0, 0)
>>> datetime.datetime.fromisoformat('2011-11-04T00:05:23')
datetime.datetime(2011, 11, 4, 0, 5, 23)

>>> datetime.date.fromisoformat('2019-12-04')
datetime.date(2019, 12, 4)
>>> datetime.date.fromisoformat('20191204')
datetime.date(2019, 12, 4)

timestamp#

Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数(不考虑闰秒),是一个浮点数。
英文为 Unix time, POSIX time, Unix epoch 或 Unix timestamp。

  • The Current Epoch Unix Timestamp: Seconds since Jan 01 1970. (UTC)
  • The Unix epoch is the number of seconds that have elapsed since January 1, 1970 at midnight UTC time minus the leap seconds.

time和datetime都是Python中的内置模块,都可以对时间进行获取,对时间格式进行转换,如时间戳和时间字符串的相互转换。

time#

time 模块定义的 time() 函数返回当前时间,是一个秒级时间戳浮点数。

FUNCTIONS

    time(...)
        time() -> floating point number

        Return the current time in seconds since the Epoch.

对于 time() 返回的秒级时间戳,乘以1000即可求得毫秒级:

import time, math

sTimestamp = time.time() # 6位小数
print(sTimestamp)
msTimestamp = time.time() * 1000
print(msTimestamp)
print(math.floor(msTimestamp)) # 向下取整,忽略us
print(round(msTimestamp)) # 四舍五入

运行输出:

1669000141.6891751
1669000141689.566
1669000141690
1669000141689

基于 time_ns() 接口返回高精度的纳秒级时间戳,来换算更粗粒度的毫秒单位,可能更为合理:

import time

sTimestamp = time.time() # 秒,6位小数
print(sTimestamp)
nsTimestamp = time.time_ns() # 纳秒
print(nsTimestamp)
msTimestamp = nsTimestamp / (1000 * 1000) # 毫秒
print(msTimestamp)
1669000543.659899
1669000543660408000
1669000543660.408

datetime#

class datetime 的实例方法 timestamp():Return POSIX timestamp as float.

import datetime;

current_time = datetime.datetime.now()
time_stamp = current_time.timestamp()
print("timestamp:", time_stamp)

也可调用类方法 datetime.timestamp(dt),其中dt为datetime对象实例:

from datetime import datetime

now = datetime.now()
timestamp = datetime.timestamp(now)
print("timestamp =", timestamp)

fromtimestamp#

classmethod datetime.fromtimestamp(timestamp, tz=None)
Return the local date and time corresponding to the POSIX timestamp, such as is returned by time.time(). 

也可调用类方法 datetime.timestamp(ts),其中ts为秒级时间戳:

>>> datetime.fromtimestamp(time.time())
datetime.datetime(2022, 11, 21, 11, 42, 7, 720789)

timedelta#

>>> # 获取当前时间
>>> d0 = datetime.datetime.now()
>>> d0
datetime.datetime(2018, 4, 26, 22, 37, 55, 465668)
>>> # 基于日期字符串创建日期对象
>>> str_begin_date = '20180314'
>>> d1 = datetime.datetime.strptime(str_begin_date, '%Y%m%d')
>>> d2 = datetime.datetime(2018,2,2)
>>> # 计算日期相隔天数
>>> dd1=d0-d1
>>> dd1.days
43
>>> dd2=d1-d2
>>> dd2.days
40
>>> # 计算32天前的日期
>>> d3 = d0 - datetime.timedelta(days=32)
>>> d3
datetime.datetime(2018, 3, 25, 22, 37, 55, 465668)

假设有一个工单在明天过期,下面基于 datetime 来统计剩余天数。
由于现在不是今日零点,因此计算日期差不足 1 天:

>>> today = datetime.datetime.today()
>>> today
datetime.datetime(2018, 4, 26, 22, 37, 55, 465668)
>>> due_date = datetime.datetime.strptime('2018-04-27', '%Y-%m-%d')
>>> delta = due_date - today
>>> delta.days
0

如果要计算整点天数,需要取今日零点 datetime

>>> d_today = datetime.date.today()  # datetime.datetime.today().date()
>>> dt_today = datetime.datetime.combine(d_today, datetime.time())
>>> dt_due = datetime.datetime.fromisoformat('2018-04-27')
>>> delta = dt_due - dt_today
>>> delta.days
1

基于 date 计算最合适:

>>> d_today = datetime.date.today()
>>> d_due = datetime.date.fromisoformat('2018-04-27')
>>> delta = d_due - d_today
>>> delta.days
1

Examples#

Comments