274 votes

Le moyen le plus court d'imprimer l'année actuelle sur un site Web

Je dois mettre à jour quelques centaines de pages HTML statiques dans lesquelles la date de copyright est codée en dur dans le pied de page. Je veux la remplacer par du JavaScript qui se mettra automatiquement à jour chaque année.

Actuellement, j'utilise :

var year = new Date();document.write(year.getFullYear());

Est-ce que c'est la solution la plus courte possible ?

643voto

T.J. Crowder Points 285826

Des années plus tard, en faisant autre chose, j'ai été rappelé que Date() (sans new) renvoie une chaîne, et une manière qui est un caractère plus courte que mon original ci-dessous est venue à moi:

document.write(/\d{4}/.exec(Date())[0])

La première séquence de quatre chiffres dans la chaîne de Date() est spécifié comme étant l'année. (Ce comportement n'était pas spécifié - bien que courant - lorsque ma réponse originale ci-dessous a été postée.)

Bien sûr, cette solution n'est valable que pour encore 7 979 ans (en 2021), car à partir de l'année 10000, elle affichera "1000" au lieu de "10000".


Vous avez demandé une solution JavaScript, voici la forme la plus courte que j'ai pu obtenir:

document.write(new Date().getFullYear())

Cela fonctionnera dans tous les navigateurs que j'ai utilisés.

Comment j'en suis arrivé là:

  • Vous pouvez simplement appeler getFullYear directement sur le nouveau Date créé, pas besoin d'une variable. new Date().getFullYear() peut sembler un peu bizarre, mais c'est fiable: la partie new Date() est effectuée en premier, puis le .getFullYear().
  • Vous pouvez supprimer le type, car JavaScript est le langage par défaut; cela est même documenté dans la specification HTML5, qui décrit probablement ce que les navigateurs font déjà dans ce cas.
  • Vous pouvez omettre le point-virgule à la fin pour un caractère supplémentaire sauver, car JavaScript a "l'insertion automatique de point-virgule," une fonctionnalité que je déteste normalement et contre laquelle je proteste, mais dans ce cas spécifique, il devrait être assez sûr.

Il est important de noter que cela ne fonctionne que sur les navigateurs où JavaScript est activé. Idéalement, cela serait mieux géré comme une tâche en batch hors ligne (script sed sur *nix, etc.) une fois par an, mais si vous préférez la solution JavaScript, je pense que c'est aussi court que possible. (Maintenant, j'ai tenté le destin.)


Cependant, sauf si vous utilisez un serveur qui peut uniquement fournir des fichiers statiques, vous feriez probablement mieux de le faire sur le serveur avec un moteur de template et en utilisant des en-têtes de mise en cache pour permettre à la page résultante d'être mise en cache jusqu'à ce que la date n'ait besoin de changer. De cette façon, vous n'avez pas besoin de JavaScript côté client. Utiliser une balise script non-defer/async dans le contenu retarde également brièvement l'analyse et la présentation de la page (pour exactement cette raison: car le code dans le script pourrait utiliser document.write pour afficher du HTML).

2 votes

En 2019, il réécrit tout le contenu de la page. Est-ce que j'ai oublié quelque chose?

4 votes

@SystemsRebooter - Vous ne pouvez utiliser document.write que pour du contenu en ligne pendant la phase d'analyse initiale (comme indiqué ci-dessus, dans une balise ... - ou dans un fichier .js chargé avec une balise script sans defer ou async). Une fois que la page est entièrement analysée, le flux du document est fermé, et l'utilisation de document.write le rouvre -- remplaçant complètement le document par un nouveau. Si vous voulez ajouter une année après que l'analyse principale soit terminée, vous devez utiliser le DOM. (Ce n'est pas un changement, ça a toujours été comme ça.)

1 votes

Notez qu'en 2020, la réponse est vraiment "utilisez un moteur de template qui possède un processeur CLI et placez une balise de template dans vos fichiers". Document.write avait encore du sens il y a 10 ans, de nos jours il vaut mieux le laisser aux annales de l'histoire.

48voto

Adam Milecki Points 1428

La réponse de TJ est excellente mais j'ai rencontré un scénario où mon HTML était déjà rendu et le script document.write écraserait tout le contenu de la page avec juste l'année de la date.

Pour ce scénario, vous pouvez ajouter un nœud texte à l'élément existant en utilisant le code suivant :

    ©

        document.getElementById('copyright').appendChild(document.createTextNode(new Date().getFullYear()))

    Nom de l'entreprise

0 votes

Oui - une bonne solution! Je recommande de déplacer le morceau de script juste avant la balise de fermeture du corps ou vers votre autre js à la fin du corps html.

1 votes

createTextNode() ne interprete pas le html commecomment créer un nœud avec du HTML ?

26voto

Martin Adams Points 1

Si vous souhaitez inclure une période de temps à venir, avec l'année en cours (par exemple 2017) comme année de début afin qu'elle apparaisse l'année prochaine comme ceci : "© 2017-2018, Company.", utilisez le code suivant. Il se mettra à jour automatiquement chaque année :

© Copyright 2017new Date().getFullYear()>2017&&document.write("-"+new Date().getFullYear());, Company.

© Copyright 2017-2018, Company.

Mais si la première année est déjà passée, le code le plus court peut être écrit comme ceci :

© Copyright 2010-document.write(new Date().getFullYear()), Company.

17voto

Thomas Kremmel Points 4100
document.write(new Date().getFullYear());

1 votes

Je sais que est plus court (voir autre réponse), mais celui-ci est plus récent et fonctionnera toujours. En fait, j'ai eu une instance dans WP où l'autre ne fonctionnerait pas, mais celui-ci n'était pas un problème. Je ne sais pas pourquoi WP mettrait en cause cela... Je sais qu'aujourd'hui vous pouvez supprimer le ; à la fin et le script se mettra par défaut en js de toute façon, mais quand même.</x-turndown>

14voto

Arcanyx Points 754

La solution JS fonctionne très bien mais je vous conseillerais une solution côté serveur. Certains des sites que j'ai vérifiés rencontraient ce problème où la page entière devenait blanche et seule l'année était parfois visible.

La raison en était que document.write écrivait en fait sur l'ensemble du document.

J'ai demandé à mon ami de mettre en place une solution côté serveur et cela a fonctionné pour lui. Le code simple en php

Profitez-en!

2 votes

Votre solution est si simple, mais le problème est que la question est liée à JavaScript

3 votes

Haha! La solution a déjà été donnée lorsque j'ai posté ceci. Pourtant, je voulais que les gens sachent qu'il y a d'autres façons aussi! Espérons que cela aide quelqu'un comme moi à l'avenir!

0 votes

Je suis d'accord avec toi que nous devons chercher des alternatives lorsqu'il n'y a pas de solution avec le même type de réflexion. Sois prudent avec les votes négatifs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X