为什么R处理CET时区2021年3月28日02:00-02:59的日期时返回NA
问题原因
这是夏令时切换的正常现象,并非R或lubridate的bug。
欧洲中部时间CET(Central European Time)的夏令时规则为:每年3月最后一个周日将时钟向前拨1小时,10月最后一个周日回拨1小时。2021年的夏令时切换节点恰好是3月28日:当日凌晨01:59:59之后,时钟直接跳转至03:00:00,CET时区本身不存在2021年3月28日02:00:00~02:59:59这个时间段的合法时间,因此R解析该时间段的时间时会返回NA。
解决方案
根据不同的业务需求,可以选择以下几种处理方式:
方案1:改用UTC时区做时间运算
UTC(协调世界时)没有夏令时切换,不存在时间缺失/重复的问题,是时间运算的首选时区。你可以先把原始时间转为UTC完成加减运算,再按需转回CET时区:
df %>% # 原始时间转UTC mutate(date.time_utc = with_tz(date.time, tz = "UTC"), # UTC时区下完成分钟加法 new.date.time_utc = date.time_utc + lubridate::minutes(minutes.to.add), # 运算完成后转回CET new.date.time = with_tz(new.date.time_utc, tz = "CET")) %>% # 清理过程列 select(-date.time_utc, -new.date.time_utc)
运行后第5行的new.date.time会返回2021-03-28 03:00:00,符合CET时区的实际时间跳转规则。
方案2:指定夏令时冲突的自动滚动规则
如果业务要求必须直接解析CET时区的名义时间,可以在解析时间时添加滚动参数,遇到不存在的夏令时时间时自动滚动到最近的合法时间:
# 基础as.POSIXct写法,roll=TRUE表示自动滚动到合法时间 as.POSIXct("2021-03-28 02:00:00", format="%Y-%m-%d %H:%M:%S", tz="CET", roll = TRUE) # lubridate parse_date_time写法,可指定滚动方向 lubridate::parse_date_time("2021-03-28 02:00:00", orders = "Ymd HMS", tz = "CET", roll_dst = "next")
两种写法都会返回2021-03-28 03:00:00,不会返回NA。
内容的提问来源于stack exchange,提问作者ja_doe
相关产品推荐
相关产品推荐

