Forum: Italian Ruby user group Time zone problem

3ca4ad042effe02400fde5524f25edc1?d=identicon&s=25 Iwan B. (1w4n)
on 2014-03-31 23:29
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
1a45b192d0bbaf167afb43a41859e313?d=identicon&s=25 Ju Liu (Guest)
on 2014-03-31 23:50
(Received via mailing list)
Ciao,

guardando l'implementazione di ActiveSupport qua:
https://github.com/rails/rails/blob/ded5f5b261b324...

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 - info@welaika.com


2014-03-31 22:29 GMT+01:00 Iwan B. <iwan.buetti@mac.com>:
7de465f222e6a9c7fe658e370d0bfe05?d=identicon&s=25 Paolo Montrasio (pmontrasio)
on 2014-04-01 09:19
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 ;-)

Paolo
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.