web-dev-qa-db-fra.com

Convertir la date en un autre fuseau horaire en JavaScript

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

Il faut 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?

227
Rizky Ramadhan

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

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

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

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

16
Udhaya

Pour moment.js utilisateurs, vous pouvez maintenant 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);
}
122
Brian Di Palma

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

84
Valli69

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

new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })
81
lambinator

Ok, 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
59
Rizky Ramadhan

Je l'ai !

Voulait forcer la date affichée = la 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);
9
Cedric Simon

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 "Indian/Christmas" 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"
4
Codemaker

Si vous avez juste besoin de convertir des fuseaux horaires, j'ai chargé une version allégée de moment-timezone avec juste le minimum de fonctionnalités. Ses données ~ 1KB +:

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());
4

Si le format n'est pas très important et que 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. 

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 date = new Date("2012/04/10 10:10:30 +0000")

console.log(formater.format(date))

Les décalages, l'heure d'été et les autres différences modifiées dans le passé seront prises en charge pour vous

Vous pouvez expérimenter avec la langue pour obtenir d'autres littéraux.

4
Endless

Voici mon code, il fonctionne parfaitement, vous pouvez essayer avec 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>

3
Sahil Kapoor

Définissez une variable avec année, mois et jour séparés par des symboles '-', plus un 'T' et l'heure dans le modèle HH: mm: ss, suivis de +01: 00 à la fin de la chaîne le fuseau horaire est +1). Puis utilisez cette chaîne comme argument du 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 );
2
Nather Webber

Après avoir beaucoup regardé autour de moi, y compris les liens de cette page, j’ai trouvé cet article génial, en utilisant le fuseau horaire de moment:

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

Pour résumer:

Obtenir 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 de l'utilisateur par défaut

moment.tz.setDefault(tz);

Définir un fuseau horaire personnalisé

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

Convertir la date/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.

Conversion date/heure en heure locale

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

Retours: le samedi 24 décembre 2016 à 23h00.

Convertir heure de Londres vers Londres

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

Retours: Dimanche 25 décembre 2016 à 15h00.

2
omarjebari

Je dois noter que les bibliothèques externes que je peux utiliser sont limitées. 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 à partir 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 "America/Chicago". La sortie est:

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

currentDateTimeCentralTimeZone: 11/25/2016
currentDateTimeCentralTimeZone Hour: 10
currentDateTimeCentralTimeZone Minute: 15
2
seeking27

Vous pouvez aussi essayer ceci 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);
1
Rahul Mankar

Les personnes familiarisées avec le paquetage Java.time de Java 8, ou joda-time, aimeront probablement le nouvel enfant du 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 de Java, c'est plutôt prolixe lol. Mais, étant une bibliothèque Java portée, en particulier si l’on considère qu’ils portaient 1800 cas de test, elle fonctionnait probablement parfaitement.

La manipulation chrono est difficile. C'est pourquoi de nombreuses autres bibliothèques sont boguées dans les cas Edge. Moment.js semble avoir les fuseaux horaires corrects, mais les autres bibliothèques js que j'ai vues, y compris timezone-js, ne semblent pas fiables. 

1
goat

J'avais du mal à utiliser Moment Timentone . J'ajoute cette réponse 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:00 provenant de ma API. Je sais que cela est stocké dans UTC mais la chaîne ne parle pas d'elle-même.

Je fais savoir au fuseau horaire moment, quel fuseau horaire cette date est de faire:

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 à 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.
1
xyz

il existe un module npm appelé 'timezones.json' que vous pouvez utiliser pour cela; Il consiste essentiellement en un fichier JSON avec des objets contenant des informations sur l'heure avancée et l'offset, ....

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

1
Kevin

J'ai récemment fait cela 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 s'agit d'un format simple. Cela aurait pu être "en-US" ou tout ce qui fonctionne.

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

0
Alexandre Liscia

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.

0
anthony