【问题标题】:Setting Datetime timezone in Rcpp在 Rcpp 中设置日期时间时区
【发布时间】:2017-08-12 16:11:47
【问题描述】:

我想从输入 R POSIXct 对象加上 UTC 时区 30 秒,并在 Rcpp 函数中输出具有相同时区的 POISXct 对象,但输出时区是我的系统时区(CST)。

我不想更改 R 环境中的语言环境设置,但是我在 Rcpp::timezone 中没有找到关于时区的设置。

这是我的 Rcpp 代码:

sourceCpp(code = "
#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
Datetime TimeExample(Datetime x) {

     return( x + 30 );

}")

NowTime = as.POSIXct("2017-03-21 13:35:23","%Y-%m-%d %H:%M:%S",tz="UTC")
TimeExample(NowTime)
## > "2017-03-21 21:35:53 CST"

谢谢!

【问题讨论】:

    标签: r datetime timezone rcpp


    【解决方案1】:

    您确实不需要 Rcpp,但您当然可以为此使用 Rcpp(也许作为更大问题的一部分)。

    你通常想要*Vector 类型,这里是DatetimeVector,我推荐你现在可以选择加入的重写的类型,它将在今年晚些时候成为默认值:

    // use new Datetime vector API
    #define RCPP_NEW_DATE_DATETIME_VECTORS 1
    
    #include <Rcpp.h>
    
    using namespace Rcpp;
    
    // [[Rcpp::export]]
    DatetimeVector TimeExample(DatetimeVector x, std::string tz) {
      DatetimeVector y(x);
      y = y + 30;
      y.attr("tzone") = tz;
      return(y);
    }
    
    /*** R
    NowTime <- as.POSIXct("2017-03-21 13:35:23","%Y-%m-%d %H:%M:%S",tz="UTC")
    TimeExample(NowTime, "America/New_York")
    */
    

    您会看到我们通过attr 设置 tzone,就像在 R 中一样。

    当我获取这个时,我得到:

    R> Rcpp::sourceCpp("/tmp/robinchen.cpp")
    
    R> NowTime <- as.POSIXct("2017-03-21 13:35:23","%Y-%m-%d %H:%M:%S",tz="UTC")
    
    R> ShiftedTime <- TimeExample(NowTime, "America/New_York")
    
    R> ShiftedTime
    [1] "2017-03-21 09:35:53 EDT"
    R> 
    

    您会看到它按照需要以东部时间出现(即使我在中部时间)。

    您可以以基本相同的速度和相同数量的操作完成所有 R 级别。

    【讨论】:

    • 还有新的Datetime 类吗?我遇到了问题,因为Datetime 失去了“tzone”属性,而纪元的秒数​​在我的本地时区。例如,Datetime a = y[0]; a.getHours(); 给出了我当地时区的小时数,而不考虑 y 的时区。
    • 请在 GitHub 存储库中提供一个最低限度完整且可重现的示例作为问题单。
    • 跟我想的不太一样。纪元的秒数​​是根据 UTC 的,因为它应该是。但是getHours()也是按照UTC,我觉得不太对,所以还是开票吧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 2021-09-12
    • 2012-06-22
    • 2021-09-06
    相关资源
    最近更新 更多