此前也有人对此有过疑问 here,here,here,here
使用所有这些信息,下面应该有效,但似乎有一些翻译损失。
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"
答案 0 :(得分:2)
我无法完全按照&#39; IST&#39;是我机器上的未知时区。 (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。
这就是为什么会有损失,你剥夺了时间信息,所以你得到了起始和终止对象之间的差异。
根据亚洲/加尔各答&#39;的具体情况进行更新问题:
> 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
或其他......