我有几个以下列格式存在的变量:
/Date(1353020400000+0100)/
我想将此格式转换为ddmmyyyy。我找到了this solution for the same problem using php,但我对PHP一无所知,所以我无法将该解决方案转换为我需要的解决方案,这是我可以在R中使用的解决方案。
有什么建议吗?
感谢。
答案 0 :(得分:3)
如果格式是自纪元以来的毫秒,则anytime()
或as.POSIXct()
可以为您提供帮助:
R> anytime(1353020400000/1000)
[1] "2012-11-15 17:00:00 CST"
R> anytime(1353020400.000)
[1] "2012-11-15 17:00:00 CST"
R>
anytime()
转换为当地时间,这对我来说是芝加哥。您必须单独处理UTC偏移。
基地R也可以做到,但你需要可怕的起源:
R> as.POSIXct(1353020400.000, origin="1970-01-01")
[1] "2012-11-15 17:00:00 CST"
R>
答案 1 :(得分:3)
据我所知,从链接的问题来看,这是自纪元以来的毫秒:
x <- "/Date(1353020400000+0100)/"
spl <- strsplit(x, "[()+]")
as.POSIXct(as.numeric(sapply(spl,`[[`,2)) / 1000, origin="1970-01-01", tz="UTC")
#[1] "2012-11-15 23:00:00 UTC"
如果你想获得时区差异,这是一次尝试:
x <- "/Date(1353020400000+0100)/"
spl <- strsplit(x, "(?=[+-])|[()]", perl=TRUE)
tzo <- sapply(spl, function(x) paste(x[3:4],collapse="") )
dt <- as.POSIXct(as.numeric(sapply(spl,`[[`,2)) / 1000, origin="1970-01-01", tz="UTC")
as.POSIXct(paste(format(dt), tzo), tz="UTC", format = '%F %T %z')
#[1] "2012-11-15 22:00:00 UTC"
答案 2 :(得分:2)
包裹lubridate
可以按照以下方式拯救:
as.Date("1970-01-01") + lubridate::milliseconds(1353020400000)
读取:自纪元以来的毫秒数(= 1970年1月1日,UTC + 0)
现在可以使用正则表达式进行解析功能:
parse.myDate <- function(text) {
num <- as.numeric(stringr::str_extract(text, "(?<=/Date\\()\\d+"))
as.Date("1970-01-01") + lubridate::milliseconds(num)
}
最后,格式化日期
format(theDate, "%d/%m/%Y %H:%M")
如果您还需要时区信息,可以改用:
parse.myDate <- function(text) {
parts <- stringr::str_match(text, "^/Date\\((\\d+)([+-])(\\d{4})\\)/$")
as.POSIXct(as.numeric(parts[,2])/1000, origin = "1970-01-01", tz = paste0("Etc/GMT", parts[,3], as.integer(parts[,4])/100))
}