¿Cómo convierto correctamente las zonas horarias?

Estoy usando eltiempo rápido paquete para sufastPOSIXct Función que puede leer tiempos de datos de caracteres de manera muy eficiente. Mi problema es que solo puede leer los tiempos de los caracteres QUE SE EXPRESAN EN 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"

Ahora, digamos que tengo un archivo con tiempos de datos expresados ​​en la zona horaria "América / Montral", el plan es cargarlos (fingiendo implícitamente que están en GMT) y modificar posteriormente el atributo de zona horaria sin cambiar el valor subyacente.

Si utilizo esta función, referido en otro post:

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

Estoy viendo un error ...

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 me gustaría que fuera

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"

¿Hay una solución?

EDITAR: lo sélubridate::force_tz pero es demasiado lento (no usar puntosfasttime::fastPOSIXct nunca más )