javascript toISOString () ignore le décalage du fuseau horaire
j'essaie de convertir Twitter datetime en une chaîne locale iso (pour prettyDate) maintenant pour 2 jours. Je suis tout simplement pas obtenir l'heure locale de droit..
im utilisant la fonction suivante:
function getLocalISOTime(twDate) {
var d = new Date(twDate);
var utcd = Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(),
d.getMinutes(), d.getSeconds(), d.getMilliseconds());
// obtain local UTC offset and convert to msec
localOffset = d.getTimezoneOffset() * 60000;
var newdate = new Date(utcd + localOffset);
return newdate.toISOString().replace(".000", "");
}
dans newdate tout est ok mais le toISOString() le renvoie à l'époque originale... Est-ce que quelqu'un peut m'aider à obtenir l'heure locale en iso à partir de la Twitterdate formaté comme: Jeudi, 31 Mai 2012 08:33:41 +0000
4 réponses
moment.js
est grand, mais parfois vous ne voulez pas tirer un grand nombre de dépendances pour des choses simples.
Les ouvrages suivants:
var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds
var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, -1);
// => '2015-01-26T06:40:36.181'
le slice(0, -1)
se débarrasse du Z
qui représente le fuseau horaire Zoulou et peut être remplacé par le vôtre.
ma solution sans utiliser le moment est de le convertir en timestamp, ajouter le décalage du fuseau horaire, puis de le convertir à nouveau en un objet date, puis d'exécuter le toISOString ()
var date = new Date(); // Or the date you'd like converted.
isoDate = new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString();
cette fonction date ci-dessous réalise l'effet désiré sans bibliothèque de script supplémentaire. Fondamentalement, il est juste un simple concaténation date component dans le bon format, et l'augmentation du prototype de L'objet Date.
Date.prototype.dateToISO8601String = function() {
var padDigits = function padDigits(number, digits) {
return Array(Math.max(digits - String(number).length + 1, 0)).join(0) + number;
}
var offsetMinutes = this.getTimezoneOffset();
var offsetHours = offsetMinutes / 60;
var offset= "Z";
if (offsetHours < 0)
offset = "-" + padDigits(offsetHours.replace("-","") + "00",4);
else if (offsetHours > 0)
offset = "+" + padDigits(offsetHours + "00", 4);
return this.getFullYear()
+ "-" + padDigits((this.getUTCMonth()+1),2)
+ "-" + padDigits(this.getUTCDate(),2)
+ "T"
+ padDigits(this.getUTCHours(),2)
+ ":" + padDigits(this.getUTCMinutes(),2)
+ ":" + padDigits(this.getUTCSeconds(),2)
+ "." + padDigits(this.getUTCMilliseconds(),2)
+ offset;
}
Date.dateFromISO8601 = function(isoDateString) {
var parts = isoDateString.match(/\d+/g);
var isoTime = Date.UTC(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);
var isoDate = new Date(isoTime);
return isoDate;
}
function test() {
var dIn = new Date();
var isoDateString = dIn.dateToISO8601String();
var dOut = Date.dateFromISO8601(isoDateString);
var dInStr = dIn.toUTCString();
var dOutStr = dOut.toUTCString();
console.log("Dates are equal: " + (dInStr == dOutStr));
}
Utilisation:
var d = new Date();
console.log(d.dateToISO8601String());
J'espère que ça aidera quelqu'un d'autre.
EDIT
problème UTC corrigé mentionné dans les commentaires, et le crédit à Alex pour la fonction dateFromISO8601
.
moment.JS FTW!!!
convertissez votre date en un instant et manipulez-la comme vous voulez:
var d = new Date(twDate);
var m = moment(d).format();
console.log(m);
// example output:
// 2016-01-08T00:00:00-06:00