zoukankan      html  css  js  c++  java
  • datetime 详解

    datetime 模块详解 -- 基本的日期和时间类型

    datetime 模块提供了各种类用于操作日期和时间,该模块侧重于高效率的格式化输出

    在 Python 中,与时间处理有关的模块包括:time,datetime 以及 calendar


    datetime 模块定义了两个常量:

    • datetime.MINYEAR - date 和 datetime 对象所能支持的最小年份,object.MINYEAR 的值为 1
    • datetime.MAXYEAR - date 和 datetime 对象所能支持的最大年份,object.MAXYEAR 的值为 9999



    datetime 模块中定义的类(前四个下方有详解):

    • datetime.date - 表示日期的类,常用属性:year, month, day
    • datetime.time - 表示时间的类,常用属性:hour, minute, second, microsecond, tzinfo
    • datetime.datetime - 表示日期和时间的类,常用属性: year, month, day, hour, minute, second, microsecond, tzinfo
    • datetime.timedelta - 表示时间间隔,即两个时间点(date,time,datetime)之间的长度
    • datetime.tzinfo - 表示时区的基类,为上方的 time 和 datetime 类提供调整的基准
    • datetime.timezone - 表示 UTC 时区的固定偏移,是 tzinfo 基类的实现


    注:上边这些类的对象是不可变的

    上边这些类的从属关系:

    1. object
    2.     timedelta
    3.     tzinfo
    4.         timezone
    5.     time
    6.     date
    7.         datetime
    复制代码






    timedelta 对象

    timedelta 对象表示两个日期或时间之间的间隔

    1. datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) 
    复制代码


    以上所有的参数都是可选的(默认为 0),参数的可以是整数或浮点数,正数或负数。

    内部的存储单位只有 days(天)、seconds(秒)、microseconds(毫秒),其他单位均先转换后再存储:

    • 1 millisecond -> 1000 microseconds
    • 1 minutes -> 60 seconds
    • 1 hours -> 3600 seconds
    • 1 weeks -> 7 days


    而 days、seconds 和 microseconds 为了不产生时间表示上的歧义,将根据以下范围自动“进位”:

    • 0 <= microseconds < 1000000
    • 0 <= seconds < 3600 * 24(1小时的秒数 * 24小时)
    • -999999999 <= days <= 999999999



    timedelta 类属性:

    • timedelta.min - timedelta 对象负值的极限,timedelta(-999999999)
    • timedelta.max - timedelta 对象正值的极限,timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)
    • timedelta.resolution - 两个 timedelta 不相等的对象之间最小的差值,timedelta(microseconds=1)


    请注意,在正常情况下,timedelta.max > -timedelta.min,-timedelta.max 无意义。


    timedelta 实例属性(只读):

    属性 取值范围
    timedelta.days -999999999 ~ 999999999
    timedelta.seconds 0 ~ 86399
    timedelta.microseconds 0 ~ 999999



    timedelta 对象支持的操作:

    操作 结果
    t1 = t2 + t3 t2 和 t3 的和,随后:t1 - t2 == t3 and t1 - t3 == t2 为 True(注1)
    t1 = t2 - t3 t2 和 t3 的差,随后:t1 == t2 - t3 and t2 == t1 + t3 为 True(注1)
    t1 = t2 * i 或 t1 = i * t2 对象乘以一个整数,随后:t1 // i == t2 为 true;且 i != 0
    t1 = t2 * f 或 t1 = f * t2 对象乘以一个浮点数,结果四舍五入到精度 timedelta.resolution(注1)
    f = t2 / t3 t2 和 t3 的商(注3),返回一个 float 对象
    t1 = t2 / f 或 t1 = t2 / i 对象除以一个整数或浮点数,结果四舍五入到精度 timedelta.resolution
    t1 = t2 // i 或 t1 = t2 // t3 对象地板除一个整数或浮点数,结果舍去小数,返回一个整数(注3)
    t1 = t2 % t3 t2 和 t3 的余数,返回一个 timedelta 对象(注3)
    q, r = divmod(t1, t2) 计算 t1 和 t2 的商和余数,q = t1 // t2(注3),r = t1 % t2,q 是一个整数,r 是一个 timedelta 对象
    +t1 返回一个 timedelta 对象,且值相同(注2)
    -t1 等同于 timedelta(-t1.days, -t1.seconds, -t1.microseconds),并且相当于 t1 * -1(注1、4)
    abs(t) 当 t.days >= 0 时,等同于 +t;当 t.days < = 时,等同于 -t(注2)
    str(t) 返回一个字符串,按照此格式:[D day[ s ], ][H]H:MM:SS[.UUUUUU]
    repr(t) 返回一个字符串,按照此格式:datetime.timedelta(D[, S[, U]])


    注1:这是准确的,但可能会溢出
    注2:这是准确的,并且不会溢出
    注3:除数为 0 会引发 ZeroDivisionError 异常
    注4:-timedelta.max 是无意义的


    timedelta 实例方法:

    timedelta.total_seconds()
    - 返回 timedelta 对象所包含的总秒数,相当于 td / timedelta(seconds=1)

    请注意,对于非常大的时间间隔(在大多数平台上是大于270年),这种方法将失去微秒(microsecond)精度


    timedelta 用法示例:

    1. # 爱学习,爱鱼C工作室
    2. >>> from datetime import timedelta
    3. >>> year = timedelta(days=365)
    4. >>> another_year = timedelta(weeks=40, days=84, hours=23,
    5. ...                          minutes=50, seconds=600)  # adds up to 365 days
    6. >>> year.total_seconds()
    7. 31536000.0
    8. >>> year == another_year
    9. True
    10. >>> ten_years = 10 * year
    11. >>> ten_years, ten_years.days // 365
    12. (datetime.timedelta(3650), 10)
    13. >>> nine_years = ten_years - year
    14. >>> nine_years, nine_years.days // 365
    15. (datetime.timedelta(3285), 9)
    16. >>> three_years = nine_years // 3;
    17. >>> three_years, three_years.days // 365
    18. (datetime.timedelta(1095), 3)
    19. >>> abs(three_years - ten_years) == 2 * three_years + year
    20. True
    复制代码






    date 对象

    date 对象表示一个日期,在一个理想化的日历里,日期由 year(年)、month(月)、day(日)组成

    1. datetime.date(year, month, day)
    复制代码


    所有的参数都是必需的,参数可以是整数,并且在以下范围内:

    • MINYEAR <= year <= MAXYEAR(也就是 1 ~ 9999)
    • 1 <= month <= 12
    • 1 <= day <= 根据 year 和 month 来决定(例如 2015年2月 只有 28 天)



    date 类方法(classmethod):

    • date.today() - 返回一个表示当前本地日期的 date 对象
    • date.fromtimestamp(timestamp) - 根据给定的时间戮,返回一个 date 对象
    • date.fromordinal(ordinal) - 将 Gregorian 日历时间转换为 date 对象(Gregorian Calendar:一种日历表示方法,类似于我国的农历,西方国家使用比较多)



    date 类属性:

    • date.min - date 对象所能表示的最早日期,date(MINYEAR, 1, 1)
    • date.max - date 对象所能表示的最晚日期,date(MAXYEAR, 12, 31)
    • date.resolution - date 对象表示日期的最小单位,在这里是 1 天,timedelta(days=1)



    date 实例属性(只读):

    属性 取值范围
    date.year MINYEAR ~ MAXYEAR(1 ~ 9999)
    date.month 1 ~ 12
    date.day 1 ~ 根据 year 和 month 来决定(例如 2015年2月 只有 28 天)



    date 对象支持的操作:

    操作 结果
    date2 = date1 + timedelta 日期加上一个时间间隔,返回一个新的日期对象(注1)
    date2 = date1 - timedelta 日期减去一个时间间隔,相当于 date2 + timedelta == date1(注2)
    timedelta = date1 - date2 (注3)
    date1 < date2 当 date1 的日期在 date2 之前时,我们认为 date1 < date2(注4)


    注1:timedelta.day > 0 或 timedelta.day < 0 决定 date2 日期增长的方向;随后,date2 - date1 == timedelta.days;timedelta.seconds 和 timedelta.microseconds 被忽略;如果 date2.year < MINYEAR 或 date2.year > MAXYEAR,引发 OverflowError 异常

    注2:这并不等同于 date1 + (-timedelta),因为单独的 -timedelta 可能会溢出,而 date1 - timedelta 则不会溢出;timedelta.seconds 和 timedelta.microseconds 被忽略

    注3:这是准确的,并且不会溢出;timedelta.seconds 和 timedelta.microseconds 都为 0,然后 date2 + timedelta == date1

    注4:换句话说,当且仅当 date1.toordinal() < date2.toordinal(),才有 date1 < date2



    date 实例方法:

    date.replace(year, month, day)
    - 生成一个新的日期对象,用参数指定的年、月、日代替原有对象中的属性

    date.timetuple()
    - 返回日期对应的 time.struct_time 对象(类似于 time 模块的 time.localtime())

    date.toordinal()
    - 返回日期对应的 Gregorian Calendar 日期

    date.weekday()
    - 返回 0 ~ 6 表示星期几(星期一是 0,依此类推)

    date.isoweekday()
    - 返回 1 ~ 7 表示星期几(星期一是1, 依此类推)

    date.isocalendar()
    - 返回一个三元组格式 (year, month, day)

    date.isoformat()
    - 返回一个 ISO 8601 格式的日期字符串,如 "YYYY-MM-DD" 的字符串

    date.__str__()
    - 对于 date 对象 d 来说,str(d) 相当于 d.isoformat()

    date.ctime()
    - 返回一个表示日期的字符串,相当于 time 模块的 time.ctime(time.mktime(d.timetuple()))

    date.strftime(format)
    - 返回自定义格式化字符串表示日期,下面有详解

    date.__format__(format)
    - 跟 date.strftime(format) 一样,这使得调用 str.format() 时可以指定 data 对象的字符串


    以下是计算天数的例子:

    1. # You may say I'm the dreamer. But I'm not the only one! 
    2. >>> import time
    3. >>> from datetime import date
    4. >>> today = date.today()
    5. >>> today
    6. datetime.date(2014, 8, 31)
    7. >>> today == date.fromtimestamp(time.time())
    8. True
    9. >>> my_birthday = date(today.year, 6, 24)
    10. >>> if my_birthday < today:
    11.         my_birthday = my_birthday.replace(year = today.year + 1)
    12. >>> my_birthday
    13. datetime.date(2015, 6, 24)
    14. >>> time_to_birthday = abs(my_birthday - today)
    15. >>> time_to_birthday.days
    16. 297
    复制代码



    关于 date 的综合应用:

    1. # Follow FishC. Follow your dream!
    2. >>> from datetime import date
    3. >>> d = date.fromordinal(735678)  # 自日期 1.1.0001 之后的第 735678 天
    4. >>> d
    5. datetime.date(2015, 3, 21)
    6. >>> t = d.timetuple()
    7. >>> for i in t:
    8.         print(i)
    9.         
    10. 2015
    11. 3
    12. 21
    13. 0
    14. 0
    15. 0
    16. 5
    17. 80
    18. -1
    19. >>> ic = d.isocalendar()
    20. >>> for i in ic:
    21.         print(i)
    22.         
    23. 2015
    24. 12
    25. 6
    26. >>> d.isoformat()
    27. '2015-03-21'
    28. >>> d.strftime("%d/%m/%y")
    29. '21/03/15'
    30. >>> d.strftime("%A %d. %B %Y")
    31. 'Saturday 21. March 2015'
    32. >>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")
    33. 'The day is 21, the month is March.'
    复制代码






    time 对象

    time 对象表示一天中的一个时间,并且可以通过 tzinfo 对象进行调整

    1. datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
    复制代码


    所有的参数都是可选的;tzinfo 可以是 None 或者 tzinfo 子类的实例对象;其余的参数可以是整数,并且在以下范围内:

    • 0 <= hour < 24
    • 0 <= minute < 60
    • 0 <= second < 60
    • 0 <= microsecond < 1000000


    注:如果参数超出范围,将引发 ValueError 异常


    time 类属性

    • time.min - time 对象所能表示的最早时间,time(0, 0, 0, 0)
    • time.max - time 对象所能表示的最晚时间,time(23, 59, 59, 999999)
    • time.resolution - time 对象表示时间的最小单位,在这里是 1 毫秒,timedelta(microseconds=1)



    time 实例属性(只读):

    属性 取值范围
    time.hour 0 ~ 23
    time.minute 0 ~ 59
    time.second 0 ~ 59
    time.microsecond 0 ~ 999999
    time.tzinfo 通过构造函数的 tzinfo 参数赋值



    time 实例方法:

    time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]) 
    - 生成一个新的时间对象,用参数指定时间代替原有对象中的属性

    time.isoformat()
    - 返回一个 ISO 8601 格式的日期字符串,如 "HH:MM:SS.mmmmmm" 的字符串

    time.__str__()
    - 对于 time 对象 t 来说,str(t) 相当于 t.isoformat()

    time.strftime(format)
    - 返回自定义格式化字符串表示时间,下面有详解

    time.__format__(format)
    - 跟 time.strftime(format) 一样,这使得调用 str.format() 时可以指定 time 对象的字符串

    time.utcoffset()
    - 如果 tzinfo 属性是 None,则返回 None;否则返回 self.tzinfo.utcoffset(self)

    time.dst()
    - 如果 tzinfo 属性是 None,则返回 None;否则返回 self.tzinfo.dst(self)

    time.tzname()
    - 如果 tzinfo 属性是 None,则返回 None;否则返回 self.tzinfo.tzname(self)


    关于 time 的综合应用:

    1. # 学编程,到鱼C
    2. >>> from datetime import time, timedelta, tzinfo
    3. >>> class GMT1(tzinfo):
    4.         def utcoffset(self, dt):
    5.                 return timedelta(hours=1)
    6.         def dst(self, dt):
    7.                 return timedelta(0)
    8.         def tzname(self, dt):
    9.                 return "欧洲/布拉格"
    10. >>> t = time(14, 10, 30, tzinfo=GMT1())
    11. >>> t
    12. datetime.time(14, 10, 30, tzinfo=<__main__.GMT1 object at 0x02D7FE90>)
    13. >>> gmt = GMT1()
    14. >>> t.isoformat()
    15. '14:10:30+01:00'
    16. >>> t.dst()
    17. datetime.timedelta(0)
    18. >>> t.tzname()
    19. '欧洲/布拉格'
    20. >>> t.strftime("%H:%M:%S %Z")
    21. '14:10:30 欧洲/布拉格'
    22. >>> 'The {} is {:%H:%M}.'.format("time", t)
    23. 'The time is 14:10.'
    复制代码






    datetime 对象

    datetime 对象是 date 对象和 time 对象的结合体,并且包含他们的所有信息

    1. datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
    复制代码


    必须的参数是 year(年)、month(月)、day(日);tzinfo 可以是 None 或者 tzinfo 子类的实例对象;其余的参数可以是整数,并且在以下范围内:

    • MINYEAR <= year <= MAXYEAR(也就是 1 ~ 9999)
    • 1 <= month <= 12
    • 1 <= day <= 根据 year 和 month 来决定(例如 2015年2月 只有 28 天)
    • 0 <= hour < 24
    • 0 <= minute < 60
    • 0 <= second < 60
    • 0 <= microsecond < 1000000


    注:如果参数超出范围,将引发 ValueError 异常


    datetime 类方法(classmethod):

    datetime.today()
    - 返回一个表示当前本地时间的 datetime 对象,等同于 datetime.fromtimestamp(time.time())

    datetime.now(tz=None)
    - 返回一个表示当前本地时间的 datetime 对象;如果提供了参数 tz,则获取 tz 参数所指时区的本地时间

    datetime.utcnow()
    - 返回一个当前 UTC 时间的 datetime 对象

    datetime.fromtimestamp(timestamp, tz=None)
    - 根据时间戮创建一个 datetime 对象,参数 tz 指定时区信息

    datetime.utcfromtimestamp(timestamp)
    - 根据时间戮创建一个 UTC 时间的 datetime 对象

    datetime.fromordinal(ordinal)
    - 返回对应 Gregorian 日历时间对应的 datetime 对象

    datetime.combine(date, time)
    - 根据参数 date 和 time,创建一个 datetime 对象

    datetime.strptime(date_string, format)
    - 将格式化字符串转换为 datetime 对象


    datetime 类属性:

    • datetime.min - datetime 对象所能表示的最早日期,datetime(MINYEAR, 1, 1, tzinfo=None)
    • datetime.max - datetime 对象所能表示的最晚日期,datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)
    • datetime.resolution - datetime 对象表示日期的最小单位,在这里是 1 毫秒,timedelta(microseconds=1)



    datetime 实例属性(只读):

    属性 取值范围
    datetime.year MINYEAR ~ MAXYEAR(1 ~ 9999)
    datetime.month 1 ~ 12
    datetime.day 1 ~ 根据 year 和 month 来决定(例如 2015年2月 只有 28 天)
    datetime.hour 0 ~ 23
    datetime.minute 0 ~ 59
    datetime.second 0 ~ 59
    datetime.microsecond 0 ~ 999999
    datetime.tzinfo 通过构造函数的 tzinfo 参数赋值



    datetime 对象支持的操作:

    操作 结果
    datetime2 = datetime1 + timedelta 日期加上一个时间间隔,返回一个新的日期对象(注1)
    datetime2 = datetime1 - timedelta 日期减去一个时间间隔,相当于 datetime2 + timedelta == datetime1(注2)
    timedelta = datetime1 - datetime2 两个日期相减得到一个时间间隔(注3)
    datetime1 < datetime2 当 datetime1 的日期在 datetime2 之前时,我们认为 datetime1 < datetime2


    注1:timedelta.day > 0 或 timedelta.day < 0 决定 datetime2 日期增长的方向;计算结果 datetime2 的 tzinfo 属性和 datetime1 相同;如果 date2.year < MINYEAR 或 date2.year > MAXYEAR,引发 OverflowError 异常

    注2:计算结果 datetime2 的 tzinfo 属性和 datetime1 相同;这并不等同于 date1 + (-timedelta),因为单独的 -timedelta 可能会溢出,而 date1 - timedelta 则不会溢出

    注3:如果 datetime1 和 datetime2 的 tzinfo 属性一样(指向同一个时区),则 tzinfo 属性被忽略,计算结果为一个 timedelta 对象 t,则 datetime2 + t == datetime1(不用进行时区调整);如果 datetime1 和 datetime2 的 tzinfo 属性不一样(指向不同时区),则 datetime1 和 datetime2 会先被转换为 UTC 时区时间,在进行计算,(datetime1.replace(tzinfo=None) - datetime1.utcoffset()) - (datetime2.replace(tzinfo=None) - datetime2.utcoffset())



    datetime 实例方法:

    datetime.date()
    - 返回一个 date 对象datetime.time() - 返回一个 time 对象(tzinfo 属性为 None)

    datetime.timetz()
    - 返回一个 time() 对象(带有 tzinfo 属性)

    datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])
    - 生成一个新的日期对象,用参数指定日期和时间代替原有对象中的属性

    datetime.astimezone(tz=None)
    - 传入一个新的 tzinfo 属性,返回根据新时区调整好的 datetime 对象

    datetime.utcoffset()
    - 如果 tzinfo 属性是 None,则返回 None;否则返回 self.tzinfo.utcoffset(self)

    datetime.dst()
    - 如果 tzinfo 属性是 None,则返回 None;否则返回 self.tzinfo.dst(self)

    datetime.tzname()
    - 如果 tzinfo 属性是 None,则返回 None;否则返回 self.tzinfo.tzname(self)

    datetime.timetuple()
    -  返回日期对应的 time.struct_time 对象(类似于 time 模块的 time.localtime())

    datetime.utctimetuple()
    - 返回 UTC 日期对应的 time.struct_time 对象

    datetime.toordinal()
    - 返回日期对应的 Gregorian Calendar 日期(类似于 self.date().toordinal())

    datetime.timestamp()
    - 返回当前时间的时间戳(类似于 time 模块的 time.time())

    datetime.weekday()
    - 返回 0 ~ 6 表示星期几(星期一是 0,依此类推)

    datetime.isoweekday() 
    - 返回 1 ~ 7 表示星期几(星期一是1, 依此类推)

    datetime.isocalendar() 
    - 返回一个三元组格式 (year, month, day)

    datetime.isoformat(sep='T')
    - 返回一个 ISO 8601 格式的日期字符串,如 "YYYY-MM-DD" 的字符串

    datetime.__str__()
    - 对于 date 对象 d 来说,str(d) 相当于 d.isoformat()

    datetime.ctime()
    - 返回一个表示日期的字符串,相当于 time 模块的 time.ctime(time.mktime(d.timetuple()))

    datetime.strftime(format)
    - 返回自定义格式化字符串表示日期,下面有详解

    datetime.__format__(format)
    - 跟 datetime.strftime(format) 一样,这使得调用 str.format() 时可以指定 data 对象的字符串


    关于 datetime 的综合应用:

    1. # I love FishC.com!
    2. >>> from datetime import datetime, date, time
    3. # 使用 datetime.combine()
    4. >>> d = date(2015, 8, 1)
    5. >>> t = time(12, 30)
    6. >>> datetime.combine(d, t)
    7. datetime.datetime(2015, 8, 1, 12, 30)
    8. # 使用 datetime.now() 或 datetime.utcnow()
    9. >>> datetime.now()
    10. datetime.datetime(2014, 8, 31, 18, 13, 40, 858954)
    11. >>> datetime.utcnow()
    12. datetime.datetime(2014, 8, 31, 10, 13, 49, 347984)
    13. # 使用 datetime.srptime()
    14. >>> dt = datetime.strptime("21/11/14 16:30", "%d/%m/%y %H:%M")
    15. >>> dt
    16. datetime.datetime(2014, 11, 21, 16, 30)
    17. # 使用 datetime.timetuple()
    18. >>> tt = dt.timetuple()
    19. >>> for it in tt:
    20.         print(it)
    21. 2014
    22. 11
    23. 21
    24. 16
    25. 30
    26. 0
    27. 4
    28. 325
    29. -1
    30. # ISO 格式的日期
    31. >>> ic = dt.isocalendar()
    32. >>> for it in ic:
    33.         print(it)
    34. 2014
    35. 47
    36. 5
    37. # 格式化 datetime 对象
    38. >>> dt.strftime("%A, %d. %B %Y %I:%M%p")
    39. 'Friday, 21. November 2014 04:30PM'
    40. >>> 'The {1} is {0:%d}, the {2} is {0:%B}, the {3} is {0:%I:%M%p}.'.format(dt, "day", "month", "time")
    41. 'The day is 21, the month is November, the time is 04:30PM.'
    复制代码



    带有 tzinfo 的 datetime 综合演示:

    1. # 嘿,都能看到这里来了,毅力不错哈^_^
    2. >>> from datetime import timedelta, datetime, tzinfo
    3. >>> class GMT1(tzinfo):
    4.         def utcoffset(self, dt):
    5.                 return timedelta(hours=1) + self.dst(dt)
    6.         def dst(self, dt):
    7.                 # DST 开始于三月最后一个星期天
    8.                 # 结束于十月最后一个星期天
    9.                 d = datetime(dt.year, 4, 1)
    10.                 self.dston = d - timedelta(days=d.weekday() + 1)
    11.                 d = datetime(dt.year, 11, 1)
    12.                 self.dstoff = d - timedelta(days=d.weekday() + 1)
    13.                 if self.dston <= dt.replace(tzinfo=None) < self.dstoff:
    14.                         return timedelta(hours=1)
    15.                 else:
    16.                         return timedelta(0)
    17.         def tzname(self, dt):
    18.                 return "GMT +1"
    19.         
    20. >>> class GMT2(tzinfo):
    21.         def utcoffset(self, dt):
    22.                 return timedelta(hours=2) + self.dst(dt)
    23.         def dst(self, dt):
    24.                 d = datetime(dt.year, 4, 1)
    25.                 self.dston = d - timedelta(days=d.weekday() + 1)
    26.                 d = datetime(dt.year, 11, 1)
    27.                 self.dstoff = d - timedelta(days=d.weekday() + 1)
    28.                 if self.dston <=  dt.replace(tzinfo=None) < self.dstoff:
    29.                         return timedelta(hours=1)
    30.                 else:
    31.                         return timedelta(0)
    32.         def tzname(self, dt):
    33.                 return "GMT +2"
    34.         
    35. >>> gmt1 = GMT1()
    36. # 夏令时
    37. >>> dt1 = datetime(2014, 11, 21, 16, 30, tzinfo=gmt1)
    38. >>> dt1.dst()
    39. datetime.timedelta(0)
    40. >>> dt1.utcoffset()
    41. datetime.timedelta(0, 3600)
    42. >>> dt2 = datetime(2014, 6, 14, 13, 0, tzinfo=gmt1)
    43. >>> dt2.dst()
    44. datetime.timedelta(0, 3600)
    45. >>> dt2.utcoffset()
    46. datetime.timedelta(0, 7200)
    47. # 将 datetime 转换到另一个时区
    48. >>> dt3 = dt2.astimezone(GMT2())
    49. >>> dt3
    50. datetime.datetime(2014, 6, 14, 14, 0, tzinfo=<__main__.GMT2 object at 0x036C0F70>)
    51. >>> dt2
    52. datetime.datetime(2014, 6, 14, 13, 0, tzinfo=<__main__.GMT1 object at 0x036C0B10>)
    53. >>> dt2.utctimetuple() == dt3.utctimetuple()
    54. True
    复制代码






    格式化字符串:strftime() 和 strptime()

    date, datetime, 和 time 对象均支持使用 strftime(format) 方法,将指定的日期或时间转换为自定义的格式化字符串

    相反的,datetime.strptime() 类方法却是把格式化字符串转换为 datetime 对象

    格式化指令 含义
    %a 星期的简写(星期一 ~ 天:Mon, Tue, Wed, Thu, Fri, Sat, Sun)
    %A 星期的全写(星期一 ~ 天:Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
    %w 在一个星期中的第几天( 0 表示星期天 ... 6 表示星期六)
    %d 在一个月中的第几天(01, 02, ..., 31)
    %b 月份的简写(一月 ~ 十二月:Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
    %B 月份的全写(一月 ~ 十二月:January, February, March, April, May, June, July, August, September, October, November, December)
    %m 月份(01, 02, ..., 12)
    %y 用两个数字表示年份(例如 2014年 == 14)
    %Y 用四个数字表示年份
    %H 二十四小时制(00, 01, ..., 23)
    %I 十二小时制(01, 02, ..., 11)
    %p AM 或者 PM
    %M 分钟(00, 01, ..., 59)
    %S 秒(00, 01, ..., 59)
    %f 微秒(000000, 000001, ..., 999999)
    %z 与 UTC 时间的间隔 ;如果是本地时间,返回空字符串((empty), +0000, -0400, +1030)
    %Z 时区名称;如果是本地时间,返回空字符串((empty), UTC, EST, CST)
    %j 在一年中的第几天(001, 002, ..., 366)
    %U 在一年中的第几周,星期天作为第一天(00, 01, ..., 53)
    %W 在一年中的第几周,星期一作为第一天(00, 01, ..., 53)
    %c 用字符串表示日期和时间(Tue Aug 16 21:30:00 2014)
    %x 用字符串表示日期(08/16/14)
    %X 用字符串表示时间(21:30:00)
    %% 表示百分号



    格式化字符串综合演示:

    1. >>> from datetime import datetime
    2. >>> dt = datetime.now()
    3. >>> print('(%Y-%m-%d %H:%M:%S %f): ', dt.strftime('%Y-%m-%d %H:%M:%S %f'))
    4. (%Y-%m-%d %H:%M:%S %f):  2014-08-31 23:54:58 379804
    5. >>> print('(%Y-%m-%d %H:%M:%S %p): ', dt.strftime('%y-%m-%d %I:%M:%S %p'))
    6. (%Y-%m-%d %H:%M:%S %p):  14-08-31 11:54:58 PM
    7. >>> print('%%a: %s ' % dt.strftime('%a'))
    8. %a: Sun 
    9. >>> print('%%A: %s ' % dt.strftime('%A'))
    10. %A: Sunday 
    11. >>> print('%%b: %s ' % dt.strftime('%b'))
    12. %b: Aug 
    13. >>> print('%%B: %s ' % dt.strftime('%B'))
    14. %B: August 
    15. >>> print('日期时间%%c: %s ' % dt.strftime('%c'))
    16. 日期时间%c: 08/31/14 23:54:58 
    17. >>> print('日期%%x:%s ' % dt.strftime('%x'))
    18. 日期%x:08/31/14 
    19. >>> print('时间%%X:%s ' % dt.strftime('%X'))
    20. 时间%X:23:54:58 
    21. >>> print('今天是这周的第%s天 ' % dt.strftime('%w'))
    22. 今天是这周的第0天 
    23. >>> print('今天是今年的第%s天 ' % dt.strftime('%j'))
    24. 今天是今年的第243天 
    25. >>> print('今周是今年的第%s周 ' % dt.strftime('%U'))
    26. 今周是今年的第35周
    复制代码
  • 相关阅读:
    MSDN for 2010的那些麻烦事
    CPtrList操作--插入,删除特定元素,删除全部
    如何绕过ORA00701错误和降低bootstrap对象的高水位
    ORA00600:[1112]内部错误&ROW CACHE ENQUEUE LOCK一例
    CRS5008: Invalid attribute value
    ORA00600[kjpsod1]&ORA44203错误一例
    runInstaller ignoreInternalDriverError
    RMAN CURSOR_SHARING=EXACT脚本
    SQL调优:带函数的谓词导致CBO Cardinality计算误差
    11g Real Application Testing:Database Replay使用方法
  • 原文地址:https://www.cnblogs.com/laogao123/p/9799060.html
Copyright © 2011-2022 走看看