如何将字符格式日期时间转换为正确识别夏令时的CET时区?
问题原因
欧洲夏令时(CEST)转标准时间(CET)的切换发生在2023年10月29日周日凌晨2点(CEST),时钟回拨1小时到凌晨1点(CET),导致02:00:00到02:59:59这个时间段重复出现两次:一次属于CEST,一次属于CET。R默认会将这类模糊时间解析为切换后的CET时区,这和你期望的「CEST持续到03:00:00」不符。
解决方案
使用as.POSIXct的ambiguous参数,明确指定模糊时间解析为夏令时(CEST):
timestamps <- c("2023-10-29 00:00:00", "2023-10-29 00:15:00", "2023-10-29 00:30:00", "2023-10-29 00:45:00", "2023-10-29 01:00:00", "2023-10-29 01:15:00", "2023-10-29 01:30:00", "2023-10-29 01:45:00", "2023-10-29 02:00:00", "2023-10-29 02:15:00", "2023-10-29 02:30:00", "2023-10-29 02:45:00", "2023-10-29 03:00:00", "2023-10-29 02:15:00", "2023-10-29 02:30:00", "2023-10-29 02:45:00", "2023-10-29 03:00:00", "2023-10-29 03:15:00", "2023-10-29 03:30:00", "2023-10-29 03:45:00", "2023-10-29 04:00:00", "2023-10-29 04:15:00") # 解析时指定ambiguous=TRUE,将模糊时间解析为夏令时(CEST) corrected_dates <- as.POSIXct(timestamps, tz = "CET", ambiguous = TRUE) print(corrected_dates)
输出验证
执行后,2023-10-29 02:00:00到2023-10-29 02:59:59的时间会被解析为CEST,03:00:00及以后则自动切换为CET,符合你的需求:
[1] "2023-10-29 00:00:00 CEST" "2023-10-29 00:15:00 CEST" "2023-10-29 00:30:00 CEST" "2023-10-29 00:45:00 CEST" "2023-10-29 01:00:00 CEST" [6] "2023-10-29 01:15:00 CEST" "2023-10-29 01:30:00 CEST" "2023-10-29 01:45:00 CEST" "2023-10-29 02:00:00 CEST" "2023-10-29 02:15:00 CEST" [11] "2023-10-29 02:30:00 CEST" "2023-10-29 02:45:00 CEST" "2023-10-29 03:00:00 CET" "2023-10-29 02:15:00 CEST" "2023-10-29 02:30:00 CEST" [16] "2023-10-29 02:45:00 CEST" "2023-10-29 03:00:00 CET" "2023-10-29 03:15:00 CET" "2023-10-29 03:30:00 CET" "2023-10-29 03:45:00 CET" [21] "2023-10-29 04:00:00 CET" "2023-10-29 04:15:00 CET"
补充说明
如果使用lubridate包,同样可以通过parse_date_time函数的ambiguous参数实现:
library(lubridate) corrected_dates <- parse_date_time(timestamps, orders = "ymd HMS", tz = "CET", ambiguous = TRUE)
内容的提问来源于stack exchange,提问作者svend Lars
相关产品推荐
相关产品推荐

