使用 gsub() 意外丢弃字符串结尾

Unexpected dropping of end of string with gsub()

我对以下行为感到困惑。

> tmpString <- Sys.time()
> tmpString
[1] "2021-06-17 11:50:52 EDT"
> gsub(" ",  "_", tmpString)
[1] "2021-06-17_11:50:52"
> gsub(" ",  "_", tmpString, fixed=TRUE)
[1] "2021-06-17_11:50:52"

为什么tmpString末尾的“EDT”丢失了?

为了完整性,

> R.version
               _                           
platform       x86_64-pc-linux-gnu         
arch           x86_64                      
os             linux-gnu                   
system         x86_64, linux-gnu           
status                                     
major          3                           
minor          6.3                         
year           2020                        
month          02                          
day            29                          
svn rev        77875                       
language       R                           
version.string R version 3.6.3 (2020-02-29)
nickname       Holding the Windsock        
> 

tmpString 不是字符串。正如评论中提到的,它是一个 POSIXct 对象,它在内部是自 UNIX 纪元以来的秒数,它是 print 函数,用时区显示它。最好将其称为 tmp 而不是 tmpString,然后显式使用 format 将其转换为字符串。 (下面我们使用 sub 来替换第一个 space,但是如果你想替换两个 space,则使用 gsub 作为问题。)

tmp <- Sys.time()
sub(" ", "_", format(tmp, usetz = TRUE))
## [1] "2021-06-17_12:39:51 EDT"

另请注意 format_ISO8601 的存在,您可能更喜欢它:

format_ISO8601(tmp, usetz = TRUE)
## [1] "2021-06-17T12:39:51-0400"