模块 time:时间操作

time 模块提供了时间日期的有关操作,主要为 time.Datetimetime.Duration

time.Datetime

提供了日期与时间的相关能力

属性 year, month, day, month, minute, second, nanosecond (int)

返回底层的年月日时分秒和纳秒

属性 timestamp, nanotimestamp (int)

返回 Unix 时间戳

  • timetamp 属性返回 int 类型的秒级时间戳
  • nanotimestamp 属性为 int 类型的纳秒级时间戳

如需获取毫秒级时间戳可利用 .nanotimestamp // 1E6 获得

如需获取小数的秒级时间戳可利用 .nanotimestamp / 1E9 获得

d = time.datetime(2021, 3, 6, 14, 7, 21)
assert(d.year == 2021)
assert(d.month == 3)
assert(d.day == 6)
assert(d.hour == 14)
assert(d.minute == 7)
assert(d.second == 21)
assert(d.timestamp == 1615010841)
assert(d.nanotimestamp == 1615010841000000000)

d += 123 * time.MILLISECOND + 456 * time.MICROSECOND + 789 * time.NANOSECOND
assert(d.timestamp == 1615010841)
assert(d.nanotimestamp == 1615010841123456789)
assert(d.nanotimestamp // 1E6 == 1615010841123)
assert(d.nanotimestamp / 1E9 > 1615010841)
assert(d.nanotimestamp / 1E9 < 1615010842)

format(format: str) → str

进行格式化,format 为 Go 的 datetime 格式化字符串

  • 6 06 2006 代表年
  • 1 01 Jan 代表月
  • 2 02 代表日
  • 3 03 15 代表时,可增加 AM PM 代表上午/下午
  • 4 04 代表分
  • 5 05 代表秒

常见的组合有:

const (
    ANSIC       = "Mon Jan _2 15:04:05 2006"
    UnixDate    = "Mon Jan _2 15:04:05 MST 2006"
    RubyDate    = "Mon Jan 02 15:04:05 -0700 2006"
    RFC822      = "02 Jan 06 15:04 MST"
    RFC822Z     = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
    RFC850      = "Monday, 02-Jan-06 15:04:05 MST"
    RFC1123     = "Mon, 02 Jan 2006 15:04:05 MST"
    RFC1123Z    = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
    RFC3339     = "2006-01-02T15:04:05Z07:00"
    RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
    Kitchen     = "3:04PM"
    // Handy time stamps.
    Stamp      = "Jan _2 15:04:05"
    StampMilli = "Jan _2 15:04:05.000"
    StampMicro = "Jan _2 15:04:05.000000"
    StampNano  = "Jan _2 15:04:05.000000000"
)

比较运算(相等、不等、大于、小于、不大于、不小于)

两个 Datetime 之间支持全部六种比较

数值运算(加减)

Datetime 可以和 Duration 进行加减(Datetime 必须为左操作数、Duration 必须为右操作数),结果依然是 Datetime

两个 Datetime 之间可以进行相减,结果为 Duration

base = time.datetime(2001, 1, 1, 10, 0)
cmp = base + 3 * time.DAY - 2 * time.HOUR + 8 * time.MINUTE
assert(cmp > base)
assert(cmp  == time.datetime(2001, 1, 4, 8, 8))
assert(cmp - base == 3 * time.DAY - 2 * time.HOUR + 8 * time.MINUTE)

time.Duration

提供了时长的相关能力

属性 seconds, nanoseconds (int)

均为 int 类型,分别代表了底层有多少秒/纳秒

base = 5 * time.MINUTE + 2 * time.MILLISECOND
assert(base.seconds == 300)
assert(base.seconds == base // time.SECOND)
assert(base.seconds < base / time.SECOND)
assert(base.nanoseconds == base / time.NANOSECOND)
assert(base.nanoseconds == 300002000000)

比较运算(相等、不等、大于、小于、不大于、不小于)

两个 Duration 之间支持全部六种比较

数值运算(取相反数,加减乘除,整除)

Duration 可以取相反数,取反结果依然是 Duration

两个 Duration 之间可以加减,加减结果依然是 Duration

Duration 和 int/float 可以相乘,结果依然是 Duration

Duration(除数)和 int/float(被除数)可以相除,结果依然是 Duration

两个 Duration 之间可以相除,结果是 float

两个 Duration 之间可以相整除,结果是 int

base = 10 * time.SECOND
assert(base == 10 * time.SECOND)
assert(-base == 10 * -time.SECOND)
assert(base * 2 == 20 * time.SECOND)
assert(2 * base == 20 * time.SECOND)
assert(2 * base == 20 * time.SECOND)
assert(base + base == 20 * time.SECOND)
assert(base - 3 * time.SECOND == 7 * time.SECOND)
assert(base - base == 0 * time.SECOND)
assert(base / 2 == 5 * time.SECOND)
assert(base / 3 > 3 * time.SECOND)
assert(base / (3 * time.SECOND) > 3)
assert(base // (3 * time.SECOND) == 3)

预定义变量:NANOSECOND, MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR, DAY (Duration)

  • NANOSECOND 纳秒
  • MICROSECOND 微秒
  • MILLISECOND 毫秒
  • SECOND 秒
  • MINUTE 分钟
  • HOUR 小时
  • DAY 天

内置函数

time.now() → Datetime

返回当前时间

time.datetime(year, month, day, hour=0, minute=0, second=0) → Datetime

返回指定时间,所使用的时区为东八区

time.fromtimestamp(timestamp: int) → Datetime

根据秒级时间戳获得时间

time.fromnanotimestamp(timestamp: int) → Datetime

根据纳秒级时间戳获得时间

time.strptime(date_string: string, format: string) → Datetime

解析字符串时间,format 请参考上面的 Datetime.format 中的内容

d = time.strptime("2021-03-06 14:07:21", "2006-01-02 15:04:05")
assert(d.year == 2021)
assert(d.month == 3)
assert(d.day == 6)
assert(d.hour == 14)
assert(d.minute == 7)
assert(d.second == 21)
assert(d.timestamp == 1615010841)
assert(d.nanotimestamp == 1615010841000000000)