Konwersja czasu w aplikacji UTC a Warsaw

Cze mam taki problem,
W aplikacji mam ustawiony
config.time_zone = "Europe/Warsaw"
I teoretycznie jest fajnie czas zapisuje się w UTC aktualnie różnica 2h wyswietla się dobrze jak przekazuje go przez Railsy,
ale jak wyswietlam go poprzez JS ( Vue.js np. w formularzu z edycja modelu lub liscie skladajacej sie ze wszystkich modelow ) lub w szablonach z hbs to dostaję na widokach czas UTC. I tu za bardzo nie wiem jak temu zaradzic. Myslalem nad ustawieniem czasu w bazie na “Warszawski”, ale nie wiem czy to będzie działac. Tak samo dziwne jest dla mnie to że:
W JS-ie mam:

new Date
Tue Oct 02 2018 14:58:12 GMT+0200 (czas środkowoeuropejski letni)

A w konsoli Railsowej:

irb(main):006:0> Time.zone.formatted_offset
=> "+01:00"

I tutaj mam, że offset w Railsach wynosi +1, ale wywietlane s wartoci +2, co w sumie jest poprawne, ale tego nie rozmumiem.

Do końca nie rozumiem problemu, ale może wskazówką do rozwiązania tego jest fakt, że UTC i GMT to nie jest to samo:

Problem mam taki, że jak korzystam z widoków railsowych to wszystko działa tak jak należy. Jak w bazie mam zapisana godzinę 14:00 UTC to na widoku mam 16:00, ale gdy widok obsługuję przez Vue.js, albo mam szablony w hbs to to na widokach mam 14:00 zamiast 16:00 naprzykład gdy mam widok z edycja modelu w Vue.js i nie wiem jak temu zaradzic myslalem nad ustawieniem stefy czasowej w bazie od razu na “Warszawska”

@mbronek7 Nie wiem czy to bug czy feature, ale:

[4] pry(main)> Time.zone.now
=> Wed, 03 Oct 2018 09:14:41 CEST +02:00
[5] pry(main)> Time.zone.now.utc_offset
=> 7200
[6] pry(main)> Time.zone.utc_offset
=> 3600

Czyli operując na obiekcie daty offset jest już poprawnie liczony (pisząc to jest +2 do utc).

Porównywanie tego z datą otrzymaną przez new Date w js przeglądarki jest trochę ryzykowne. Możesz sobie lokalnie przestawić datę w systemie i już Ci się to rozjedzie.
Pytanie: jak w ogóle przekazujesz datę do reactoweg widoku?

@radarek Datę do widoków w Vue.js przekazuję przez API i dostaję datę jako string w JSON-ie.

I co robisz potem z tym stringiem? Parsujesz jako obiekt Date? Jak?

Tworzę później z niego obiekt Js-owy Date i dodawany jest automatycznie do niego offset przegladarki, czyli np zapisuje sobie w bazie dzisiejsza date z godzina 17:00, ale w komponentach Vue dostaję 19:00. Railsy wywietlaja mi normalnie 17:00. Tak działa z config.time_zone = "Europe/Warsaw" jak to usunę z configa to dostaję taki sam rezultat w bazie mam zapisan godzinę 17:00 i jeżeli widok mam obsługiwany przez Railsy to dostaję 17:00, jak przez JS to dodaje mi się offset przegldarki i dostaję 19:00.

A możesz pokazać kod js w którym tworzysz ten obiekt daty? Bo coś takiego daje dobry rezultat u mnie (chrome, mac os):

ruby

[6] pry(main)> date = Time.zone.now
=> Wed, 03 Oct 2018 13:38:25 CEST +02:00
[7] pry(main)> puts({ date: date }.to_json)
{"date":"2018-10-03T13:38:25.317+02:00"}

i potem konwersja do obiektu w js

json = JSON.parse('{"date":"2018-10-03T13:38:25.317+02:00"}')
=> {date: "2018-10-03T13:38:25.317+02:00"}
new Date(json.date)
=> Wed Oct 03 2018 13:38:25 GMT+0200 (Central European Summer Time)

@radarek u mnie jest tak:

irb(main) > Model.last.start_date

=> 2018-10-03 14:00:00 +0000 

Co na froncie daje:

json = JSON.parse('{"date":"2018-10-03 14:00:00 +0000"}')
= > {date: "2018-10-03 14:00:00 +0000"}
new Date(json.date)
=> Wed Oct 03 2018 16:00:00 GMT+0200 (czas środkowoeuropejski letni)

Gdzie w aplikacji mam:

irb(main):016:0> Time.zone.now
=> Wed, 03 Oct 2018 15:37:15 CEST +02:00

Dane do mdelu zapisuje poprzez formularz w simple form godzinę dokładnie tak:

<%= f.input :start_hour, input_html: {class: "form-input"}, label_html: {class: "form-label"} %>

@radarek Dobra znalazłem bład paramsy z data łaczyłem w string i zapisywałem w bazie i domyslnie dodawał offset 0. Dodałem teraz do stringa z data .in_time_zone("Europe/Warsaw") i w configu:

    config.time_zone = "Europe/Warsaw"
    config.active_record.default_timezone = :local

I działa w Vue i railsach ale zostały hbs-y ale to już się ogarnie jakos, dzięki