如何将字符串"2019-10-09T06:07:05.888Z"转为日历日期时间?R语言转换报错求助
解决R语言中ISO8601时间字符串转日历日期时间的问题
我来帮你搞定这个时间转换的问题,先分析下你现有方法的问题,再给你可行的解决方案:
你的方法出错的原因
- 第一个方法:你用
as.POSIXlt解析时没有指定时区,而字符串末尾的Z代表UTC时区。如果R默认用本地时区解析,再加上旧版本R对ISO8601格式的兼容性问题,就可能导致时间部分解析异常,出现00:00:00.000的错误结果。 - 第二个方法:你的
format参数和输入字符串的结构不匹配——输入里用T分隔日期和时间,末尾还有Z,但你写的"%Y-%m-%d %H:%M:%OS"是用空格分隔,也没包含Z,R无法匹配解析规则,所以返回NA。
可行的转换方案
下面两种方法都能正确解析并格式化你要的时间:
方法1:利用R对ISO8601的自动解析(推荐)
R支持直接解析标准ISO8601格式的字符串,只要指定正确的时区即可:
# 解析为UTC时区的POSIXct对象 dt_obj <- as.POSIXct("2019-10-09T06:07:05.888Z", tz = "UTC") # 格式化为带三位毫秒的日历时间字符串 format(dt_obj, "%Y-%m-%d %H:%M:%OS3")
执行后会得到预期结果:
[1] "2019-10-09 06:07:05.888"
方法2:手动指定匹配的格式字符串
如果你想明确指定解析格式,需要把输入里的T和Z都包含到格式规则中:
# 用精确匹配的格式解析 dt_obj <- as.POSIXct("2019-10-09T06:07:05.888Z", format = "%Y-%m-%dT%H:%M:%OS3Z", tz = "UTC") # 格式化输出 format(dt_obj, "%Y-%m-%d %H:%M:%OS3")
同样能得到正确的结果。
额外提示
如果需要将时间转换为你的本地时区,只需要把tz参数改成对应的时区代码即可,比如国内可以用tz="Asia/Shanghai",转换后时间会自动调整为当地时区的时间。
内容的提问来源于stack exchange,提问作者Jibin
相关产品推荐
相关产品推荐

