ruby on rails - timezones - Cómo convertir el identificador TZInfo al nombre/clave de Rails TimeZone
time rails (1)
Temporal incluye la lógica necesaria, pero para responder a su pregunta:
Time.zone = ActiveSupport::TimeZone.new("America/New_York")
Editar, supongo que mi respuesta es incompleta. ¿Quiere obtenerlo de "America / New_York" a "Eastern Time (EE. UU. Y Canadá)", correcto? Si ese es el caso, esta es la mejor solución que tengo, aunque alguien puede proporcionar una mejor.
ActiveSupport::TimeZone::MAPPING.select {|k, v| v == "America/New_York" }.keys.first
¿Cómo convertir los valores js recibidos como identificadores TZInfo a la clave / nombre de Rails TimeZone?
FROM: "America/New_York"
regresó de la detección TZinfo de JavaScript
PARA: La convención "Eastern Time (US & Canada)"
utilizada en Rails TimeZone
u otro ejemplo:
"Pacific/Honolulu"
=> convertido a => "Hawaii"
Ambos están disponibles en ActiveSupport::TimeZone < Object
Mapeo de ActiveSupport::TimeZone < Object
pero los rieles usan la clave [ig "Eastern Time (US & Canada)"
en los Time.use_zone()
desplegables, la validación y el almacenamiento en Time.use_zone()
.
Según lo que entiendo de ActiveSupport::TimeZone.us_zones
esto parece ser importante, especialmente en los casos en que el horario de ahorro de DayLights (que los rieles suena para manejar bien) y la compensación solo no se lograría. Si no se almacena en la base de datos con el nombre de TimeZone de los rieles, la validación falla y no coincide correctamente en la página de configuración del perfil del usuario con la lista desplegable de ActiveSupport::TimeZone.zones_map
El objetivo de esto es que el usuario no tiene que seleccionar su zona horaria en el momento del registro o debe cambiarla en su configuración después del registro. El navegador lo detecta y lo pasa a hidden_field al registrarse. En la rara ocasión en que se inscriben en un lugar diferente a su hogar / trabajo. pueden anular manualmente la configuración de su cuenta más adelante.
Parece ser una brecha común cuando se trata de ingerir la detección de zona horaria js. ¿Esto incluso podría convertirse en una cuestión secundaria de cómo pasar la información devuelta de js a los rieles para la conversión y luego volver a js para almacenar nuevamente en el campo oculto del formulario? Ojalá haya enmarcado la pregunta correctamente y, ciertamente, un poco verde con rieles para que haya una solución simple para esto ...
¡Muchas gracias por toda la ayuda!
-MI
Documentación de ActiveSupport Time.zone
http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html#method-i-parse
MAPPING = {"Eastern Time (US & Canada)" => "America/New_York"
Usando js empaquetado gema ''temporal-rails'' para detectar la zona horaria de los usuarios:
https://github.com/jejacks0n/temporal
Usuario Time_Zone implementa como se ve:
http://railscasts.com/episodes/106-time-zones-revised
* Usando Devise & Devise-Inevitable
Script de vista de registro
<script>
$(function() {
var detected_zone = Temporal.detect();
console.log(detected_zone); // returns object
detected_zone = detected_zone.timezone.name;
console.log(detected_zone); // returns "America/New_York"
$(''#user_time_zone'').val(detected_zone); // ! need to convert this to rails TimeZone name !
});
</script>
Modelo de usuario
validates_inclusion_of :time_zone, in: ActiveSupport::TimeZone.zones_map(&:name)
Formulario de configuración de cuenta de usuario
<%= f.label :time_zone, label: "Time Zone" %><br />
<%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones %>