web-dev-qa-db-fra.com

Obtenir le temps d'un fuseau horaire spécifique

J'utilise une classe JavaScript Date et j'essaie d'obtenir la date actuelle à l'aide de la méthode getDate(). Mais évidemment, il s'agit du chargement de la date et de l'heure du système. Je lance le code de l'Inde mais je veux obtenir la date et l'heure du Royaume-Uni en utilisant la même méthode. Comment puis je faire ça ?

50
aslamdoctor

Si vous connaissez le décalage UTC, vous pouvez le transmettre et obtenir l'heure à l'aide de la fonction suivante:

function calcTime(city, offset) {
    // create Date object for current location
    var d = new Date();

    // convert to msec
    // subtract local time zone offset
    // get UTC time in msec
    var utc = d.getTime() + (d.getTimezoneOffset() * 60000);

    // create new Date object for different city
    // using supplied offset
    var nd = new Date(utc + (3600000*offset));

    // return time as a string
    return "The local time for city"+ city +" is "+ nd.toLocaleString();
}

alert(calcTime('Bombay', '+5.5'));

Extrait de: Convertir l'heure locale en heure locale

50
Sudhir Bastakoti

Vous pouvez utiliser Intl.DateTimeFormat .

var options = {
    timeZone: 'Europe/London',
    year: 'numeric', month: 'numeric', day: 'numeric',
    hour: 'numeric', minute: 'numeric', second: 'numeric',
},
    formatter = new Intl.DateTimeFormat([], options)
formatter.format(new Date())

Sinon, si vous formatez une seule fois au lieu d’utiliser en bloc, utilisez Date.prototype.toLocaleDateString() .

(new Date()).toLocaleString([], options)

Malheureusement, les navigateurs ne sont pas nécessaires pour comprendre les fuseaux horaires autres que UTC. try ces blocs et trouver une alternative en cas d'échec, par exemple, récupérer le décalage du fuseau horaire sur un serveur.

29
transistor09

La meilleure façon de faire est d'utiliser getLocaleString, comme ceci:

Créez un objet de date:

date = new Date(0)

Si vous êtes à Berlin, ceci devrait être converti en cette chaîne:

Jeu Jan 01 1970 01:00:00 GMT + 0100 (CET)

Obtenez les heures à Athènes:

date.toLocaleString('de-DE', {hour: '2-digit',   hour12: false, timeZone: 'Europe/Athens' })

'02'

Obtenez les heures à Shanghai:

date.toLocaleString('de-DE', {hour: '2-digit',   hour12: false, timeZone: 'Asia/Shanghai' })

'08'

16
Chris

C'est la bonne façon d'obtenir ##

function getTime(offset)
        {
            var d = new Date();
            localTime = d.getTime();
            localOffset = d.getTimezoneOffset() * 60000;

            // obtain UTC time in msec
            utc = localTime + localOffset;
            // create new Date object for different city
            // using supplied offset
            var nd = new Date(utc + (3600000*offset));
            //nd = 3600000 + nd;
            utc = new Date(utc);
            // return time as a string
            $("#local").html(nd.toLocaleString());
            $("#utc").html(utc.toLocaleString());
        }
9
Joy Chowdhury

Vous pouvez utiliser getUTCDate() et les méthodes getUTC...() associées pour accéder à une heure basée sur l'heure UTC, puis convertir.

Si vous le souhaitez, vous pouvez utiliser valueOf() , qui renvoie le nombre de secondes, en UTC, depuis l’époque Unix, et travailler avec cela, mais cela risque d’être beaucoup plus complexe.

5
mc10

Date.getTimezoneOffset ()

La méthode getTimezoneOffset () renvoie la différence de temps entre l'heure GMT et l'heure locale, en minutes.

Par exemple, si votre fuseau horaire est GMT + 2, -120 sera renvoyé.

Remarque: Cette méthode est toujours utilisée avec un objet Date.

var d = new Date()
var gmtHours = -d.getTimezoneOffset()/60;
document.write("The local time zone is: GMT " + gmtHours);
//output:The local time zone is: GMT 11
1
Kieran

S'il est vraiment important que vous ayez la bonne date et l'heure, Il est préférable d’avoir un service sur votre serveur (que vous avez bien sûr fonctionnant en UTC) qui renvoie l’heure. Vous pouvez ensuite créer une nouvelle date sur le client et comparer les valeurs et éventuellement ajuster toutes les dates avec le décalage par rapport à l'heure du serveur.

Pourquoi faire ceci? J'ai eu des rapports de bogues difficiles à reproduire car je ne pouvais pas trouver les messages d'erreur dans le journal du serveur, jusqu'à ce que je remarque que le rapport de bogues a été envoyé deux jours par jour après que je l'ai reçu. Vous pouvez probablement faire confiance au navigateur pour gérer correctement la conversion de fuseau horaire lorsqu'un horodatage UTC est envoyé, mais vous ne pouvez évidemment pas faire confiance aux utilisateurs pour que leur horloge système soit correctement configurée. (Si le fuseau horaire des utilisateurs est également incorrectement défini, il n'y a pas vraiment de solution; mis à part l'impression de l'heure actuelle du serveur à l'heure "locale")

0