Convertir une date en un autre fuseau horaire en JavaScript

je cherche une fonction pour convertir la date dans un fuseau horaire à un autre.

il faut deux paramètres,

  • date (en format "2012/04/10 10:10:30 +0000")
  • chaîne de fuseau horaire ("Asie / 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 le faire?

206
demandé sur AstroCB 2012-04-10 15:25:05

18 réponses

pour moment.js utilisateurs, vous pouvez maintenant utiliser moment-fuseau horaire . En l'utilisant, votre fonction ressemblerait à quelque chose comme ceci:

function toTimeZone(time, zone) {
    var format = 'YYYY/MM/DD HH:mm:ss ZZ';
    return moment(time, format).tz(zone).format(format);
}
117
répondu Brian Di Palma 2014-05-06 19:44:17

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

81
répondu Valli69 2016-04-19 09:54:10

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

new Date().toLocaleString('en-US', { timeZone: 'Asia/Jakarta' })
74
répondu lambinator 2017-10-16 17:12:56

OK, 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
62
répondu Rizky Ramadhan 2012-04-16 06:14:19

compris !

voulait forcer la date affichée = Date du serveur, Pas de modification des 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);
8
répondu Cedric Simon 2015-02-17 01:19:51

si vous avez juste besoin de convertir des fuseaux horaires, j'ai téléchargé une version dépouillée de moment-fuseau horaire avec seulement le minimum de fonctionnalité. Ses ~1 + données:

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
répondu Santiago Corredoira 2017-04-22 16:19:53

définit une variable avec l'année, le mois et le jour séparés par les symboles' -', plus un 'T' et L'heure en HH:mm:SS pattern, suivi de +01:00 à la fin de la chaîne (dans mon cas, le fuseau horaire est +1). Puis utilisez 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 );
2
répondu Nather Webber 2016-11-03 19:13:29

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 le bouton "indian/Indien de Noël" et les suivants sont 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"
2
répondu Codemaker 2018-07-10 08:13:17

vous pouvez essayer cela aussi pour convertir date fuseau horaire 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
répondu Rahul Mankar 2016-09-29 07:15:29

je dois noter que je suis restreint en ce qui concerne les bibliothèques externes que je peux utiliser. moment.JS et timezone-js n'étaient pas une option pour moi.

l'objet date js 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 6 heures d'avance sur "America/Chicago". Sortie:

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

currentDateTimeCentralTimeZone: 11/25/2016
currentDateTimeCentralTimeZone Hour: 10
currentDateTimeCentralTimeZone Minute: 15
1
répondu seeking27 2016-11-25 16:26:21

les gens familiers avec le package java 8 java.time , ou joda-time aimeront probablement le nouveau 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 donné qu'il s'agit d'une bibliothèque java portée, surtout si l'on considère les cas de test de 1800'ish, cela fonctionne aussi probablement de façon superbement précise.

la manipulation de Chrono est difficile. C'est pourquoi beaucoup d'autres bibliothèques sont boguées dans les cas extrêmes. Moment.js a l'air d'avoir raison sur les fuseaux horaires, mais les autres libs js que j'ai vu, y compris timezone-js , ne semblent pas dignes de confiance.

1
répondu goat 2017-12-14 00:14:19

si le format n'est pas super important et que vous ne voulez pas importer de grande bibliothèque, vous pouvez simplement utiliser Intl.DateTimeFormat pour convertir les objets Date en différentes 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 Compensations, l'heure d'été, et d'autres diff changé dans le passé, seront pris en charge pour vous

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

1
répondu Endless 2018-04-04 10:02:00

j'avais du mal à utiliser fuseau horaire . J'ajoute cette réponse juste pour que quelqu'un d'autre affronte le même problème. Donc j'ai une chaîne de date 2018-06-14 13:51:00 venant de mon API . Je sais que c'est stocké dans UTC mais la chaîne ne parle pas pour elle-même.

j'ai laissé moment fuseau horaire de savoir, quel fuseau horaire cette date est en train 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 le fuseau horaire 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
répondu Ashish Ranjan 2018-06-06 13:54:04

ayant regardé autour de beaucoup y compris des liens de cette page j'ai trouvé ce grand article, 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 de l'utilisateur du fuseau horaire

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

retourne par exemple: Timezone: Europe / Londres

définit la valeur par défaut fuseau horaire de l'utilisateur

moment.tz.setDefault(tz);

personnaliser le fuseau horaire

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

convertir la date / heure en fuseau horaire local, en supposant que la date/heure originale est en TUC

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

retourne: Dim, 25 décembre 2016, 7:00am

Convertir une date et une heure à LA Fois

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

retourne: Sam, 24 décembre 2016, 23: 00

Convertir LA fois à Londres

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

retourne: Dim, 25 décembre 2016, 15 :00 pm

1
répondu omarjebari 2018-09-13 12:08:46

il y a un module npm appelé 'timezones.json' 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 offset,....

pour asia/jakarta, il serait en mesure de revenir à 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

espère que c'est utile

0
répondu Kevin 2016-07-25 06:04:21

décalage du fuseau horaire pour votre fuseau horaire actuel

date +%s -d '1 Jan 1970'

Pour mes GMT+10 fuseau horaire (Australie), il est retourné -36000

0
répondu anthony 2018-02-15 04:49:47

j'ai récemment fait ceci à la machine à écrire:

// 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 " parce qu'il est simple. Ça aurait pu être "en-US" ou n'importe quoi qui fonctionne.

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

0
répondu Alexandre Liscia 2018-05-29 15:57:14

Je ne connais pas de méthode facile pour convertir un objet date à n'importe quel fuseau horaire, mais si vous voulez le convertir au fuseau horaire local, vous pouvez juste le convertir avec Date.prototype.getTime() au nombre correspondant de millisecondes, et revenir en arrière.

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

par exemple, date.getHours() retournera maintenant 15 au lieu de 13 si vous êtes, comme moi, EN AUTRICHE (et c'est l'été).

j'ai lu que les différentes fonctions datetime peuvent exposition non-standard de comportement dans certains navigateurs, donc à tester en premier. Je peux confirmer qu'il fonctionne en Chrome.

-1
répondu 黄雨伞 2016-05-24 13:22:59