[RESOLU] Méthode Date Time UTC en Local

Eléphanteau du PHP | 35 Messages

26 déc. 2017, 22:58

Bonjour,
Un membre d'ici, Wolan, m'a créé une extension Google Chrome qui me sert à extraire des données d'une page web.
Chaque instructions étaient auparavant, pour la date, l'heure et le timezone, sous cette forme:
2017-12-27 07:00 CET
désormais elles seront sous cette forme
2017-12-27 06:00 UTC
J'aimerais connaitre si via une checkbox nommée 'Local Time', il serait possible de mettre cette affichage sous cette forme
2017-12-27 07:00 UTC+1
?

J'arrive à générer le "+1" via ce code
var offset = (new Date().getTimezoneOffset())*(-1);
function CltTimeZone(offset) {
var posneg = (offset < 0) ? "-":"+";
var h = Math.trunc( Math.abs(offset) / 60);
if (h == 0){;
return '';
};
var m = ((Math.abs(offset)/60) - h) * 60;
if (m == 0){;
    return posneg+h;
    } else {;
    return posneg+h+':'+m;
    };
};
alert (CltTimeZone(offset));
Mais je pense que je ne m'y prends pas correctement, car je vais devoir gérer les changements d'heures / de jours / de mois et d'années ... ça risque d'être une usine à gaz mon truc ...

J'ai donc continué mes recherches et je suis tombé sur la méthode Intl.DateTimeFormat().
Avec ce code
var CltTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; // Europe/Paris
je suis capable de déterminer le fuseau horaire mais après je l'exploite comment ?
Quelle est la méthode qui serait capable de me générer ce rendu
2017-12-27 07:00 UTC+1
via la variable CltTimeZone qui me retourne Europe/Paris ?

J'ai dans l'idée qu'une regex pourrait extraire ce dont j'ai besoin, je pourrais donc agir dessus, en fonction de la réponse obtenue concernant le fuseau horaire, et une méthode que je ne connais pas pourrait me donner la finalité voulue ...
1-> TimeZone:
var CltTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; // Europe/Paris
2-> Extraction des données à traiter :
(([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{2}:[0-9]{2}) ([A-Z]{3})) // 2017-12-27 06:00 UTC
3-> Modifications de ces données via une méthode
4-> Finalité du traitement :
2017-12-27 07:00 UTC+1
Je suis preneur d'infos et de conseils pour réaliser ce que je souhaite
Merci

Eléphanteau du PHP | 35 Messages

27 déc. 2017, 18:16

J'ai pondu ça ( non sans mal et surement mal écrit ) avec différent bout de codes et mes piètres connaissances ...
Mais ça fonctionne le résultat obtenu est conforme je vous montre
var d = new Date(Date.UTC(2017,11,31,23,30)); //CET
//var d = new Date(Date.UTC(2018,06,31,23,30));//CEST
var o = -d.getTimezoneOffset();
function CltLoc(o){
var s = (o < 0) ? "-":"+";
var h = Math.trunc( Math.abs(o) / 60);
if (h == 0) {return ''}
var m = ((Math.abs(o)/60) - h) * 60;
if (m == 0) {return s + h} else {return s + h + ':' + m}
};
var clt_d = (d.getFullYear() + "-" + ("0"+ (d.getMonth()+1)).slice(-2) + "-" + ("0" + d.getDate()).slice(-2) + " " + ("0" + d.getHours()).slice(-2) + ":" + ("0" + d.getMinutes()).slice(-2)) + " " + "UTC" + CltLoc(o);
alert (clt_d);
Voyez vous des erreurs ou des choses mal écrites ?
Avez vous une autre façon d'arriver à ce résultat ?

Y'a t'il une écriture de tout ce code qui pourrait n'être qu'une fonction à laquelle il faudrait envoyer les données suivantes (2017,11,31,23,30) de ce faite la fonction pourrait convertir à la lecture avant l'affichage dans le tableau.

Merci

Eléphanteau du PHP | 35 Messages

28 déc. 2017, 03:48

J'ai trouvé ça donne ceci :
var d_utc = [2018,2,25,00,59];

function CltLOC (d_utc) {
var d = new Date(Date.UTC.apply(null, d_utc));
var o = -d.getTimezoneOffset();
var s = (o < 0) ? "-":"+";
var h = Math.trunc( Math.abs(o) / 60);
var H = (h == 0) ? " " : h;
var m = ((Math.abs(o)/60) - h) * 60;
var M = (m == 0) ? (s + H) : (s + H + ':' + M);
var YearLoc = d.getFullYear();
var MonthLoc = ("0"+ (d.getMonth()+1)).slice(-2);
var DayLoc = ("0" + d.getDate()).slice(-2);
var HoursLoc = ("0" + d.getHours()).slice(-2);
var MinutesLoc = ("0" + d.getMinutes()).slice(-2);
return YearLoc + "-" + MonthLoc + "-" + DayLoc + " " + HoursLoc + ":" + MinutesLoc + " " + "UTC" + M;
};
alert (CltLOC(d_utc))
En revanche si j'ajoute "use strict" y'a plus rien qui fonctionne ... je suppose que c'est toujours aussi mal écrit, comment je peux améliorer ça ?
Merci

Eléphanteau du PHP | 35 Messages

28 déc. 2017, 11:21

J'ai trouvé :
"use strict";

var d_utc = [2018,2,25,0,59]; //CET -> CEST in 1 min
//var d_utc = [2018,2,25,1,0]; //CEST OK
//var d_utc = [2018,9,28,0,59]; //CEST -> CET in 1 min
//var d_utc = [2018,9,28,1,0]; //CET OK

function CltDTZ (d_utc) {
var d = new Date(Date.UTC.apply(null, d_utc));
var o = -d.getTimezoneOffset();
var s = (o < 0) ? "-" : "+";
var h = Math.trunc( Math.abs(o) / 60);
var mh = (h == 0) ? "" : s + h;
var m = ((Math.abs(o) / 60) - h) * 60;
var hm = (m == 0) ? mh : s + h + ':' + m;
var Y = d.getFullYear();
var M = ("0"+ (d.getMonth() + 1)).slice(-2);
var D = ("0" + d.getDate()).slice(-2);
var HH = ("0" + d.getHours()).slice(-2);
var MM = ("0" + d.getMinutes()).slice(-2);
return Y + "-" + M + "-" + D + " " + HH + ":" + MM + " " + "UTC" + hm;
};
alert (CltDTZ(d_utc)); //2018-03-25 01:59 UTC+1