我有一些数字表示自纪元以来的毫秒数,00:00:00协调世界时(UTC),1970年1月1日,星期四
1365368400000,
1365973200000,
1366578000000
我正在将它们转换为日期格式:
as.Date(as.POSIXct(my_dates/1000, origin="1970-01-01", tz="GMT"))
答案:
[1] "2013-04-07" "2013-04-14" "2013-04-21"
如何从epoch开始将这些字符串转换回毫秒?
答案 0 :(得分:5)
以下是您的javascript日期
x <- c(1365368400000, 1365973200000, 1366578000000)
您可以通过除以一天内的毫秒数来更轻松地将它们转换为R日期。
y <- as.Date(x / 86400000, origin = "1970-01-01")
要转换回来,只需转换为数字并乘以此数字。
z <- as.numeric(y) * 86400000
最后,检查答案是否是您的开始。
stopifnot(identical(x, z))
根据评论,您有时会得到导致x
和z
不相同的数字舍入错误。对于像这样的数值比较,请使用:
library(testthat)
expect_equal(x, z)
答案 1 :(得分:0)
我将提供一个简单的框架来处理各种日期编码以及如何返回。使用R包'lubridate',使用句点和间隔类非常容易。
在处理日期时,可以很容易,因为可以使用as.numeric(Date)来获取自纪元以来的日期数。要获得任何小于一天的单位时间,可以使用各种因素进行转换(24小时,24 * 60分钟等)但是,数月可能会变得更加棘手,因此我更喜欢实例使用此方法。
library(lubridate)
as.period(interval(start = epoch, end = Date), unit = 'month')@month
这可以通过应用因子用于年,月,日,小时,分钟和更小的单位。
走另一条道路,比如自纪元以来被给予数月:
library(lubridate)
epoch %m+% as.period(Date, unit = 'months')
我用几个月来介绍这种方法,因为它可能更复杂。使用周期和间隔的一个优点是它可以很容易地调整到任何纪元和单位。