You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:15:04