【问题标题】:Convert a date string "yyyy-mm-dd" to milliseconds since epoch将日期字符串“yyyy-mm-dd”转换为自纪元以来的毫秒数
【发布时间】:2014-04-05 18:40:48
【问题描述】:

我有一些数字表示自 1970 年 1 月 1 日星期四 00:00:00 协调世界时 (UTC) 以来以毫秒为单位的日期

    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"

如何将这些字符串转换回自纪元以来的毫秒数?

【问题讨论】:

  • split-处的日期字符串,从月份部分减去1(javascript月份从零开始),调用Date构造函数与部分(可能使用Date.UTC) ,然后调用这个新的Date 对象的getTime 以获取自纪元以来的毫秒数。 SO上有很多例子。
  • 所以这不是 Javascript 问题吗?纪元的毫秒数不是纯粹的 Javascript 概念。最好从问题中删除 Javascript 标记并从标题中删除 R,因为它已经是一个标记。

标签: r date format


【解决方案1】:

这是您的 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))

根据评论,您有时可能会遇到数字舍入错误,导致 xz 不相同。对于这样的数值比较,请使用:

library(testthat)
expect_equal(x, z)

【讨论】:

  • Richie Cotton,当我尝试从控制台复制函数 as.Date(x / 86400000, origin = "1970-01-01") 日期并将它们手动添加到向量然后应用函数时: as.numeric(y) * 86400000,我得到的结果不一样。也许你知道为什么?这是我的代码:gyazo.com/b97add60821fdb801be112addc5db6f5
【解决方案2】:

我将提供一个简单的框架来处理各种日期编码以及如何回退。使用 R 包“lubridate”,使用 period 和 interval 类非常容易。

在处理天数时,可以很容易地使用 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')

我用几个月的时间介绍了这种方法,因为它可能更复杂。使用周期和间隔的一个优点是它可以很容易地调整到任何时期和单位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    相关资源
    最近更新 更多