Je recherche une fonction pour convertir la date dans un fuseau horaire en un autre.
Il faut deux paramètres,
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?
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
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);
}
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
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' })
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
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);
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"
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());
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.
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>
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 );
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:
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.
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
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);
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.
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.
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
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.
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.