Question

J'ai une page qui utilise actuellement le microformat datetime pour afficher un horodatage. , mais je ne montre que l'heure lisible par l'homme pour mon propre fuseau horaire:

<abbr class="published" title="2009-01-09T09:16:00-05:00">
Friday, January 9, 2009 at 9:16 am (EST)</abbr>

Ce que je voudrais faire est de réécrire innerHTML pour que la balise abbr soit au même format, mais dans le fuseau horaire local de l'utilisateur. Donc, pour un lecteur de Seattle, ce qui précède devrait être converti en:

<abbr class="published" title="2009-01-09T09:16:00-05:00">
Friday, January 9, 2009 at 6:16 am (PST)</abbr>

J'ai consulté le objet Date de Javascript , qui me permet d'obtenir le décalage horaire local. Mais j'ai quelques problèmes:

  1. Je ne vois pas de moyen facile de créer un nouvel objet Date à partir d'un ISO- 8601 horodatage. (Je suppose que je pourrais analyser avec des sous-chaînes ou des regex s'il n'y a pas de moyen plus rapide.)

  2. Je ne vois pas comment obtenir l'abréviation nommée pour le fuseau horaire. Par exemple, pour un lecteur de Seattle, je voudrais avoir le temps d’avoir " (PST) " ajouté à la fin, sinon il n’est pas clair pour cet utilisateur que l’horodatage a été converti (surtout s’il est un visiteur fréquent et s’est habitué au fait que mes temps sont en HNE).

Était-ce utile?

La solution

Voici mon code qui analyse un horodatage ISO:

function isoDateStringToDate (datestr) {
  if (! this.re) {
    // The date in YYYY-MM-DD or YYYYMMDD format
    var datere = "(\\d{4})-?(\\d{2})-?(\\d{2})";
    // The time in HH:MM:SS[.uuuu] or HHMMSS[.uuuu] format
    var timere = "(\\d{2}):?(\\d{2}):?(\\d{2}(?:\\.\\d+)?)";
    // The timezone as Z or in +HH[:MM] or -HH[:MM] format
    var tzre = "(Z|(?:\\+|-)\\d{2}(?:\\:\\d{2})?)?";
    this.re = new RegExp("^" + datere + "[ T]" + timere + tzre + "<*>quot;);
  }

  var matches = this.re.exec(datestr);
  if (! matches)
    return null;

  var year = matches[1];
  var month = matches[2] - 1;
  var day = matches[3];
  var hour = matches[4];
  var minute = matches[5];
  var second = Math.floor(matches[6]);
  var ms = matches[6] - second;
  var tz = matches[7];
  var ms = 0;
  var offset = 0;

  if (tz && tz != "Z") {
    var tzmatches = tz.match(/^(\+|-)(\d{2})(\:(\d{2}))$/);
    if (tzmatches) {
      offset = Number(tzmatches[2]) * 60 + Number(tzmatches[4]);
      if (tzmatches[1] == "-")
        offset = -offset;
    }
  }

  offset *= 60 * 1000;
  var dateval = Date.UTC(year, month, day, hour, minute, second, ms) - offset;

  return new Date(dateval);
}

Malheureusement, il ne gère pas non plus les abréviations de fuseaux horaires. Vous devez modifier le " tzre " expression pour accepter les lettres, et la seule solution que je connaisse pour traiter les abréviations de fuseau horaire en Javascript est de disposer d’une table de correspondance que vous tenez à jour manuellement en cas de modification de l’heure avancée de l’heure.

Autres conseils

EcmaScript a officialisé l’ajout d’une chaîne de style ISO-8601 comme entrée pour une date JavaScript. Comme la plupart des implémentations JS ne prennent pas cela en charge, j'ai créé un wrapper pour l'objet Date, doté de cette fonctionnalité. Si vous définissez les balises de titre pour une sortie en offset UTC / GMT / Z / Zulu, vous pouvez utiliser mon Extensions EcmaScript 5 pour l'objet Date de JS .

Pour les valeurs DateTime devant être utilisées dans les scripts côté client, j'essaie généralement de toujours faire ce qui suit. Stocker la date et l'heure dans la zone UTC (même dans les bases de données). Transmettre les dates et heures dans la zone UTC. De client à serveur, vous pouvez utiliser la méthode .toISOString () dans le lien ci-dessus. De serveur à client, cela est relativement facile.

via jQuery (avec extension):

$('.published').each(function(){
  var dtm = new Date(this.title);
  if (!isNaN(dtm)) {
    this.text(dtm.toString());
  }
});

Je ne me souviens pas si j'ai ajouté le support pour les dates non-utc dans l'entrée, mais je n'aurais pas trop de mal à en rendre compte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top