使用R将特殊格式转换为日期

时间:2016-12-01 22:06:11

标签: r date

我有几个以下列格式存在的变量:

/Date(1353020400000+0100)/

我想将此格式转换为ddmmyyyy。我找到了this solution for the same problem using php,但我对PHP一无所知,所以我无法将该解决方案转换为我需要的解决方案,这是我可以在R中使用的解决方案。

有什么建议吗?

感谢。

3 个答案:

答案 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))
}