[Rcpp-devel] Fwd: Setting time zone on Rcpp::Datetime
Dirk Eddelbuettel
edd at debian.org
Mon Jan 19 14:52:30 CET 2015
On 19 January 2015 at 09:02, janus Larsen wrote:
| Thx - that did the trick. But why the 'Oh dear'?
Your initial code is a pretty clear exhibit of why the C API is more painful.
Compare your current example with the one you posted first below. "Oh dear."
Dirk
| // [[Rcpp::export]]
| Rcpp::NumericVector getDT(int dt) {
| Rcpp::NumericVector res(1);
| res[0] = dt;
| res.attr("tzone") = "GMT";
| res.attr("class") = CharacterVector::create("POSIXct", "POSIXt");;
| return res;
| }
|
| On Mon, Jan 12, 2015 at 1:34 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
|
|
| On 12 January 2015 at 13:10, janus Larsen wrote:
| | Hi again,
| |
| | Thanks Dirk for your reply. So there is no way of doing this on the C
| side?
| |
| | The thing is that I'm returning a large object that contains a lot of
| | information (about an unstructured 3D model) and some of the fields are
| | DateTimes. I could of cource wrap the call to the C function in an R
| function
| | that then corrects the dates to GMT (or sets the timezone before calling
| the C
| | function), but it just not that nice... Previously I had this code
| written
| | using <RDefines.h> where I could set the timezone on the returned posIXct
| | object:
| |
| | SEXP long2DateTime(long dt) {
| | SEXP result;
| | result = PROTECT(allocVector(REALSXP, 1));
| | REAL(result)[0] = dt;
| | SEXP gmt = PROTECT(allocVector(STRSXP,1));
| | SET_STRING_ELT(gmt, 0, mkChar("GMT"));
| | SEXP tzone = PROTECT(allocVector(STRSXP,1));
| | SET_STRING_ELT(tzone, 0, mkChar("tzone"));
| | setAttrib(result, tzone, gmt);
| | SEXP datetimeclass = PROTECT(allocVector(STRSXP,2));
| | SET_STRING_ELT(datetimeclass, 0, mkChar("POSIXt"));
| | SET_STRING_ELT(datetimeclass, 1, mkChar("POSIXct"));
| | setAttrib(result, R_ClassSymbol, datetimeclass);
| | UNPROTECT(4);
| | return result;
| | }
|
| Oh dear. See eg http://gallery.rcpp.org/articles/creating-xts-from-c++/ or
| the other few xts related answers on the Rcpp Gallery.
|
| Dirk
|
| | Janus
| |
| | On Fri, Jan 9, 2015 at 1:22 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
| |
| |
| | On 9 January 2015 at 11:50, janus Larsen wrote:
| | | Hi,
| | | How do I set the timezone on an Rcpp::Datetime?
| | | Thanks in advance,
| | | Sunaj
| | |
| | | This returns "1970-01-01 01:00:00 CET" (computer setting), but I
| want
| | GMT...
| |
| | R does the formatting in its session based on your locale.
| |
| | That is generally the right thing:
| |
| | | // [[Rcpp::export]]
| | | Rcpp::Datetime test() {
| | | double d=0;
| | | return(d);
| | | }
| |
| | Small corrections to your code to actually export the function (under
| a
| | safer
| | name):
| |
| | #include <Rcpp.h>
| |
| | // [[Rcpp::export]]
| | Rcpp::Datetime timetest(double d=0) {
| | return(d);
| | }
| |
| | Then:
| |
| | R> sourceCpp("/tmp/timeQ.cpp")
| | R> timetest() # my default is Chicago, or -5
| | [1] "1969-12-31 18:00:00 CST"
| | R> as.numeric(timetest())
| | [1] 0
| | R> Sys.setenv("TZ"="Europe/London")
| | R> timetest() # I can select another one
| | [1] "1970-01-01 01:00:00 BST"
| | R> Sys.setenv("TZ"="UTC")
| | R> timetest() # incl UTC
| | [1] "1970-01-01 UTC"
| | R>
| | R> format(timetest(), tz="America/Chicago")
| | [1] "1969-12-31 18:00:00"
| | R>
| |
| | So you need to change the timezone _at the level of your app_ which
| can be
| | as
| | simple as writing a new Date formatter in R as per my last line.
| |
| | Dirk
| |
| | --
| | http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
| |
| |
|
| --
| http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
|
|
|
--
http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
More information about the Rcpp-devel
mailing list