Time zone problem

Mmmm, sarà che sono un po’ esaurito… ma non mi spiego questa cosa:

In Ruby:
Time.now.getlocal.zone

=> “CEST”

In Rails, grazie a ActiveSupport::TimeZone, se impongo

Time.zone = “CEST”

Mi dà errore: ArgumentError: Invalid Timezone: CEST
Mentre non ho problemi con “CET”…

Grazie per l’aiuto,

iwan

Ciao,

guardando l’implementazione di ActiveSupport qua:

Rails usa ActiveSupport::TimeZone o TZInfo::Timezone per settare la
timezone quando gli passi una stringa. I possibili valori che accetta
sono:

“Hanoi”, “Harare”, “Hawaii”, “Helsinki”, “Hobart”, “Hong Kong”, "Indiana
“Sapporo”, “Sarajevo”, “Saskatchewan”, “Seoul”, “Singapore”, “Skopje”,
“Sofia”, “Solomon Is.”, “Sri Jayawardenepura”, “St. Petersburg”,
“Stockholm”, “Sydney”, “Taipei”, “Tallinn”, “Tashkent”, “Tbilisi”,
“Tehran”, “Tijuana”, “Tokelau Is.”, “Tokyo”, “UTC”, “Ulaan Bataar”,
“Urumqi”, “Vienna”, “Vilnius”, “Vladivostok”, “Volgograd”, “Warsaw”,
“Wellington”, “West Central Africa”, “Yakutsk”, “Yerevan”, “Zagreb”]

e

“Africa/Lome”, “Africa/Luanda”, “Africa/Lubumbashi”, “Africa/Lusaka”,
“America/Argentina/Rio_Gallegos”, “America/Argentina/Salta”,
“America/Creston”, “America/Cuiaba”, “America/Curacao”,
“America/Indiana/Tell_City”, “America/Indiana/Vevay”,
“America/Moncton”, “America/Monterrey”, “America/Montevideo”,
“America/Santo_Domingo”, “America/Sao_Paulo”, “America/Scoresbysund”,
“Antarctica/Syowa”, “Antarctica/Vostok”, “Arctic/Longyearbyen”,
“Asia/Khandyga”, “Asia/Kolkata”, “Asia/Krasnoyarsk”, “Asia/Kuala_Lumpur”,
“Asia/Ust-Nera”, “Asia/Vientiane”, “Asia/Vladivostok”, “Asia/Yakutsk”,
“Australia/Queensland”, “Australia/South”, “Australia/Sydney”,
“Etc/GMT-12”, “Etc/GMT-13”, “Etc/GMT-14”, “Etc/GMT-2”, “Etc/GMT-3”,
“Europe/Madrid”, “Europe/Malta”, “Europe/Mariehamn”, “Europe/Minsk”,
“Indian/Kerguelen”, “Indian/Mahe”, “Indian/Maldives”, “Indian/Mauritius”,
“Pacific/Midway”, “Pacific/Nauru”, “Pacific/Niue”, “Pacific/Norfolk”,
“Pacific/Noumea”, “Pacific/Pago_Pago”, “Pacific/Palau”, “Pacific/Pitcairn”,
“Pacific/Pohnpei”, “Pacific/Ponape”, “Pacific/Port_Moresby”,
“Pacific/Rarotonga”, “Pacific/Saipan”, “Pacific/Samoa”, “Pacific/Tahiti”,
“Pacific/Tarawa”, “Pacific/Tongatapu”, “Pacific/Truk”, “Pacific/Wake”,
“Pacific/Wallis”, “Pacific/Yap”, “Poland”, “Portugal”, “ROC”, “ROK”,
“Singapore”, “Turkey”, “UCT”, “US/Alaska”, “US/Aleutian”, “US/Arizona”,
“US/Central”, “US/East-Indiana”, “US/Eastern”, “US/Hawaii”,
“US/Indiana-Starke”, “US/Michigan”, “US/Mountain”, “US/Pacific”,
“US/Pacific-New”, “US/Samoa”, “UTC”, “Universal”, “W-SU”, “WET”, “Zulu”]

Nell’elenco vedo “CET” ma non “CEST”.

La differenza dovuta al fatto che il metodo di istanza “#zone
definito
dall standard library Ruby, e restituisce una stringa:

Time.now.zone
=> “BST”

Time.now.zone.class
=> String

Mentre Rails abitutato a usare oggetti di tipo TimeZone, e aggiunge un
metodo di class “::zone” che restituisce proprio una timezone:

Time.zone
=> #<ActiveSupport::TimeZone:0x007f7fae625018 @name=“Rome”,
@utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: Europe/Rome>,
@current_period=nil>

Time.zone.class
=> ActiveSupport::TimeZone

E quindi le due cose non comunicano proprio bene tra di loro.

Saluti,

Ju


M.Sc. Ju Liu
Twitter: @arkh4m http://twitter.com/arkh4m
Skype: johnny_arkham
Card: http://zerp.ly/ju-liu

Societ Cooperativa weLaika
Corso Vigevano 14/B, 10154 Torino (TO), Italy
http://welaika.com - [email protected]

2014-03-31 22:29 GMT+01:00 Iwan B. [email protected]:

CEST è il Central European Summer Time, ossia la nostra ora legale
(Central inteso in verticale, dalla Svezia all’Italia). Vale da marzo a
ottobre, poi si passa a CET.

In Rails

2.1.0 :003 > User.find(12666).created_at
User Load (18.5ms) SELECT “users”.* FROM “users” ORDER BY
“users”.“id” ASC LIMIT 1
=> Fri, 28 Mar 2014 15:06:46 CET +01:00

che è un giorno in cui non c’era ancora l’ora legale.

2.1.0 :006 > User.find(12266).update_attribute(:name, “Paolo”)
User Load (0.5ms) SELECT “users”.* FROM “users” WHERE “users”.“id” =
$1 LIMIT 1 [[“id”, 12266]]
(0.2ms) BEGIN
SQL (0.7ms) UPDATE “users” SET “name” = $1, “updated_at” = $2 WHERE
“users”.“id” = 12266 [[“name”, “Paolo”], [“updated_at”, Tue, 01 Apr
2014 09:08:14 CEST +02:00]]

E come vedi gestisce lui il cambio da CET a CEST.
Internamente (nel db) le date sono in UTC e poi è lo strato di
conversione in stringa di Rails a presentarle con la time zone giusta.

$ psql db
db=> select created_at,updated_at from users where id = 12266;
created_at | updated_at
----------------------------±---------------------------
2014-03-28 14:06:46.532646 | 2014-04-01 07:08:14.907614
(1 row)

Rails ha aggiunto a 07:08 le due ore necessarie a mostrare 09:08:14 CEST
+02:00
Quindi con Rails non mi preoccupo. Uso sempre UTC e converte lui le
date.

Tuttavia le time zone sono una fonte costante di grattacapi per noi
informatici. Credo che siano la cosa peggiore che ci possa capitare dopo
le stampe su carta. Per fortuna come avrete letto e sentito nei giorni
scorsi nelle news, i fusi orari saranno aboliti dal 2020 per iniziativa
ONU e si userà UTC in tutto il mondo. Hanno stimato un risparmio di 100
miliardi di dollari annuali su scala mondiale per i primi dieci anni, e
soprattutto ricordate che giorno è oggi :wink:

Paolo