Como faço para converter corretamente fusos horários

Estou usando oTempo rápido pacote para o seufastPOSIXct função que pode ler os dados dos caracteres com muita eficiência. Meu problema é que ele só pode ler dados de caracteres que são expressos em GMT.

R) fastPOSIXct("2010-03-15 12:37:17.223",tz="GMT") #very fast
[1] "2010-03-15 12:31:16.223 GMT"
R) as.POSIXct("2010-03-15 12:37:17.223",tz="GMT") #very slow
[1] "2010-03-15 12:31:16.223 GMT"

Agora, digamos que eu tenha um arquivo com tempos de dados expressos no fuso horário "America / Montral", o plano é carregá-los (implicitamente fingindo que estão em GMT) e modificando subseqüentemente o atributo timezone sem alterar o valor subjacente.

Se eu usar essa função, referenciada em outro post:

forceTZ = function(x,tz){   
    return(as.POSIXct(as.numeric(x), origin=as.POSIXct("1970-01-01",tz=tz), tz=tz))
}

Eu estou vendo um bug ...

R) forceTZ(as.POSIXct("2010-03-15 12:37:17.223",tz="GMT"),"America/Montreal")
    [1] "2010-03-15 13:37:17.223 EDT"

... porque eu gostaria que fosse

R) as.POSIXct("2010-03-15 12:37:17.223",format="%Y-%m-%d %H:%M:%OS",tz="America/Montreal")
    [1] "2010-03-15 12:37:17.223 EDT"

Existe uma solução alternativa?

EDIT: eu sei sobrelubridate::force_tz mas é muito lento (não aponte usandofasttime::fastPOSIXct não mais )

questionAnswers(3)

yourAnswerToTheQuestion