Brak kompatybilności skryptu JS w Mozilli, obiekt Date

0

Witajcie. Mam problem z obiektem Date w JavaScripcie. Mianowicie - pobieram dane pogodowe ajaxem z Open Weather Map. Nie mogę poradzić sobie z poprawnym pobieraniem godzin, między innymi na potrzeby sunrise oraz sunset. Dla uproszczenia, omówię dokładniej problem na przykładzie.

  1. API zwraca wartość dla wschodu słońca: sunrise = 2016-08-28T0321 - słońce wstaje o godzinie 3:42 czasu UTC 0,tj. o 5:42 czasu UTC +2, czyli naszego czasu letniego.
  2. Zamieniam wartość sunrise na obiekt Date: sunriseDateObj = new Date(sunrise);
  3. Metodą getHours() wyciągam z obiektu daty godzinę. W tym momencie następuje rozbieżność. sunriseDateObj.getHours(); zwraca wartość 5 w Chrome i Operze czyli automatycznie podmienia wartość na nasz czas letni UTC +2. W Mozilli zwraca wartość 3, czyli nie podmienia jej i pozostaje w UTC 0.
  4. Chcąc rozwiązać problem zamiast metody getHours() użyłem na obiekcie daty metody getUTCHours(), a kolejno chciałem dopasować godzinę do strefy czasowej usera metodą getTimezoneOffset();. W Chrome i Operze zwracana godzina jest faktycznie zgodna z czasem UTC 0, czyli przyjmuje wartość 3. W Mozilli zwracana wartość jest błędna, ponieważ przeglądarka zwraca tym razem liczbę 1, czyli jakby cofnęła strefę czasową do UTC -2.

Przepraszam, jeśli opis jest chaotyczny. Starałem się jak najdokładniej przedstawić problem. Dostęp do plików pod linkiem https://github.com/borecki/weather_app
Po odpaleniu strony w Chromie bądź Operze godzina wschodu i zachodu słońca jest wyświetlana poprawnie. W Mozilli jest 2 godziny do tyłu. Ktoś jest w stanie pomóc i podpowiedzieć jak zapanować nad tym czasem? Z góry dziękuje za pomoc.

0

Może coś z ustawieniem? Wyświetl sobie to co trzyma sunriseDateObj powinno być coś podobnego do tego "Mon Oct 10 2011 1400 GMT+0200" jak widzisz na końcu podaje strefę czasową trzymanej wartości. Ewentualnie możesz się pobawić z biblioteką którą powinna zapewnić ci wszystko co potrzebujesz http://momentjs.com

0

Pod sunriseDataObj znajduje się:
Chrome i Opera wyświetla w konsoli: Mon Aug 29 2016 0510 GMT+0200 - czyli godzina zamieniona na czas UTC +2 względem wartości zwróconej przez API.
Mozilla wyświetla w konsoli: 2016-08-29T0110.000Z - tj. godzina w czasie UTC -2 względem wartości zwróconej przez API.

Dziękuje za bibliotekę. Spróbuję z niej korzystać i jeśli się uda, to zostawię ten temat w spokoju. Chociaż wydaje mi się, że na taki problem powinno być jakieś rozwiązanie bez stosowania zewnętrznych bibliotek.

@Edit:
Póki co udało mi się metodą prób i błędów w bardzo prymitywny sposób zwrócić godzinę 3, zarówno w Chrome jak i Mozilli. Dopasowanie do właściwej strefy czasowej będzie teraz możliwe metodą getTimezoneOffset();. Nie jest to jednak raczej satysfakcjonujące rozwiązanie.

var sunrise = $(this).find('city').children('sun').attr('rise');
var sunriseDataObj = new Date(sunrise[0]+sunrise[1]+sunrise[2]+sunrise[3],sunrise[5]+sunrise[6],sunrise[8]+sunrise[9],sunrise[11]+sunrise[12],sunrise[14]+sunrise[15],sunrise[17]+sunrise[18]);

console.log(sunrise);
console.log(sunriseDataObj)	
console.log(sunriseDataObj.getHours());

Konsola Chrome wyświetla:

console.log(sunrise); // 2016-08-29T03:43:10
console.log(sunriseDataObj); // Thu Sep 29 2016 03:43:10 GMT+0200 (Środkowoeuropejski czas letni)
console.log(sunriseDataObj.getHours()); 3

Konsola Mozilli wyświetla:

console.log(sunrise); // 2016-08-29T03:43:10
console.log(sunriseDataObj); // 2016-09-29T01:43:10.000Z
console.log(sunriseDataObj.getHours()); 3
1

tldr;
dodaj "Z" do daty, przykład "2016-08-28T0321" + "Z"

wyjaśnienie http://stackoverflow.com/a/14924025
consola fx(firefox)

11:13:50.725 s = "2016-08-28T03:42:21"
11:13:50.734 "2016-08-28T03:42:21"
11:13:59.262 s2 = "2016-08-28T03:42:21Z"
11:13:59.269 "2016-08-28T03:42:21Z"
11:14:05.073 (new Date(s)).toUTCString()
11:14:05.080 "Sun, 28 Aug 2016 01:42:21 GMT"
11:14:11.328 (new Date(s2)).toUTCString()
11:14:11.339 "Sun, 28 Aug 2016 03:42:21 GMT"

1 użytkowników online, w tym zalogowanych: 0, gości: 1