Skip to content

时间操作函数DateUtils

我们在 python 的 datetime 模块的基础上提供一系列函数。这些函数和 SeaTable 中函数列提供的日期函数行为一致,方便用户对 SeaTable 中的日期进行处理。

时区处理: 所有的操作函数本地时区进行处理。如果输入带有时区信息的时间,那么先转换成本地时区时间然后处理。

函数引入

from seatable_api import dateutils

date

返回 ISO 格式化的日期字符串

dateutils.date(2020, 5, 16) # 2020-05-16

now

返回 ISO 格式化的当前日期和时间字符串,精确到秒

dateutils.now() # 2022-02-07 09:44:00

dateadd

对时间进行加法运算,通过传递不同的单位参数可以加年,月,周,日,小时,分钟,秒,默认使用‘日’作为单位

time_str = "2020-6-15"
time_str_s = "2020-6-15 15:23:21"

dateutils.dateadd(time_str, -2, 'years') # 2018-06-15
dateutils.dateadd(time_str, 3, 'months') # 2020-09-15
dateutils.dateadd(time_str_s, 44, 'minutes') # 2020-06-15 16:07:21
dateutils.dateadd(time_str_s, 1000, 'days') # 2023-03-12 15:23:21
dateutils.dateadd(time_str_s, 3, 'weeks') # 2020-07-06 15:23:21
dateutils.dateadd(time_str_s, -3, 'hours') # 2020-06-15 12:23:21
dateutils.dateadd(time_str_s, 3, 'seconds') # 2020-06-15 15:23:24

datediff

计算两个日期之间相隔的秒数,天数, 月数,年数, 参数可以为 S, Y, M, D, YM, MD

其中

  • YM, 开始时间与结束时间之间月份之差, 忽略日期中的天和年份
  • MD, 开始时间与结束时间之间天数之差, 忽略日期中的月份和年份
  • YD, 开始时间与结束时间的日期部分之差, 忽略日期中的年份。
time_start = "2019-6-1"
time_end = "2020-5-15"
dateutils.datediff(start=time_start, end=time_end, unit='S') # seconds 30153600
dateutils.datediff(start=time_start, end=time_end, unit='Y') # years 0
dateutils.datediff(start=time_start, end=time_end, unit='D') # days 349
dateutils.datediff(start=time_start, end=time_end, unit='H') # hours 8376
dateutils.datediff(start=time_start, end=time_end, unit='M') # months 11
dateutils.datediff(start=time_start, end=time_end, unit='YM') #  11
dateutils.datediff(start=time_start, end=time_end, unit='MD') #  14
dateutils.datediff("2019-2-28","2020-2-1", unit='YD') # -27

eomonth

返回某个日期的前 n 个月或后 n 个月的最后一天, 参数为 months 代表 n

date = "2022-7-4"
dateutils.eomonth(date, months=0) # 2022-07-31
dateutils.eomonth(date, months=2) # 2022-09-30
dateutils.eomonth(date, months=-5) # 2022-02-28

year

返回某个日期的年

dateutils.year("2019-1-1") # 2019

month

返回某个日期的月

dateutils.month("2019-5-4") # 5

months

返回两个日期相差的月数

dateutils.months("2019-5-1","2020-5-4") # 12

day

返某个日期的天

dateutils.day('2020-6-15 15:23:21') # 15

days

返回两个日期相差的天数

dateutils.days('2019-6-1', '2020-5-15') # 349

hour

返回时间的小时数

dateutils.hour("2020-1-1 12:20:30") # 12

hours

返回两个日期相差的小时数

dateutils.hours("2019-6-3 20:1:12", "2020-5-3 13:13:13") # 8033

minute

返回时间的分钟数

dateutils.minute("2020-5-3 13:13:13") # 13

second

返回时间的秒数

dateutils.second("2020-5-3 13:13:33") # 33

weekday

返回某个日期是星期几, 记周一为0, 周日为6

dateutils.weekday("2019-6-3") # 0

isoweekday

基于iso标准,返回某个日期是星期几,记周一为1, 周日为7

dateutils.isoweekday("2019-6-3") # 1

weeknum

返回某个日期是当年的第几周,含1月1日为第一周

dateutils.weeknum('2012-1-2') # 2

isoweeknum

返回某个日期当年的 ISO 周计数, 即当年第一个周四开始记为第一周

dateutils.isoweeknum('2012-1-2') # 1

isomonth

返回某个日期字符串的 ISO 格式的月份

dateutils.isomonth("2012-1-2") # 2012-01

quarter_from_yq

返回一个季度对象,参数包含年份,季度。

q = dateutils.quarter_from_yq(2022, 3) # <DateQuarter-2022,3Q>

quarter_from_ym

返回一个季度对象, 参数包含年份, 月份

q = dateutils.quarter_from_ym(2022, 3) # <DateQuarter-2022,3Q>

to_quarter

返回某个日期字符串对应的季度(DateQuarter对象)

time_str = "2022-07-17"
q = dateutils.to_quarter(time_str) # DateQuarter obj: <DateQuarter-2022,3Q>

quarters_within

返回开始日期,结束日期之间的季度, 返回一个生成器, 里面会产生DateQuarter 对象,包含参数 include_last 是否包含最后一个季度, 默认为 False

qs = dateutils.quarters_within("2021-03-28", "2022-07-17", include_last=True) # 生成器
list(qs) # [<DateQuarter-2021,1Q>, <DateQuarter-2021,2Q>,...., <DateQuarter-2022,3Q>]

季度操作

季度对象包含年,月等属性, 并且可以进行运算

q = dateutils.quarter_from_yq(2022, 3)
# 获取年份, 季度, 开始结束日期等
q.year # 2022
q.quarter # 3

q.start_date # 2022-07-01
q.end_date # 2022-09-30

# 日期遍历
q.days()  # 生成器对象, 里面包含该季度所有日期
list(q.days()) # [datetime.date(2022, 7, 1), datetime.date(2022, 7, 2),....., datetime.date(2022, 9, 30)]

# 季度运算
q + 10 # <DateQuarter-2025,1Q> 2025年第一季度
q1 = dateutils.quater_from_yq(2021, 1) # <DateQuarter-2021,1Q>
q - q1 # 6
q < q1 # False
"2022-6-28" in q # False
"2022-8-28" in q # True

时间处理举例

通过dateutils获取的日期信息,可以当作参数再次传递到dateutils的处理函数中去

dt_now = dateutils.now()  # 2022-02-07 09:49:14
# 1. 获取10天后的时间
dt_10_days = dateutils.dateadd(dt_now, 10) # 2022-02-17 09:49:14
# 2. 获取10天后的月份
dt_month_10_days = dateutils.month(dt_10_days) # 2
# 3. 获取时间差,天数差
dt_10_days_before = dateutils.dateadd(dt_now, -10)
date_df = dateutils.datediff(dt_10_days_before, dt_10_days, unit="D") # 20

# 4. 处理有时区的时间字符串
time_str = "2021-07-17T08:15:41.106+00:00"
time_day = dateutils.day(time_str) # 17
time_month = dateutils.month(time_str) # 7
time_year = dateutils.year(time_str) # 2021
time_hour = dateutils.hour(time_str) # 16,因为北京时间比 UTC 时间多 8 小时
time_date = dateuitls.date(time_year, time_month, time_day) # 2021-07-17

注意,SQL 查询接口

  • 对日期列类型返回的是 ISO 格式的服务器所在时区的时间字符串, 比如 2021-07-17T00:00:00+08:00
  • 对创建时间列和最后修改时间列返回的是 ISO 格式的 UTC 时区的时间字符串。比如 2021-07-17T08:15:41+00:00

两种类型的时间都可以通过 Python 标准库中的 datetime 模块来处理。