Convertir la date en un autre fuseau horaire en JavaScript

336

Je recherche une fonction pour convertir la date dans un fuseau horaire en un autre.

Il a besoin de deux paramètres,

  • date (au format "2012/04/10 10:10:30 +0000")
  • chaîne de fuseau horaire ("Asia / Jakarta")

La chaîne de fuseau horaire est décrite dans http://en.wikipedia.org/wiki/Zone.tab

Y a-t-il un moyen facile de faire ceci?

Rizky Ramadhan
la source
1
Trouvez le décalage UTC d'une ville donnée. stackoverflow.com/questions/3002910/…
Brandon Boone
3
Je veux calculer non seulement le décalage UTC mais aussi l'heure d'été / d'été. Le temps reviendra donc correctement.
Rizky Ramadhan
Vérifiez aussi celui-ci stackoverflow.com/questions/16084313/…
Amol M Kulkarni
Décalage de votre fuseau horaire à l'aide de la commande de date unix: date +% s -d '1 janvier 1970'
anthony

Réponses:

192

var aestTime = new Date().toLocaleString("en-US", {timeZone: "Australia/Brisbane"});
console.log('AEST time: '+ (new Date(aestTime)).toISOString())

var asiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Shanghai"});
console.log('Asia time: '+ (new Date(asiaTime)).toISOString())

var usaTime = new Date().toLocaleString("en-US", {timeZone: "America/New_York"});
console.log('USA time: '+ (new Date(usaTime)).toISOString())

var indiaTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Kolkata"});
console.log('India time: '+ (new Date(indiaTime)).toISOString())

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

Udhaya
la source
1
J'ai changé de réponse à cela, car c'est une méthode correcte et standard sans utiliser de bibliothèque.
Rizky Ramadhan
5
La documentation MDN indique clairement que le seul fuseau horaire qui doit être reconnu dans toutes les implémentations est UTC. ( stackoverflow.com/questions/10087819/… ) Cliquer sur le bouton [Exécuter l'extrait de code] dans IE11 produit une erreur.
Vivian River
1
Si quelqu'un cherche une implémentation qui fonctionne pour tous les navigateurs en ce moment, il peut essayer toutes les réponses ci-dessous avec ses propres inconvénients ...
Rizky Ramadhan
14
Cette réponse montre le passage correct d'un fuseau horaire à toLocaleString, mais elle montre très incorrectement le passage de cette chaîne dans le Dateconstructeur. Cela demande des ennuis. L'analyseur de chaîne de date n'est pas requis pour accepter des formats spécifiques aux paramètres régionaux et l'entrée serait traitée comme si elle se trouvait dans le fuseau horaire local. Ne fais pas ça. Utilisez simplement la sortie de chaîne du premier toLocalStringappel.
Matt Johnson-Pint
4
@MattJohnson alors vous ne pouvez pas utiliser getHour () ou de telles méthodes
Ali Padida
131

Pour les utilisateurs de moment.js , vous pouvez désormais utiliser moment-timezone . En l'utilisant, votre fonction ressemblerait à ceci:

function toTimeZone(time, zone) {
    var format = 'YYYY/MM/DD HH:mm:ss ZZ';
    return moment(time, format).tz(zone).format(format);
}
Brian Di Palma
la source
3
Je ne savais pas comment ajouter de nouveaux fuseaux horaires, les documents ne m'ont pas aidé. Je suis juste un programmeur, pas un expert en temps!
Parziphal
8
Le problème ici est que cela ne renvoie pas un nouvel objet Date, il renvoie une chaîne. Si c'est ce que vous voulez, c'est bien, bien sûr.
nickdnk
2
N'est-ce pas "moment de retour (heure) .tz (zone) .format (format);" ? Celui que vous avez indiqué dans votre code comporte l'erreur "Date non valide".
Tarek
1
Il n'est pas possible de charger Moment.js dans le navigateur. Très triste :(
Daniil Shevelev
4
Si vous n'êtes pas satisfait de l'envoi de 180 Ko au navigateur avec une copie de la base de données tz et que vous pouvez vivre avec une dégradation du fuseau horaire actuel sur les navigateurs plus anciens, essayez la réponse de @ lambinator en utilisant Date.prototype.toLocaleString.
Peter V. Mørch
92

Volé sans vergogne à: http://www.techrepublic.com/article/convert-the-local-time-to-another-time-zone-with-this-javascript/6016329

/** 
 * function to calculate local time
 * in a different city
 * given the city's UTC offset
 */
function calcTime(city, offset) {

    // create Date object for current location
    var d = new Date();

    // convert to msec
    // add 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 in " + city + " is " + nd.toLocaleString();
}

cette fonction est utile pour calculer la valeur du fuseau horaire en fournissant le nom d'une ville / pays et la valeur de décalage

Valli69
la source
4
sympa .... mais je pense qu'il veut que le décalage soit recherché pour lui en fonction du passé en ville.
Brandon Boone
117
Cela ne prend pas en compte les modifications de l'heure d'été.
Robotbugs
12
ne répond pas à la question mais répond à la mienne (+1)
Reign.85
Ce «3600000» m'a littéralement tué! Dans l'entrée, tz doit être donné en heures! Et, il devrait être soustrait. Donc, si vous passez: var d = new Date calcTime ('', d.getTimezoneOffset () / 60); Il faut redonner en même temps.
Praveen du
1
Cette réponse est sérieusement obsolète et doit être supprimée, en particulier la partie utilisant toLocaleString , qui signalera probablement le fuseau horaire de l'hôte lorsqu'il a été déplacé vers un autre fuseau horaire. Il existe de bien meilleures façons de créer manuellement des horodatages pour différents décalages.
RobG
89

La plupart des navigateurs de bureau (non mobiles) à l'exception de Safari prennent en charge la fonction toLocaleString avec des arguments, les navigateurs plus anciens ignorent généralement les arguments.

new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })
lambinator
la source
4
Échoue dans Firefox et Edge :(
Šime Vidas
10
Parce que cela échoue dur dans FF et IE11 +, une autre solution doit être trouvée.
jdavid.net
2
Edge et Chrome ont aimé :)
Suhail Mumtaz Awan
6
Cela fonctionnait tout à l'heure sur Chrome v59 et Firefox desktop v54 et Chome sur Android v59 et Safari 10 sur iOS 10.3. Cela n'a pas fonctionné sur IE10. La description par MDN de Date.prototype.toLocaleString () a une toLocaleStringSupportsLocales()implémentation qui vous permet de vérifier de manière fiable la prise en charge.
Peter V. Mørch
1
Testé avec succès dans node.js v8.7.0
Heinrich Ulbricht
56

D'accord, je l'ai trouvé!

J'utilise timezone-js . c'est le code:

var dt = new timezoneJS.Date("2012/04/10 10:10:30 +0000", 'Europe/London');
dt.setTimezone("Asia/Jakarta");

console.debug(dt); //return formatted date-time in asia/jakarta
Rizky Ramadhan
la source
90
Je dois voter contre cela, timezone-js ne prend pas en charge l'heure d'été et il n'en fait pas la publicité dans son fichier Lisez-moi, ce qui en fait un mauvais conseil pour les personnes qui le recherchent. Voir: github.com/mde/timezone-js/issues/51 et un certain nombre d'autres problèmes qui ont été déposés et qui ne semblent pas être résolus.
@nus oui, mais il n'y a vraiment pas de solution pour la gestion du fuseau horaire / date côté client ... jquery ui datepicker m'a rendu fou à cause de cela. cheers
Lucas
2
@Marabunta, ressemble au fuseau horaire (réponse de Brian Di Palma) prend en charge l'heure d'été github.com/moment/moment-timezone/issues/21
welldan97
2
N'utilisez pas TimezoneJS, il est buggé autour des changements d'heure d'été.
matf
17

Si vous ne souhaitez pas importer une grande bibliothèque, vous pouvez simplement utiliser Intl.DateTimeFormat pour convertir les objets Date en différents fuseaux horaires.

// Specifying timeZone is what causes the conversion, the rest is just formatting
const options = {
  year: '2-digit', month: '2-digit', day: '2-digit',
  hour: '2-digit', minute: '2-digit', second: '2-digit',
  timeZone: 'Asia/Jakarta',
  timeZoneName: 'short'
}
const formater = new Intl.DateTimeFormat('sv-SE', options)
const startingDate = new Date("2012/04/10 10:10:30 +0000")

const dateInNewTimezone = formater.format(startingDate) 
console.log(dateInNewTimezone) // 12-04-10 17:10:30 GMT+7

Les compensations, l'heure d'été et les changements dans le passé seront pris en charge pour vous.

Interminable
la source
IE10 + ne prend pas en charge l'API Intl pour les fuseaux horaires. moment.github.io/luxon/docs/manual/matrix.html
Chloe
C'est en fait la meilleure réponse. toLocaleStringa une implémentation incohérente, et cela fonctionne à partir d'IE11.
dlsso
FYI: Cela ne fonctionne pas réellement dans IE11, au moins sur Windows 8.1. Lorsque vous essayez de créer l' formatterobjet, vous obtenez: `` La valeur de l'option 'Asia / Jakarta' pour 'timeZone' est en dehors de la plage valide. Attendu: ['UTC'] ``
veddermatic
existe-t-il un moyen de convertir à nouveau le résultat final du formateur en un objet Date?
mding5692
10

Je l'ai !

Je voulais forcer la date affichée = date du serveur, peu importe les paramètres locaux (UTC).

Mon serveur est GMT-6 -> new Date (). GetTimezoneOffset () = 360.

myTZO = 360;
myNewDate=new Date(myOldDateObj.getTime() + (60000*(myOldDateObj.getTimezoneOffset()-myTZO)));
alert(myNewDate);
Cedric Simon
la source
2
Bien qu'il affiche l'heure naïve correcte, les informations de fuseau horaire de myOldDateObj sont conservées. Donc, en fait, ce n'est pas le bon moment (lorsque vous prenez le temps comme une instance dans le temps et non le temps sur une montre).
gabn88
@ gabn88: Vous ne pourrez pas changer l'heure du serveur en utilisant Javascript ... Pour fixer l'heure du serveur, faites-le au niveau du système d'exploitation.
Cedric Simon
2
Je n'ai pas besoin de fixer l'heure du serveur;) L'heure du serveur est toujours UTC pour moi. Mais j'ai une organisation différente dans différents fuseaux horaires. Et leurs appareils doivent toujours indiquer l'heure à laquelle leur organisation est stationnée, où qu'ils se trouvent.
gabn88
Nous avons un problème similaire d'afficher les dates toujours X fuseau horaire. Nous essayons d'envoyer toutes les dates au format chaîne depuis le serveur et dans le navigateur, nous les traitons simplement comme des dates de fuseau horaire local.
Venkateswara Rao
5

Vous pouvez utiliser la méthode toLocaleString () pour définir le fuseau horaire.

new Date().toLocaleString('en-US', { timeZone: 'Indian/Christmas' })

Pour l'Inde, vous pouvez utiliser "Indien / Noël" et voici les différents fuseaux horaires,

"Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"
Codemaker
la source
Vous ne définissez pas le timeZone, mais produisez plutôt une chaîne avec le temps exprimé dans ce timeZone. La date reste la même.
Gerard ONeill
La toLocaleStringsolution a déjà été donnée il y a 4 ans .
Dan Dascalescu
4

Si vous avez juste besoin de convertir des fuseaux horaires, j'ai téléchargé une version allégée de l' instant-timezone avec juste la fonctionnalité minimale. Ses données ~ 1 Ko +:

S.loadData({
    "zones": [
        "Europe/Paris|CET CEST|-10 -20|01010101010101010101010|1GNB0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|11e6",
        "Australia/Sydney|AEDT AEST|-b0 -a0|01010101010101010101010|1GQg0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0|40e5",
    ],
    "links": [
        "Europe/Paris|Europe/Madrid",
    ]
});

let d = new Date();
console.log(S.tz(d, "Europe/Madrid").toLocaleString());
console.log(S.tz(d, "Australia/Sydney").toLocaleString());
Santiago Corredoira
la source
2

Définissez une variable avec l'année, le mois et le jour séparés par des symboles «-», plus un «T» et l'heure en HH: mm: ss, suivi de +01: 00 à la fin de la chaîne (dans mon cas, le fuseau horaire est +1). Utilisez ensuite cette chaîne comme argument pour le constructeur de date.

//desired format: 2001-02-04T08:16:32+01:00
dateAndTime = year+"-"+month+"-"+day+"T"+hour+":"+minutes+":00+01:00";

var date = new Date(dateAndTime );
Nather Webber
la source
2

Je dois noter que je suis limité quant aux bibliothèques externes que je peux utiliser. moment.js et timezone-js n'étaient PAS une option pour moi.

L'objet js date que j'ai est en UTC. J'avais besoin d'obtenir la date ET l'heure de cette date dans un fuseau horaire spécifique («America / Chicago» dans mon cas).

 var currentUtcTime = new Date(); // This is in UTC

 // Converts the UTC time to a locale specific format, including adjusting for timezone.
 var currentDateTimeCentralTimeZone = new Date(currentUtcTime.toLocaleString('en-US', { timeZone: 'America/Chicago' }));

 console.log('currentUtcTime: ' + currentUtcTime.toLocaleDateString());
 console.log('currentUtcTime Hour: ' + currentUtcTime.getHours());
 console.log('currentUtcTime Minute: ' + currentUtcTime.getMinutes());
 console.log('currentDateTimeCentralTimeZone: ' +        currentDateTimeCentralTimeZone.toLocaleDateString());
 console.log('currentDateTimeCentralTimeZone Hour: ' + currentDateTimeCentralTimeZone.getHours());
 console.log('currentDateTimeCentralTimeZone Minute: ' + currentDateTimeCentralTimeZone.getMinutes());

UTC a actuellement 6 heures d'avance sur 'Amérique / Chicago'. La sortie est:

currentUtcTime: 11/25/2016
currentUtcTime Hour: 16
currentUtcTime Minute: 15

currentDateTimeCentralTimeZone: 11/25/2016
currentDateTimeCentralTimeZone Hour: 10
currentDateTimeCentralTimeZone Minute: 15
recherche27
la source
11
new Date();retourner le fuseau horaire local, pas UTC
Mirko
1
des docs:If no arguments are provided, the constructor creates a JavaScript Date object for the current date and time according to system settings.
Mirko
Hmm. Un peu déroutant. Cela ne change pas le fuseau horaire d'une date; il crée plutôt une nouvelle date avec les heures modifiées. Il serait beaucoup plus clair d'utiliser une expression régulière pour extraire les valeurs souhaitées de la chaîne créée à partir de l'appel toLocaleString.
Gerard ONeill
2

Voici mon code, il fonctionne parfaitement, vous pouvez essayer avec la démo ci-dessous:

$(document).ready(function() {
   //EST
setInterval( function() {
var estTime = new Date();
 var currentDateTimeCentralTimeZone = new Date(estTime.toLocaleString('en-US', { timeZone: 'America/Chicago' }));
var seconds = currentDateTimeCentralTimeZone.getSeconds();
var minutes = currentDateTimeCentralTimeZone.getMinutes();
var hours =  currentDateTimeCentralTimeZone.getHours()+1;//new Date().getHours();
 var am_pm = currentDateTimeCentralTimeZone.getHours() >= 12 ? "PM" : "AM";

if (hours < 10){
     hours = "0" + hours;
}

if (minutes < 10){
     minutes = "0" + minutes;
}
if (seconds < 10){
     seconds = "0" + seconds;
}
    var mid='PM';
    if(hours==0){ //At 00 hours we need to show 12 am
    hours=12;
    }
    else if(hours>12)
    {
    hours=hours%12;
    mid='AM';
    }
    var x3 = hours+':'+minutes+':'+seconds +' '+am_pm
// Add a leading zero to seconds value
$("#sec").html(x3);
},1000);


});
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<p class="date_time"><strong id="sec"></strong></p>
</body>
</html>

Sahil Kapoor
la source
Bienvenue sur StackOverflow! Pouvez-vous fournir plus d'informations sur la façon dont ce code fonctionne et ce qu'il fait? Comment cela résout-il le problème?
DarkSuniuM
Mon code ci-dessus est de mettre à jour votre fuseau horaire vers le fuseau horaire d'autres pays.
Sahil Kapoor
Vous devez mettre le code HTML dans votre fichier html et le code jquery ci-dessus doit être dans le pied de page. Cela fonctionnera pour vous selon ('en-US', {timeZone: 'America / Chicago'}), vous devez mettre à jour ces deux valeurs, si vous voulez le fuseau horaire d'autres pays Merci
Sahil Kapoor
Non attends. J'ai juste voté pour cela sans regarder attentivement. Pourquoi ajoutez-vous 1 à currentDateTimeCentralTimeZone.getHours()? Sans cela, cela fonctionnerait et revient à chercher la réponse de stack27 stackoverflow.com/a/40809160/1404185
chetstone
1

Vous pouvez également essayer cela pour convertir le fuseau horaire de la date en Inde:

var indianTimeZoneVal = new Date().toLocaleString('en-US', {timeZone: 'Asia/Kolkata'});
var indainDateObj = new Date(indianTimeZoneVal);
indainDateObj.setHours(indainDateObj.getHours() + 5);
indainDateObj.setMinutes(indainDateObj.getMinutes() + 30);
console.log(indainDateObj);
Rahul Mankar
la source
1
après la 2e étape elle-même, j'ai le temps en Inde ... alors pourquoi y ajoutez-vous encore 5 heures et demie?
user3833732
Lorsque j'utilise cette méthode, j'obtiens ce qui suit ici en Norvège lorsque je console le journal avec Chrome: Original: jeu 27 septembre 2018 15:53:46 GMT + 0200 (sentraleuropeisk sommertid). Modifié: jeu 27 sept 2018 19:23:46 GMT + 0200 (sentraleuropeisk sommertid). «Sentraleuropeisk sommertid» signifie l'heure d'été d'Europe centrale. Je ne sais pas si cela fonctionnerait lorsque vous avez besoin de l'heure d'été pour l'Inde, ou vice versa lorsque vous êtes en Inde et que vous avez besoin de l'heure d'été pour l'Europe, etc.
Kebman
L'utilisation de setHours () comme celle-ci ne prend pas en compte les transitions jour, mois, année, par exemple 3h30 du matin chez New Dell le 8 est 23h le 7 à Londres. Pensez ensuite à la fin du mois, de l'année et des jours bissextiles. Demandez à Date de faire les calculs <pre> laissez local_time = new Date (zulu_time.getTime () + 3600000 * std_timezone.timezone_factor - 60 * 60 * 1000); let date_str = local_time.toISOString (). slice (0, 10); laissez time_str = local_time.toISOString (). slice (11, -1); laissez timezone_str = std_timezone.timezone_str; </pre>
Lincoln Randall McFarland
1

Après avoir parcouru beaucoup de choses, y compris les liens de cette page, j'ai trouvé cet excellent article, en utilisant le fuseau horaire du moment:

https://www.webniraj.com/2016/11/23/javascript-using-moment-js-to-display-dates-times-in-users-timezone/

Pour le résumer:

Obtenez le fuseau horaire de l'utilisateur

var tz = moment.tz.guess();
console.info('Timezone: ' + tz);

Retours par exemple: Fuseau horaire: Europe / Londres

Définir le fuseau horaire utilisateur par défaut

moment.tz.setDefault(tz);

Définir un fuseau horaire personnalisé

moment.tz.setDefault('America/Los_Angeles');

Convertir la date / l'heure en fuseau horaire local, en supposant que la date / heure d'origine est en UTC

moment.utc('2016-12-25 07:00').tz(tz).format('ddd, Do MMMM YYYY, h:mma');

Retours: dimanche 25 décembre 2016, 7h00

Convertir la date / l'heure en heure de Los Angeles

moment.utc('2016-12-25 07:00').tz('America/Los_Angeles').format('ddd, Do MMMM YYYY, h:mma');

Retours: samedi 24 décembre 2016, 23h00

Convertir de Los Angeles à Londres

moment.tz('2016-12-25 07:00', 'America/Los_Angeles').tz('Europe/London').format( 'ddd, Do MMMM YYYY, h:mma' );

Retour: dimanche 25 décembre 2016, 15h00

omarjebari
la source
1

Vous pouvez également utiliser https://www.npmjs.com/package/ctoc_timezone

Il a une implémentation et une personnalisation de format très simples.

Modification du format dans toTimeZone:

CtoC.toTimeZone(new Date(),"EST","Do MMM YYYY hh:mm:ss #{EST}");

Production :

28th Feb 2013 19:00:00 EST

Vous pouvez explorer plusieurs fonctionnalités dans le document.

Sandeep Chowdary
la source
0

il existe un module npm appelé 'timezones.json' que vous pouvez utiliser pour cela; il se compose essentiellement d'un fichier json avec des objets contenant des informations sur l'heure d'été et le décalage, ....

pour asia / jakarta, il pourrait retourner cet objet:

{
  "value": "SE Asia Standard Time",
  "abbr": "SAST",
  "offset": 7,
  "isdst": false,
  "text": "(UTC+07:00) Bangkok, Hanoi, Jakarta",
  "utc": [
    "Antarctica/Davis",
    "Asia/Bangkok",
    "Asia/Hovd",
    "Asia/Jakarta",
    "Asia/Phnom_Penh",
    "Asia/Pontianak",
    "Asia/Saigon",
    "Asia/Vientiane",
    "Etc/GMT-7",
    "Indian/Christmas"
  ]
}

Vous pouvez le trouver ici:

https://github.com/dmfilipenko/timezones.json

https://www.npmjs.com/package/timezones.json

j'espère que c'est utile

Kevin
la source
0

Les gens familiers avec le java.timepackage java 8 , ou joda-timeadoreront probablement le nouvel enfant sur le bloc: la bibliothèque js-joda .

Installer

npm install js-joda js-joda-timezone --save

Exemple

<script src="node_modules/js-joda/dist/js-joda.js"></script>
<script src="node_modules/js-joda-timezone/dist/js-joda-timezone.js"></script>
<script>
var dateStr = '2012/04/10 10:10:30 +0000';
JSJoda.use(JSJodaTimezone);
var j = JSJoda;
// https://js-joda.github.io/js-joda/esdoc/class/src/format/DateTimeFormatter.js~DateTimeFormatter.html#static-method-of-pattern
var zonedDateTime = j.ZonedDateTime.parse(dateStr, j.DateTimeFormatter.ofPattern('yyyy/MM/dd HH:mm:ss xx'));
var adjustedZonedDateTime = zonedDateTime.withZoneSameInstant(j.ZoneId.of('America/New_York'));
console.log(zonedDateTime.toString(), '=>', adjustedZonedDateTime.toString());
// 2012-04-10T10:10:30Z => 2012-04-10T06:10:30-04:00[America/New_York]
</script>

Dans la vraie nature java, c'est assez verbeux lol. Mais, étant une bibliothèque java portée, en particulier compte tenu du fait qu'ils ont porté des cas de test de 1800 '', cela fonctionne également extrêmement bien.

La manipulation chrono est difficile. C'est pourquoi de nombreuses autres bibliothèques sont boguées dans les cas marginaux. Moment.js semble avoir les bons fuseaux horaires, mais les autres bibliothèques js que j'ai vues, notamment timezone-js, ne semblent pas dignes de confiance.

chèvre
la source
0

Je l'ai récemment fait dans Typescript:

// fromTimezone example : Europe/Paris, toTimezone example: Europe/London
private calcTime( fromTimezone: string, toTimezone: string, dateFromTimezone: Date ): Date {
  const dateToGetOffset = new Date( 2018, 5, 1, 12 );

  const fromTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: fromTimezone, hour12: false } );
  const toTimeString = dateToGetOffset.toLocaleTimeString( "en-UK", { timeZone: toTimezone, hour12: false } );

  const fromTimeHours: number = parseInt( fromTimeString.substr( 0, 2 ), 10 );
  const toTimeHours: number = parseInt( toTimeString.substr( 0, 2 ), 10 );

  const offset: number = fromTimeHours - toTimeHours;

  // convert to msec
  // add local time zone offset
  // get UTC time in msec
  const dateFromTimezoneUTC = Date.UTC( dateFromTimezone.getUTCFullYear(),
    dateFromTimezone.getUTCMonth(),
    dateFromTimezone.getUTCDate(),
    dateFromTimezone.getUTCHours(),
    dateFromTimezone.getUTCMinutes(),
    dateFromTimezone.getUTCSeconds(),
  );

  // create new Date object for different city
  // using supplied offset
  const dateUTC = new Date( dateFromTimezoneUTC + ( 3600000 * offset ) );

  // return time as a string
  return dateUTC;
}

J'utilise le format "en-UK" car il est simple. Aurait pu être "en-US" ou tout ce qui fonctionne.

Si le premier argument correspond à votre fuseau horaire local et que la seconde est votre fuseau horaire cible, il renvoie un objet Date avec le décalage correct.

Alexandre Liscia
la source
0

J'avais du mal à utiliser Moment Timezone . J'ajoute cette réponse juste si quelqu'un d'autre fait face au même problème. J'ai donc une chaîne de date 2018-06-14 13:51:00provenant de mon API. Je sais que cela est stocké dansUTC mais la chaîne ne parle pas d'elle-même.

Je laisse le fuseau horaire du moment savoir de quel fuseau horaire cette date provient en faisant:

let uTCDatetime = momentTz.tz("2018-06-14 13:51:00", "UTC").format();
// If your datetime is from any other timezone then add that instead of "UTC"
// this actually makes the date as : 2018-06-14T13:51:00Z

Maintenant, je voudrais le convertir en un fuseau horaire spécifique en faisant:

let dateInMyTimeZone = momentTz.tz(uTCDatetime, "Asia/Kolkata").format("YYYY-MM-DD HH:mm:ss");
// now this results into: 2018-06-14 19:21:00, which is the corresponding date in my timezone.
Ashish Ranjan
la source
0

Il vous suffit de définir le fuseau horaire de votre pays de désir et vous pouvez facilement l'afficher en HTML en le mettant à jour en utilisant la fonction SetInteval () après chaque minute. format de fonction AMPM () gère le format 12 heures et l'affichage de l'heure AM / PM.

$(document).ready(function(){
        var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
        pakTime = new Date(pakTime);

        var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
        libyaTime = new Date(libyaTime);



         document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
         document.getElementById("ly").innerHTML = "LY   " +formatAMPM(libyaTime);

        setInterval(function(today) {
            var pakTime = new Date().toLocaleString("en-US", {timeZone: "Asia/Karachi"});
            pakTime = new Date(pakTime);

            var libyaTime = new Date().toLocaleString("en-US", {timeZone: "Africa/Tripoli"});
            libyaTime = new Date(libyaTime);


           document.getElementById("pak").innerHTML = "PAK  "+formatAMPM(pakTime);
           document.getElementById("ly").innerHTML = "LY  " +formatAMPM(libyaTime);

        },10000);

         function formatAMPM(date) {
            var hours = date.getHours();
            var minutes = date.getMinutes();
            var ampm = hours >= 12 ? 'pm' : 'am';
            hours = hours % 12;
            hours = hours ? hours : 12; // the hour '0' should be '12'
            minutes = minutes < 10 ? '0'+minutes : minutes;
            var strTime = hours + ':' + minutes + ' ' + ampm;
            return strTime;
        }


    });
Muhammad Azeem
la source
-1

Je ne connais pas de méthode simple pour convertir un objet de date dans n'importe quel fuseau horaire, mais si vous voulez le convertir en fuseau horaire local, vous pouvez simplement le convertir avec Date.prototype.getTime()le nombre de millisecondes correspondant, et inversement.

date = new Date('2016-05-24T13:07:20');
date = new Date(date.getTime());

Par exemple, date.getHours()reviendra maintenant 15au lieu de 13si vous êtes, comme moi, en Autriche (et c'est l'été).

J'ai lu que les diverses fonctions datetime peuvent présenter un comportement non standard dans certains navigateurs, alors testez d'abord cela. Je peux confirmer que cela fonctionne dans Chrome.

黄 雨伞
la source
1
Pourquoi cela a-t-il été rejeté? C'est de loin la façon la plus simple et la plus efficace de procéder. La plupart des réponses ci-dessus ne prennent pas en compte l'heure d'été / d'hiver
MortenSickel
Quel est l'intérêt de la deuxième ligne? Le constructeur Date suppose déjà votre fuseau horaire local. Ces deux lignes renvoient une date dans le fuseau horaire du navigateur local et ne répondent pas à la question sur la conversion à un autre fuseau horaire avec l'heure d'été.
Chloé
-1

Décalage de fuseau horaire pour votre fuseau horaire actuel

date +%s -d '1 Jan 1970'

Pour mon fuseau horaire GMT + 10 (Australie), il a renvoyé -36000

anthony
la source
-6

Changeur d'heure manuel rapide et sale et retour:

return new Date(new Date().setHours(new Date().getHours()+3)).getHours()
Jerry
la source
trop sale (et trop salissant)
Maxwell sc