影刀RPA 日期时间处理的那些坑时区、格式、计算、工作日判断日期时间处理是每个RPA项目都会遇到的基本功——采集的时间要格式化、两个时间要算差值、要判断今天是不是工作日、定时任务要在正确的时间触发。但日期时间的坑特别多时区不对差8小时、字符串转日期格式不匹配报错、跨月跨年的加减算错。这篇文章把日期时间处理的核心问题逐个击破。影刀内置的日期时间变量影刀提供了一套系统变量用于日期时间系统变量值示例说明{当前时间}2026-07-01 14:30:00完整的日期时间{当前日期}2026-07-01只有日期{当前年份}2026{当前月份}07{当前日}01{当前小时}1424小时制{当前分钟}30{当前星期}31周一7周日这些变量可以直接在影刀的【日志输出】、【填写】等动作里使用。格式转换字符串 ↔ 日期字符串转日期从网页采集的日期2026年7月1日转成标准格式。影刀方式【文本处理】里的日期格式化功能有限复杂格式处理不了。拼多多店群自动化上架方案Python方式fromdatetimeimportdatetime# 标准格式dtdatetime.strptime(2026-07-01,%Y-%m-%d)# 中文格式dtdatetime.strptime(2026年7月1日,%Y年%m月%d日)# 斜杠格式dtdatetime.strptime(2026/07/01 14:30:00,%Y/%m/%d %H:%M:%S)# 不带分隔符dtdatetime.strptime(20260701,%Y%m%d)# 英文月份dtdatetime.strptime(01-Jul-2026,%d-%b-%Y)格式化代码对照表代码含义示例%Y四位年份2026%y两位年份26%m月份补零07%d日期补零01%H小时24h14%I小时12h02%M分钟30%S秒45%b英文简写月Jul%B英文全称月July%A星期全称Wednesday日期转字符串fromdatetimeimportdatetime nowdatetime.now()# 标准格式now.strftime(%Y-%m-%d)# 2026-07-01now.strftime(%Y-%m-%d %H:%M:%S)# 2026-07-01 14:30:00# 中文格式now.strftime(%Y年%m月%d日)# 2026年07月01日# 文件名安全格式now.strftime(%Y%m%d_%H%M%S)# 20260701_143000日期加减计算fromdatetimeimportdatetime,timedelta todaydatetime.now()# 加减天数yesterdaytoday-timedelta(days1)tomorrowtodaytimedelta(days1)last_weektoday-timedelta(weeks1)# 加减小时one_hour_agotoday-timedelta(hours1)# 本月第一天first_daytoday.replace(day1)# 本月最后一天下月第一天减一天iftoday.month12:next_monthtoday.replace(yeartoday.year1,month1,day1)else:next_monthtoday.replace(monthtoday.month1,day1)last_daynext_month-timedelta(days1)计算两个日期的差值startdatetime(2026,7,1)enddatetime(2026,7,15)diffend-startprint(diff.days)# 14 天print(diff.total_seconds())# 1209600 秒工作日判断RPA中经常需要只在工作日执行或跳过周末。importdatetimedefis_workday(dateNone):ifdateisNone:datedatetime.date.today()# weekday(): 0周一, 6周日returndate.weekday()5defnext_workday(dateNone):ifdateisNone:datedatetime.date.today()whiledate.weekday()5:datedatetime.timedelta(days1)returndate法定节假日判断周末好判断法定节假日需要额外的数据。可以用chinesecalendar库# pip install chinesecalendarfromchinese_calendarimportis_workday,is_holidayimportdatetime todaydatetime.date.today()ifis_workday(today):print(今天是工作日含调休)elifis_holiday(today):print(今天是法定节假日)else:print(今天是普通周末)这个库每年更新国务院发布的节假日安排自动处理调休。时区处理如果你的RPA要处理跨时区的数据比如对接海外系统时区是个大坑。fromdatetimeimportdatetime,timezone,timedelta# 北京时间UTC8beijing_tztimezone(timedelta(hours8))# 获取当前北京时间beijing_nowdatetime.now(beijing_tz)print(beijing_now)# 2026-07-01 14:30:0008:00# UTC时间转北京时间utc_timedatetime(2026,7,1,6,30,0,tzinfotimezone.utc)beijing_timeutc_time.astimezone(beijing_tz)print(beijing_time)# 2026-07-01 14:30:0008:00处理系统时间不一致有些服务器上的时间是UTC你的脚本在北京时区。如果你直接用datetime.now()而没有指定时区拿到的是服务器本地时间——可能比北京时间慢8小时。# 不够安全依赖系统时区设置nowdatetime.now()# 更安全明确指定时区fromdatetimeimporttimezone,timedelta beijing_tztimezone(timedelta(hours8))nowdatetime.now(beijing_tz)# 或者直接用系统的北京时间importtimeimportos os.environ[TZ]Asia/Shanghaitime.tzset()TEMU店群如何管理运营常见翻车现场翻车1月份和日期的混淆# 错误7月15日被当成2026-15-07还是2026-07-15date_str07/15/2026# 美国人写的是月/日/年中国人可能以为是日/月/年# 解决明确指定格式fromdatetimeimportdatetime dtdatetime.strptime(07/15/2026,%m/%d/%Y)# 月/日/年翻车2strftime和strptime搞反# strptime字符串(parse) → 日期对象dtdatetime.strptime(2026-07-01,%Y-%m-%d)# strftime日期对象(format) → 字符串sdt.strftime(%Y年%m月%d日)记忆技巧p parse解析f format格式化。翻车3timedelta不支持月份加减# 不支持timedelta(months1)# 要加减月份必须手动处理fromdatetimeimportdatetime dtdatetime(2026,7,31)# 加一个月 - 8月31日但8月有31天这里没问题# 减一个月 - 6月31日6月只有30天会报错# 安全的月份加减fromdateutil.relativedeltaimportrelativedelta dtrelativedelta(months1)# 加一个月dtrelativedelta(months-1)# 减一个月翻车4Excel日期读取Excel里的日期在openpyxl中读出来可能是datetime对象也可能是一串数字Excel内部以1900年1月1日为起点的天数。用pandas读取时通常能自动转换用openpyxl则要自己判断fromdatetimeimportdatetime valuews[A1].valueifisinstance(value,datetime):date_strvalue.strftime(%Y-%m-%d)elifisinstance(value,(int,float)):# Excel日期序列号fromdatetimeimportdatetime,timedelta basedatetime(1899,12,30)# Excel的日期基准date_str(basetimedelta(daysint(value))).strftime(%Y-%m-%d)else:# 字符串格式尝试解析date_strstr(value)总结日期处理核心就是两件事——格式转换字符串↔日期对象和日期计算加减天/月/年。用Python的datetime模块最灵活。注意时区、注意Excel日期读取的坑、注意timedelta不支持月份的加减。作者林焱