R使用ISOdate转换日期出现1970年前返回NA、月份偏移问题求解
问题根因
1. 月份偏移1个月
POSIXlt类型的mon字段是0基准计数,取值范围011分别对应112月;但ISOdate函数的月份入参要求是1基准计数,取值范围1~12,直接传入POSIXlt$mon就会出现少1个月的偏移。
2. 1970年前日期返回NA
macOS系统原生POSIX时间处理对1970年之前的日期兼容度低,ISOdate未显式指定时区时,和系统时区冲突会导致早于1970年的日期转换结果为NA。
修复方案
调整后代码
firstDate <- as.Date("1910-01-01", "%Y-%m-%d") todayDate <- as.Date("2021-09-04") # 按假设值固定 firstDatePOSIX <- as.POSIXlt(firstDate) todayDatePOSIX <- as.POSIXlt(todayDate) # 调整点:月份+1转为1基准,显式指定时区为GMT firstDateISO <- ISOdate(firstDatePOSIX$year + 1900, firstDatePOSIX$mon + 1, firstDatePOSIX$mday, tz = "GMT") todayDateISO <- ISOdate(todayDatePOSIX$year + 1900, todayDatePOSIX$mon + 1, todayDatePOSIX$mday, tz = "GMT")
运行结果
firstDateISO返回:1910-01-01 12:00:00 GMTtodayDateISO返回:2021-09-04 12:00:00 GMT
更简便的替代写法
不需要手动拆解POSIXlt字段,避免计数基准搞错:
firstDateISO <- as.POSIXct(paste(firstDate, "12:00:00"), tz = "GMT") todayDateISO <- as.POSIXct(paste(todayDate, "12:00:00"), tz = "GMT")
内容的提问来源于stack exchange,提问作者pdeli
相关产品推荐
相关产品推荐

