Hoe te converteren tijd correct in alle tijdzones?
Laten we zeggen dat gebruiker in CA, VS kiest een datum, tijd en tijdzone:
Wereldwijd bier marathon begint op 8/15/2013 10:00 am GMT-08:00
Een andere gebruiker, in het Centrum van Europa opent de pagina waar deze datum en tijd wordt weergegeven. Hij wil niet te time berekeningen (had een paar biertjes al). Hij wil gewoon om te zien deze datum en tijd:
8/15/2013 19:00
Gezien de browser ontvangt de informatie over datum en tijd, zoals ingevoerd door de gebruiker in Californië:
Is er een manier, in javascript, zonder externe web services, om een juiste conversie? Dat is, op te sporen die 10 uur UTC-08:00 moet eigenlijk 10u GMT-07:00 uur, want het is zomertijd.
Misschien heb ik verkeerd begrijpen van dit vanaf het begin, maar ik denk niet dat het invoeren van de gebruiker om na te denken of hij moet kiezen GMT-08:00 (PST) of UTC-07:00 (PDT). Ik ga ervan uit dat, aangezien de standaard tijdzone in CA is een PST-bestand, mensen hoeven niet meer te denken in PDT in de zomer. Of niet soms?!
In centraal-Europa, standaard-date is UTC+01:00 uur, zomertijd datum is UTC+02:00 uur. Dus dat verschil tussen de CA en Europa moet worden 9 uur, met uitzondering van twee periodes in een jaar, wanneer de ene of de andere schakelt tussen Standaard en zomertijd modi.
Update:
Na wat meer na te denken en het lezen van de reacties, wat ik ideaal zou nodig hebben, is dit:
var utcOffset = f('2013-08-15T10:00', 'America/Los_Angeles');
//utcOffset == "-07:00"
var utcOffset = f('2013-11-15T10:00', 'America/Los_Angeles');
//utcOffset == "-08:00"
Zo ver, het lijkt erop dat de moment.js/timezone plugin, voorgesteld door Guido Preite is in staat om dit te doen (meer of minder).
Enige andere manier, via een browser-Api ‘ s?
- check
Moment.js
enMoment Timezone
momentjs.com/timezone - Ik gebruik moment.js al. De Tijdzone uitbreiding ziet er veelbelovend uit. De gegenereerde tijdzones bestand bevat de zomertijd conversie van gegevens. Na een snelle testen, het was precies de tijd aan te passen ingevoerd. Dus dit lijkt browsers zijn niet in staat om te zeggen “hey, voor deze datum moet u dit UTC offset omdat op die datum, daar is de Zomer de tijd”?
10:00-8 en 10:00-7 zijn twee verschillende momenten in de tijd. Ze zijn gelijk aan 18:00Z en 17:00Z respectievelijk (Z = UTC). Wanneer u meten in termen van een offset -, zomertijd niet in beeld. Ooit.
In het algemeen, denken de mensen enkel in de “Stille Tijd”, en dat betekent dat zowel PST-bestand in de winter, en PDT in de zomer. Maar computers zijn nauwkeuriger. Als je ziet PST, het betekent UTC-8. Als je ziet PDT, betekent UTC-7. Het zou ongeldige label met behulp van een formulier tegelijkertijd verwijzen naar de verschuiving van de andere.
Tijdzone afkortingen niet eenduidig. Ideaal wanneer u verwijst naar de zone programmatisch, moet u gebruik maken van de IANA-zone naam, zoals
America/Los_Angeles
. Dit is echter op dit moment niet mogelijk in alle JavaScript-runtimes zonder een bibliotheek. (Ze werken op dit al.)Corrigeren. Ze kunnen ofwel 8, 9, of 10 uur na elkaar. Ze schakelen op volledig verschillende malen al, dus probeer niet om deze zelf.
Moment-tijdzone is een grote bibliotheek. Echter, uit de scenario beschreven, ik denk niet dat je je zorgen hoeft te maken over tijdzone conversie zoveel als u denkt. Zie als kunt u volgt deze logica:
U lezen dat textbox waarde naar een string, en ontleden in een date:
of met behulp van moment.js:
Omdat dit wordt gedaan op de computer van de gebruiker, JavaScript, zal er automatisch van uit dat dit een lokale datum en tijd. U hoeft niet te zorgen dat een eventuele offset of tijdzone-informatie.
Dit betekent dat als gevolg van de ZOMERTIJD overgangen die de tijd ingevoerd kan worden ongeldig of niet eenduidig is. JavaScript is niet zo ‘ n geweldige baan bij het omgaan met die in feite – u krijgt verschillende resultaten op de verschillende browsers. Als u wilt ondubbelzinnig, dan zou je een offset.
Zodra u een
Date
(of eenmoment
), dan kunt u het evalueren van de UTC-equivalent:het is hetzelfde met moment.js maar heb je een betere browser ondersteuning:
U dat opslaan UTC waarde in uw database.
De andere gebruiker in Centraal-Europa komt langs en laadt de gegevens.
U voeden in een
Date
ofmoment
in JavaScript:of met moment.js (nogmaals, een betere browser ondersteuning)
Omdat JavaScript kent de tijdzone regels van de lokale computer, u kunt nu dit scherm de datum en het zal worden gepresenteerd met de Midden-europese tijdzone:
of met moment.js u kunt de controle van de output formaat beter
je zou ook kunnen laten moment.js beslissen wat gelokaliseerde indeling van de output:
Samen te vatten – als u alleen geïnteresseerd in het omzetten naar en van de lokale tijdzone (welke zone die kan worden), dan kunt u alles doen met slechts
Date
. Moment.js zal het makkelijker maken voor het parseren en opmaak, maar het is niet absoluut noodzakelijk.Er zijn slechts een paar scenario ‘ s die nodig een tijdzone bibliotheek (zoals het moment timezone of anderen).
U wilt zetten naar of van een zone die is niet de lokale tijdzone of UTC.
U werkt met data die in het verleden en er sprake is van een wijziging van de tijd-zone regels of de zomertijd regels sindsdien en u data dat zou anders worden geïnterpreteerd volgens de nieuwe regels te maken dan met de oude. Dit is een beetje technisch, maar het gebeurt. Lees meer hier en hier.
Default constructor maakt een exemplaar van de lokale tijd
Ik kan het niet testen, maar je moet in staat zijn om uw datetime (als parameter van de constructor)..
..en dan moet je in staat zijn om te bellen Datum object functies zoals getMonth, welke gegevens worden geretourneerd in de lokale tijdzone. Geschreven op: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Note1: Zonder server = er is geen server|db bij alle? Als het er is, moet de datum worden opgeslagen als UTC in db en laden als lokale tijd voor elke gebruiker.. die manier hoeft u zich geen zorgen hoeft te maken conversies.
Note2: Deze vraag heeft een bepaalde code toont hoe je tijdzone verschil: Hoe te krijgen van de precieze lokale tijd van de klant?
Heb ik deze oplossing op basis van andere voorbeelden…hoop dat dit werkt voor u! Beschikbaar op jsfiddle.