开发者

Converting unix seconds in milliseconds to POSIXct/POSIXlt

开发者 https://www.devze.com 2022-12-22 22:44 出处:网络
Why do I see a difference when I convert a unix timestamp to datetime object in R? > as.POSIXlt(1268736919, origin=\"1970-01-01\", tz=\"America/New_York\")

Why do I see a difference when I convert a unix timestamp to datetime object in R?

> as.POSIXlt(1268736919, origin="1970-01-01", tz="America/New_York")
[1] "2010-03-16 06:开发者_JAVA百科55:19 EDT"

> as.POSIXct(1268736919, origin="1970-01-01", tz="America/New_York")
[1] "2010-03-16 11:55:19 EDT"

The result from POSIXlt is actually correct.

Also, is there a way to do this conversion without specifying the origin?

Thanks


The help page actually hints at a difference:

Value:

     ‘as.POSIXct’ and ‘as.POSIXlt’ return an object of the appropriate
     class.  If ‘tz’ was specified, ‘as.POSIXlt’ will give an
     appropriate ‘"tzone"’ attribute.

This stuff is finicky -- I think there is an implicit TZ conversion happening for as.POSIXct. Consider that

R> print(as.numeric(as.POSIXct(as.POSIXlt(1268736919, 
                               origin="1970-01-01"))), digits=10)
[1] 1268736919
R> print(as.numeric(as.POSIXct(1268736919, origin="1970-01-01")), digits=10)
[1] 1268758519

the second one (using as.POSIXct) does not return the original input. Unfortunately, Brian D. Ripley seems to be the only human having all the details here.

Lastly, you can't do it without the origin. But you could define wrappers that use the epoch as origin (as here) or use 2000-01-01 or ... Just keep it consistent.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号