Kun muutan epoch-millisekunnit Date-päivämääräolioksi tyyliin var aika = new Date (epoch_millisekunnit), tekee PC muunnoksen oikein. Android lisää aikaan kaksi tuntia aikavyöhykelisää. Molemmat tuntevat aikavyöhykkeensä oikein.
PC näytää siis olettavan, että epoch-aika on paikallista aikaa, kun taas Android olettaa epochin olevan GMT-aikaa.
Mitä pitäis tehdä, jos lähdetään siitä, että mitään if Android -virityksiä ei toteuteta?
Jos kuvauksesi on oikea, ”PC” – mitä se tarkoittaakin – toimii väärin ja ”Android” oikein: aikaleiman kuuluu olla UTC-ajassa. Oletko testannut toimintaa eri selaimilla? Ainakin Linuxissa Firefox antaa aivan oikean tuloksen.
alert(new Date(0).getUTCHours() == 0 ? "oikein" : "väärin");
Palvelimen kello on 13:00.
epoch_ms = palvelimen aika epoch-millisekunteina
PC, Firefox:
alert (new Date (epoch_ms)) -> 13:00 GMT+02
Android, mikälieselain:
alert (new Date (epoch_ms)) -> 15:00 GMT+02
Edelleenkin kerrot vain kellonaikoja, vaikka ruudulla näkyy ihan varmasti muutakin. Esimerkiksi mitä aikavyöhykkeitä tulostus näyttää? Edit: muutitkin viestiäsi. Entä mitä funktiot toUTCString, toLocaleString ja getUTCHours antavat? Testasitko äskeistä koodiani?
Tarkista myös, että palvelimeltasi tulee varmasti UTC-aika. Tämä ei toki selitä selainten välisiä eroja, mutta jos palvelimelta tulee väärä aikaleima, on vaikea selvittää, mikä laite, selain tai käyttöjärjestelmä on mihinkin suuntaan väärässä. Helpointa on testata aikaleimalla 0, jolloin ajan pitäisi olla 00:00 UTC tai vastaavasti 02:00 EET (GMT+02).
Mikä hemmetin PC viestissäsi yhä seikkailee? Minullakin on PC, ja siinä on käyttöjärjestelmänä Arch Linux. Jos tarkoitat jotain tiettyä käyttöjärjestelmää, sano sen nimi.
Kyllä ainakin kapsin palvelimella toimii sekä firefox, chrome, IE (8 ja 9) normaalilla PC-tietokoneella aivan samalla tavalla kuin android vakioselaimella ja chrome-selaimella.
Eli siis olet töpeksinyt nyt pahasti jossakin välissä noiden aikaleimojen kanssa. Puhelimessasi saattaa olla eri asetus, kuin tuossa mystisessä PC:ä.
Metabolix kirjoitti:
Entä mitä funktiot toUTCString, toLocaleString ja getUTCHours antavat? Testasitko äskeistä koodiani?
var aika = new Date(epoch);
alert (epoch + "\n" + aika.toUTCString() + "\n" + aika.toLocaleString() + "\n" + aika.getUTCHours());
---> Windows, tai siis hemmetin Windows, Firefox:
1384948989000
Wed, 20 Nov 2013 12:03:09 GMT
20. marraskuuta 2013 14:03:09
12
---> Android:
1384948989000
Wed, 20 Nov 2013 14:03:09 GMT
20. marraskuuta 2013 16:03:09
14
Onko puhelimessasi kenties väärä aikavyöhyke?
PC-firefox kirjoitti:
1384948989000
Wed, 20 Nov 2013 12:03:09 GMT
20. marraskuuta 2013 14:03:09
12
PC-IE 8 kirjoitti:
1384948989000
Wed, 20 Nov 2013 12:03:09 GMT
20. marraskuuta 2013 14:03:09
12
android 4.0 chrome kirjoitti:
1384948989000
Wed, 20 Nov 2013 12:03:09 GMT
20. marraskuuta 2013 14:03:09
12
Teuro kirjoitti:
Onko puhelimessasi kenties väärä aikavyöhyke?
Ei ole. Molemmissa laitteissa on GMT + 2.
Aikaleimasi on siis tavallinen UTC-aikaleima, ja Windowsissa saat siitä oikean tuloksen. Sen sijaan Androidissa (yhä tuntemattomalla selaimella) näyttää tapahtuvan jonkinlainen tuplamuunnos niin, että ensin UTC-aikaleima muutetaan paikalliseen aikaan mutta sitten paikallista aikaa käytetäänkin jostain syystä taas UTC-aikana.
Nyt olisi varmaan syytä hankkia laitteesta mahdollisimman selvät tiedot, mm. Androidin versio ja selaimen nimi ja versio. Päivitykset voisivat olla tarpeen, jos niitä on saatavilla.
Aihe on jo aika vanha, joten et voi enää vastata siihen.