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?

InformationsquelleAutor rdamborsky | 2013-08-02



3 Replies
  1. 22

    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.

    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.

    Ik neem aan 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 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.)

    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.

    Corrigeren. Ze kunnen ofwel 8, 9, of 10 uur na elkaar. Ze schakelen op volledig verschillende malen al, dus probeer niet om deze zelf.

    Zo ver, het lijkt op het moment.js/timezone plugin, voorgesteld door Guido Preite is in staat om dit te doen (meer of minder).

    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:

    1. De gebruiker in Californië gaat een datum en tijd in een textbox.
    2. U lezen dat textbox waarde naar een string, en ontleden in een date:

      var dt = new Date("8/15/2013 10:00");

      of met behulp van moment.js:

      var m = moment("8/15/2013 10:00", "M/D/YYYY HH:mm");
    3. 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.

    4. 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.

      //PST
      var dt = new Date("3/11/2013 1:00 UTC-08:00");
      
      //PDT
      var dt = new Date("3/11/2013 1:00 UTC-07:00");
    5. Zodra u een Date (of een moment), dan kunt u het evalueren van de UTC-equivalent:

      var s = dt.toISOString();  // 2013-08-15T17:00:00Z

      het is hetzelfde met moment.js maar heb je een betere browser ondersteuning:

      var s = m.toISOString();  // 2013-08-15T17:00:00Z
    6. U dat opslaan UTC waarde in uw database.

    7. De andere gebruiker in Centraal-Europa komt langs en laadt de gegevens.

    8. U voeden in een Date of moment in JavaScript:

      var dt = new Date("2013-08-15T17:00:00Z");

      of met moment.js (nogmaals, een betere browser ondersteuning)

      var m = moment("2013-08-15T17:00:00Z")
    9. 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:

      var s = dt.ToString();  // browser specific output
      //ex: "Thu Aug 15 2013 19:00:00 GMT+0200 (Central Europe Daylight Time)"

      of met moment.js u kunt de controle van de output formaat beter

      var s = m.format("DD/MM/YYYY HH:mm"); //"15/08/2013 19:00"

      je zou ook kunnen laten moment.js beslissen wat gelokaliseerde indeling van de output:

      var s = m.format("llll"); //"Thu, 15 Aug 2013 19:00"

    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.

    • Dankzij Matt voor een volledige informatie, links en gids. Mijn scenario is precies het je eerste plaats gewezen: de conversie is niet van de lokale tijd zone. Dat is, de gebruiker die in de datum en tijd ook komt timezone die relevant is voor die tijd. Dit hoeft niet per se te worden van de tijdzone van de gebruiker zich bevindt. Ik zie dat ik moet vermelden dat dit duidelijk in de vraag.
    • Ik zal zeggen dat het belachelijk dat javascript, het programmeren van de taal van het “world wide web” niet hebben gebouwd in de tijd conversie / timezone tools
  2. 1

    Default constructor maakt een exemplaar van de lokale tijd

    var localDate = new Date(); 

    Ik kan het niet testen, maar je moet in staat zijn om uw datetime (als parameter van de constructor)..

    var eventDate = [SOMEDATE];
    var localDate = new Date(eventDate);

    ..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?

    • Ja, dit werkt over het algemeen ok. Het probleem is dat wanneer de gebruiker een expliciete timezone om gebruikt te worden voor de datum wordt opgeslagen. Stel u voor, u indienen 07/20/2013 10:00 GMT-08:00 terwijl het denken over deze tijd in CA. Maar ook deze informatie is onjuist, omdat op die datum -07:00 uur te worden gebruikt voor de utc offset. En dit is wat ik nodig heb om te detecteren en op te lossen. De opslag en het ophalen deel is eenvoudig zodra de datum is correct opgeslagen. Ik wil voorkomen dat besluit tussen standaard/zomer tijdens de fase.
  3. 1

    Heb ik deze oplossing op basis van andere voorbeelden…hoop dat dit werkt voor u! Beschikbaar op jsfiddle.

    /* 
    * Author: Mohammad M. AlBanna
    * Website: MBanna.me
    * Description: Get the current time in different time zone 
    */
    
    //Check daylight saving time prototype
    Date.prototype.stdTimezoneOffset = function() {
        var jan = new Date(this.getFullYear(), 0, 1);
        var jul = new Date(this.getFullYear(), 6, 1);
        return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
    }
    
    Date.prototype.dst = function() {
        return this.getTimezoneOffset() < this.stdTimezoneOffset();
    }
    
    var today = new Date();
    var isDST = today.dst() ? true : false;
    var pstOffset = isDST ? 7 : 8;
    var cstOffset = isDST ? 5 : 6;
    var estOffset = isDST ? 4 : 5;
    var gmtOffset = 1;
    
    pstOffset = pstOffset * 60 * 60 * 1000;
    cstOffset = cstOffset * 60 * 60 * 1000;
    estOffset = estOffset * 60 * 60 * 1000;
    gmtOffset = gmtOffset * 60 * 60 * 1000;
    
    var todayMillis = today.getTime();
    var timeZoneOffset = (today.getTimezoneOffset() * 60 * 1000);
    
    var curretPST = todayMillis - pstOffset; 
    var curretCST = todayMillis - cstOffset; 
    var curretEST = todayMillis - estOffset;
    var curretGMT = todayMillis - gmtOffset;
    
    addP("PST Time : " + new Date(curretPST).toUTCString());
    addP("CST Time : " + new Date(curretCST).toUTCString());
    addP("EST Time : " + new Date(curretEST).toUTCString());
    addP("GMT Time : " + new Date(curretGMT).toUTCString());
    addP("Local Time : " + new Date(today.getTime() - timeZoneOffset ).toUTCString());
    
    function addP(value){
        var p = document.createElement("p");
        p.innerHTML = value;
        document.body.appendChild(p);
    }

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *