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

R中as.POSIXlt与strptime格式一致为何处理12小时制时间有差异?

问题分析与解决

先看你提供的R控制台输出:

> Sys.getlocale()
[1] "LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=en_US.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C"
> dh <- '2018-05-08 07:42:34 PM'
> as.POSIXlt(dh,'%Y-%m-%d %I:%M:%S %p')
[1] "2018-05-08 07:42:34"
> strptime(dh,'%Y-%m-%d %I:%M:%S %p')
[1] "2018-05-08 19:42:34 -03"

你疑惑的点完全合理——明明格式字符串一样,为什么as.POSIXlt没识别出PM,把晚上7点解析成了上午7点?

核心原因:函数参数顺序不同

这是因为as.POSIXlt和strptime的参数定义不一样:

  • strptime的第二个参数就是format,所以你直接传格式字符串是对的,它能正确识别%p(12小时制的AM/PM标记)。
  • 而as.POSIXlt的第二个参数是tz(时区),format是一个可选的命名参数,需要显式指定名称才能生效!

你之前调用as.POSIXlt(dh,'%Y-%m-%d %I:%M:%S %p')的时候,第二个参数被当成了时区参数,而format根本没被传入——这就导致R用默认的方式解析字符串,忽略了PM标记,所以得到了上午7点的结果。

解决方案:显式指定format参数

只要在调用as.POSIXlt(包括as.POSIXct)时,明确写出format=,就能正确解析12小时制时间了:

as.POSIXlt(dh, format = '%Y-%m-%d %I:%M:%S %p')
# 输出应该是 "2018-05-08 19:42:34"(具体时区显示可能和你的环境一致)

同样,as.POSIXct也需要用同样的方式:

as.POSIXct(dh, format = '%Y-%m-%d %I:%M:%S %p')

这样就能和strptime得到一致的正确结果啦。

内容的提问来源于stack exchange,提问作者Rodrigo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:06:29