【问题标题】:Converting epoch to date and back to epoch将纪元转换为日期并返回纪元
【发布时间】:2015-09-01 09:18:36
【问题描述】:

之前也有关于这个的问题 herehereherehere

使用所有这些信息,下面应该可以工作,但似乎有些翻译损失。

a <- c(1433097000, 1433183400, 1433269800, 1433356200, 1433442600, 1433529000)
a
# [1] 1433097000 1433183400 1433269800 1433356200 1433442600 1433529000
b <- as.Date(as.POSIXct(a, origin='1970-01-01', tz='Asia/Kolkata'))
b <- as.numeric(as.POSIXct(b, tz='Asia/Kolkata', format="%Y-%m-%d", origin='1970-01-01'))
b
# [1] 1433030400 1433116800 1433203200 1433289600 1433376000 1433462400

==== 编辑:

使用 tz='Asia/Kolkata',a 的时间即将到来,00:00:00

strftime(as.POSIXct(a, origin='1970-01-01', tz='Asia/Kolkata'), format="%Y-%m-%d %H:%M:%S")
[1] "2015-06-01 00:00:00" "2015-06-02 00:00:00" "2015-06-03 00:00:00" "2015-06-04 00:00:00" "2015-06-05 00:00:00"
[6] "2015-06-06 00:00:00"

【问题讨论】:

  • ab 之间的差异是 66600 秒,即 (18*60*60) + (30*60)。这是 00:00(b 中的时间)和 18:30(a 中的时间)之间的差异。
  • 没有得到你@Pascal。对于 tz='IST',a 中的时间也是 00:00 而不是 18:30。
  • 请比较as.POSIXct(a, tz='IST', origin='1970-01-01')as.POSIXct(b, tz='IST', origin='1970-01-01'),转换为数值后。
  • "IST" %in% OlsonNames() return FALSE,是不是 tz 参数有错字? (或者您是否使用特定版本的表格?)
  • 谢谢@Tensibai。问题依然存在。更新了上面的问题。

标签: r datetime


【解决方案1】:

我无法完全重现,因为“IST”是我机器上的未知时区。 (R 3.2.0)

这个答案只是在开发@Pascal 评论,因为您似乎没有得到它。

但是使用您的 a 并使用 GMT 我们会在 18:30 获得日期和时间:

> as.POSIXct(a, tz='GMT', origin='1970-01-01')
[1] "2015-05-31 18:30:00 GMT" "2015-06-01 18:30:00 GMT" "2015-06-02 18:30:00 GMT" "2015-06-03 18:30:00 GMT"
[5] "2015-06-04 18:30:00 GMT" "2015-06-05 18:30:00 GMT"

接下来你只取日期,然后重新转换为日期时间(抱歉没有摆脱我的 timzeone CEST):

> as.POSIXct(b, tz='GMT', format="%Y-%m-%d", origin='1970-01-01')
[1] "2015-05-31 02:00:00 CEST" "2015-06-01 02:00:00 CEST" "2015-06-02 02:00:00 CEST"
[4] "2015-06-03 02:00:00 CEST" "2015-06-04 02:00:00 CEST" "2015-06-05 02:00:00 CEST"

当只给as.POSIXct() 一个日期时,函数假定它是在今天的00:00:00。

这就是为什么会有损失,你剥离了时间信息,所以你得到了你的开始和结束对象之间的差异。


更新问题“亚洲/加尔各答”的具体案例:

> b
[1] "2015-05-31" "2015-06-01" "2015-06-02" "2015-06-03" "2015-06-04" "2015-06-05"

as.POSIXct 在给定 Date 对象时忽略 tz 参数(没有挖掘原因),因此解决方法是调用 as.POSIXlt ,这将在午夜生成一个具有原始时区 UTC 的正确对象:

as.POSIXlt(b)
[1] "2015-05-31 UTC" "2015-06-01 UTC" "2015-06-02 UTC" "2015-06-03 UTC" "2015-06-04 UTC" "2015-06-05 UTC"

用它给出的时区包装在 as.POSIXct 中:

> as.POSIXct(as.POSIXlt(b),tz='Asia/Kolkata')
[1] "2015-05-31 IST" "2015-06-01 IST" "2015-06-02 IST" "2015-06-03 IST" "2015-06-04 IST" "2015-06-05 IST"

但它只是改变了对象的时区,并没有改变小时。

我感觉我们遇到了一个 XY 问题,其中这种转换是其他东西的一部分(在某些时候玩日期),应该使用 POSIXct 函数(如 difftime 或其他...

【讨论】:

  • 您的解释比我尝试的要好。旁注:在我的机器上,“IST”被识别。
  • @Pascal 我确实写了一个答案,因为听起来很难展示 cmets 中的潜在问题:)
  • 我更新了@Tensibai 的问题。使用 tz='Asia/Kolkata',我们确实在 00:00:00 获得了 'a' 时间,并将其转换为 'b'。现在,当 'b' 被转换回时间 00:00:00 被假定..所以我仍然不清楚为什么会有任何损失?
  • @MohitVerma 更新了答案,但我真的觉得是xy问题
  • @MohitVerma 哦,当你试图解决一个问题时,这只是真正问题的一部分XY problem on StackExchange
猜你喜欢
  • 1970-01-01
  • 2014-12-11
  • 2019-02-19
  • 2018-04-24
  • 2011-12-06
  • 2012-07-16
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
相关资源
最近更新 更多