datetime

Python 提供了两个标准库用于处理跟时间相关的问题,一个是 time,另一个是 datetimedatetimetime 进行了封装,提供了更多实用的函数。本文介绍 datetime 库的简单使用。

当前时间

获取当前时间可以使用 now()utcnow() 方法,其中,now() 用于获取当地时间,而 utcnow() 用于获取 UTC 时间。

  1. >>> from datetime import datetime
  2. >>> datetime.now() # 返回一个 datetime 对象,这里是当地时间
  3. datetime.datetime(2016, 12, 10, 11, 32, 43, 806970)
  4. >>> datetime.utcnow() # 返回一个 datetime 对象,这里是 UTC 时间
  5. datetime.datetime(2016, 12, 10, 3, 32, 49, 999423)
  6. >>> datetime.now().year, datetime.now().month, datetime.now().day # 年月日
  7. (2016, 12, 10)
  8. >>> datetime.now().hour, datetime.now().minute, datetime.now().second # 时分秒
  9. (11, 35, 37)

时间格式化

有时,我们需要对时间做格式化处理,可以使用 strftime()strptime() 方法,其中,strftime 用于对 datetime 对象进行格式化,strptime 用于对字符串对象进行格式化。

  1. >>> from datetime import datetime
  2. # 获取当前当地时间
  3. >>> now = datetime.now()
  4. >>> now
  5. datetime.datetime(2016, 12, 10, 11, 46, 24, 432168)
  6. # 对 datetime 对象进行格式化,转为字符串格式
  7. >>> now_str = now.strftime('%Y-%m-%d %H:%M:%S.%f')
  8. >>> now_str
  9. '2016-12-10 11:46:24.432168'
  10. # 对字符串对象进行格式化,转为 datetime 对象
  11. >>> datetime.strptime(now_str, '%Y-%m-%d %H:%M:%S.%f')
  12. datetime.datetime(2016, 12, 10, 11, 46, 24, 432168)

时间戳

Unix 时间戳根据精度的不同,有 10 位(秒级),13 位(毫秒级),16 位(微妙级)和 19 位(纳秒级)。

要注意的是,由于每个时区都有自己的本地时间(北京在东八区),因此也产生了世界标准时间(UTC, Universal Time Coordinated)。所以,在将一个时间戳转换为普通时间(比如 2016-01-01 12:00:00)时,要注意是要本地时区的时间还是世界时间等。

  • 获取当前当地时间戳
  1. >>> import time
  2. >>> from datetime import datetime
  3. # 获取当前当地时间,返回一个 datetime 对象
  4. >>> now = datetime.now()
  5. >>> now
  6. datetime.datetime(2016, 12, 9, 11, 56, 47, 632778)
  7. # 13 位的毫秒时间戳
  8. >>> long(time.mktime(now.timetuple()) * 1000.0 + now.microsecond / 1000.0)
  9. 1481255807632L
  10. # 10 位的时间戳
  11. >>> int(time.mktime(now.timetuple()))
  12. 1481255807
  • 获取当前 UTC 时间戳
  1. >>> import calendar
  2. >>> from datetime import datetime
  3. # 获取当前的 UTC 时间,返回 datetime 对象
  4. >>> utc_now = datetime.utcnow()
  5. >>> utc_now
  6. datetime.datetime(2016, 12, 9, 4, 0, 53, 356641)
  7. # 13 位的时间戳
  8. >>> long(calendar.timegm(utc_now.timetuple()) * 1000.0 + utc_now.microsecond / 1000.0)
  9. 1481256053356L
  10. # 10 位的时间戳
  11. >>> calendar.timegm(utc_now.timetuple())
  12. 1481256053
  • 将时间戳转为字符串形式
  1. >>> from datetime import datetime
  2. # 13 位的毫秒时间戳
  3. >>> timestamp = 1456402864242
  4. # 根据时间戳构建当地时间
  5. >>> datetime.fromtimestamp(timestamp / 1000.0).strftime('%Y-%m-%d %H:%M:%S.%f')
  6. '2016-02-25 20:21:04.242000'
  7. # 根据时间戳构建 UTC 时间
  8. >>> datetime.utcfromtimestamp(timestamp / 1000.0).strftime('%Y-%m-%d %H:%M:%S.%f')
  9. '2016-02-25 12:21:04.242000'
  10. # 10 位的时间戳
  11. >>> timestamp = 1456402864
  12. # 根据时间戳构建当地时间
  13. >>> datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
  14. '2016-02-25 20:21:04'
  15. # 根据时间戳构建 UTC 时间
  16. >>> datetime.utcfromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
  17. '2016-02-25 12:21:04'
  • 将时间戳转为 datetime 形式
  1. >>> from datetime import datetime
  2. # 13 位的毫秒时间戳
  3. >>> timestamp = 1456402864242
  4. # 根据时间戳构建当地时间
  5. >>> datetime.fromtimestamp(timestamp / 1000.0)
  6. datetime.datetime(2016, 2, 25, 20, 21, 4, 242000)
  7. # 根据时间戳构建 UTC 时间
  8. >>> datetime.utcfromtimestamp(timestamp / 1000.0)
  9. datetime.datetime(2016, 2, 25, 12, 21, 4, 242000)
  10. # 10 位的时间戳
  11. >>> timestamp = 1456402864
  12. # 根据时间戳构建当地时间
  13. >>> datetime.fromtimestamp(timestamp)
  14. datetime.datetime(2016, 2, 25, 20, 21, 4)
  15. # 根据时间戳构建 UTC 时间
  16. >>> datetime.utcfromtimestamp(timestamp)
  17. datetime.datetime(2016, 2, 25, 12, 21, 4)

参考资料