<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Javascript - In Fine - Le Blog</title>
	<atom:link href="https://blog.infine.com/category/javascript/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.infine.com</link>
	<description>Le blog des technos de demain !</description>
	<lastBuildDate>Thu, 10 Jun 2021 08:20:23 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>

<image>
	<url>https://blog.infine.com/wp-content/uploads/2021/03/cropped-vignette-32x32.png</url>
	<title>Javascript - In Fine - Le Blog</title>
	<link>https://blog.infine.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Manipuler les dates Javascript en 2021</title>
		<link>https://blog.infine.com/manipuler-les-dates-javascript-en-2021-3158?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=manipuler-les-dates-javascript-en-2021</link>
					<comments>https://blog.infine.com/manipuler-les-dates-javascript-en-2021-3158#respond</comments>
		
		<dc:creator><![CDATA[Audrien Fontaine]]></dc:creator>
		<pubDate>Thu, 10 Jun 2021 08:17:04 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=3158</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">4</span> <span class="rt-label rt-postfix">min.</span></span> La manipulation native des dates en Javascript n&#8217;a jamais été chose facile. Tout cela a changé avec l&#8217;arrivé de Moment.js vers 2010 qui a été la première librairie populaire permettant la manipulation simple des dates. Cependant, l’écosystème Javascript à fortement évolué. avec les optimisations (webpack, tree shaking, typescript), et l&#8217;équipe a annoncé la fin de &#8230;</p>
<p>The post <a href="https://blog.infine.com/manipuler-les-dates-javascript-en-2021-3158">Manipuler les dates Javascript en 2021</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">4</span> <span class="rt-label rt-postfix">min.</span></span>
<p>La manipulation native des dates en Javascript n&#8217;a jamais été chose facile. Tout cela a changé avec l&#8217;arrivé de Moment.js vers 2010 qui a été la première librairie populaire permettant la manipulation simple des dates.</p>



<p>Cependant, l’écosystème Javascript à fortement évolué. avec les optimisations (webpack, tree shaking, typescript), et l&#8217;équipe a annoncé la fin de l&#8217;évolution du projet Moment.js au profit d&#8217;alternative plus optimisé.</p>



<p>Avec l&#8217;arrêt de l’évolution de moment.js, cet article à pour but de lister différentes façon de manipuler les dates en 2021.</p>



<span id="more-3158"></span>



<p></p>



<h2 class="wp-block-heading"><strong>L’objet Date n’est pas pratique à utiliser</strong></h2>



<p>Depuis ses débuts, manipuler les dates Javascript est contraignant. L&#8217;objet Date comporte de nombreux défauts, listé dans cette article:</p>



<p><a href="https://maggiepint.com/2017/04/09/fixing-javascript-date-getting-started/">https://maggiepint.com/2017/04/09/fixing-javascript-date-getting-started/</a></p>



<ul><li>Pas de support des timezone autre que le local time et UTC,&nbsp;</li><li>Le comportement du parser de date instable,&nbsp;</li><li>Les objets date sont mutable,&nbsp;</li><li>La mauvaise gestion des heures d’hiver et d’été,&nbsp;</li><li>Computation APIs are unwieldy</li><li>Pas de support du calendrier grégorien</li></ul>



<p>Ajoutons à cela la manipulation des dates qui n&#8217;est pas natif:</p>



<ul><li>additioner/soustraire des unités de temps (date + 3 mois)</li><li>comparer des dates</li><li>formater des distances (il y a un 3 heures&#8230;)</li></ul>



<p>En 2011, Moment.js a contribué à faciliter la manipulation des dates, en fournissant une API complète et une documentation claire couvrant de nombreux cas. Elle a aussi permis à utiliser les timezone.</p>



<p>Moment.js a été construit sur l’écosystème web d’il y a dix ans. Le monde Javascript évoluant très vite (webpack, structures immuables, tree shaking), ainsin que l&#8217;émergence de nouvelle librairie utilisant les optimisations actuelle, Moment.js a été déclaré par ses contributeurs comme un projet legacy et n’est donc plus conseillé pour de nouveau projet. </p>



<p>Des comparatifs sont disponible pour permettre de choisir quelles libraries date utiliser selon ses préférences: </p>



<p><a href="https://github.com/you-dont-need/You-Dont-Need-Momentjs">https://github.com/you-dont-need/You-Dont-Need-Momentjs</a></p>



<p>Nous allons donc voir quelques façons de manipuler les dates en Javascript en 2021.</p>



<h2 class="wp-block-heading">Date-fns</h2>



<p>Date-fns, créé en 2014, propose un ensemble de fonctions (plus de 180 fonctions), a la particularité de manipuler l’objet Date, d’utiliser le paradigme fonctionnel, de supporter le tree-shaking, d’être immutable par nature, et d’être un projet bien maintenu avec de nombreuse étoile github.</p>



<p><a href="https://bestofjs.org/projects/date-fns">https://bestofjs.org/projects/date-fns</a></p>



<p>Le tree-shaking permet de supprimer les fonctions inutiles à la compilation du projet. Si on n’utilise que quelques fonctions, tout le reste est supprimé, permettant de maîtriser le poid du projet (à la différence de moment.js où le tree shaking n&#8217;est pas possible car toutes les fonctions sont groupé dans une instance de l&#8217;objet Moment)</p>



<p>La doc date-fns est complète avec de nombreux exemple&nbsp;</p>



<p><a href="https://date-fns.org/docs/Getting-Started">https://date-fns.org/docs/Getting-Started</a></p>



<p>Voici quelque exemple de manipulation de date avec date-fns</p>



<p></p>



<pre class="wp-block-code"><code class="">Parsing date
parseISO('2020-06-11T09:30:30')
//=&gt; Thu Jun 11 2020 09:30:30

Format date
// Code example
import { format, formatDistance, formatRelative, subDays } from 'date-fns'

format(new Date(2020, 6, 11), 'MM/dd/yyyy')
//=&gt; '11/07/2014'

formatDistance(subDays(new Date(), 3), new Date())
//=&gt; "3 days ago"

formatRelative(subDays(new Date(), 3), new Date())
//=&gt; "last Friday at 7:26 p.m."

formatISO(new Date(2019, 8, 18, 19, 0, 52))
//=&gt; '2019-09-18T19:00:52Z'

// Represent 18 September 2019 in ISO 8601 format, date only:
formatISO(new Date(2019, 8, 18, 19, 0, 52), { representation: 'date' })
//=&gt; '2019-09-18'

// Represent 18 September 2019 in ISO 8601 format, time only (UTC):
formatISO(new Date(2019, 8, 18, 19, 0, 52), { representation: 'time' })
//=&gt; '19:00:52Z'

Manipulate date
// Code example
addDays(new Date(2014, 8, 1), 10)
//=&gt; Thu Sep 11 2014 00:00:00

const result = addBusinessDays(new Date(2014, 8, 1), 10)
//=&gt; Mon Sep 15 2014 00:00:00 (skipped weekend days)


Date-fns also contains tons of conditional helpers well named (isFuture, isSunday, isSameWeek)
// Code example
isBefore(new Date(1989, 6, 10), new Date(1987, 1, 11))
//=&gt; false

isSunday(new Date(2014, 8, 21))
//=&gt; true

var result = isSameWeek(new Date(2014, 7, 31), new Date(2014, 8, 4))
//=&gt; true

isFuture(new Date(2014, 11, 31))
//=&gt; false
</code></pre>



<h2 class="wp-block-heading">Manipuler les dates sans dépendances externes</h2>



<p><span style="font-weight: 400;">Si on ne souhaite pas utiliser de librairie externe, on peut définir son propre fichier utilitaire de date.</span></p>
<p><span style="font-weight: 400;">Le projet 30 second of code propose des snippets de fonctions communes. </span><span style="font-weight: 400;">Sans devoir réinventer la logique, on peut consulter ce site et copier les fonctions intéressante afin de les intégrer dans projet Javascript. </span><a href="https://www.30secondsofcode.org/js/t/date/p/1"><span style="font-weight: 400;">https://www.30secondsofcode.org/js/t/date/p/1</span></a></p>



<pre class="wp-block-code"><code class="">Source: https://www.30secondsofcode.org/js/s/format-duration
const formatDuration = ms =&gt; {
  if (ms &lt; 0) ms = -ms;
  const time = {
    day: Math.floor(ms / 86400000),
    hour: Math.floor(ms / 3600000) % 24,
    minute: Math.floor(ms / 60000) % 60,
    second: Math.floor(ms / 1000) % 60,
    millisecond: Math.floor(ms) % 1000
  };
  return Object.entries(time)
    .filter(val =&gt; val[1] !== 0)
    .map(([key, val]) =&gt; `${val} ${key}${val !== 1 ? 's' : ''}`)
    .join(', ');
};

// EXAMPLES
formatDuration(1001); // '1 second, 1 millisecond'
formatDuration(34325055574);
// '397 days, 6 hours, 44 minutes, 15 seconds, 574 milliseconds'

</code></pre>



<pre class="wp-block-code"><code class="">
Source: https://www.30secondsofcode.org/js/s/is-between-dates
const isBetweenDates = (dateStart, dateEnd, date) =&gt;
  date &gt; dateStart &amp;&amp; date &lt; dateEnd;

// EXAMPLES
isBetweenDates(
  new Date(2010, 11, 20),
  new Date(2010, 11, 30),
  new Date(2010, 11, 19)
); // false
isBetweenDates(
  new Date(2010, 11, 20),
  new Date(2010, 11, 30),
  new Date(2010, 11, 25)
); // true
</code></pre>



<h2 class="wp-block-heading">Temporal, la future solution natif</h2>



<p>Afin de moderniser la manipulation natives des dates, l’équipe de TC39 formalise une nouvelle spécification, sous le nom de Temporal, qui sera intégré nativement dans les moteurs Javascript, sans librairie externe.</p>



<p><a href="https://tc39.es/proposal-temporal/docs/index.html">https://tc39.es/proposal-temporal/docs/index.html</a></p>



<p></p>



<pre class="wp-block-code"><code class="">// On peut sélectionner la date, l'heure ou les deux
 const date = Temporal.now.plainDateISO().toString();
 =&gt; "2020-04-25"
 const time = Temporal.now.plainTimeISO().toString();
 =&gt; "12:52:48.389968386"
 const dateTime = Temporal.now.plainDateTimeISO().toString();
 =&gt; "2020-04-25T12:52:48.389968386"</code></pre>



<p>Temporal sera un objet global, comme l’objet Math. Comme pour Moment et Date fns, on va retrouver de nombreuses fonctions de création, manipulation et formattage de date.<br><br>De plus, Temporal cherche à combler les défauts de Date, en particulier en donnant plus de flexibilité sur la manipulation des timezone. Pour cela, il existe plusieurs type pour représenter des dates: sans zone (PlainDate, PlainTime, PlainDateTime&#8230;) et avec zone (Instant, ZonedDateTime).</p>



<p>La convertion entre les deux systèmes de date doit se faire avec attention, l&#8217;API Temporal proposant différentes manière pour convertir d&#8217;une date sans zone vers une date avec zone.</p>



<p></p>



<pre class="wp-block-code"><code class="">// Représente une dateTime sans zone
 const dateTime = Temporal.PlainDateTime.from({
   year: 2020,
   month: 04,
   day: 25,
   hour: 12
 });
 =&gt; 2020-04-25T12:00:00
 // Représente une dateTime avec une zone
 const zonedDateTime = Temporal.ZonedDateTime.from({
   // IANA Zone 
   // https://www.iana.org/time-zones
   timeZone: 'America/Los_Angeles',
   year: 2020,
   month: 04,
   day: 25,
   hour: 12
 });
 =&gt; 2020-04-25T12:00:00-07:00[America/Los_Angeles]
 // Représente un Instant zoné dans le temps
 Temporal.Instant.from("2020-04-25T12:52:48Z")
 =&gt; 2020-04-25T12:52:48Z
 // Convertir une date sans zone à une date zoné
 dateTime.toZonedDateTime('Asia/Seoul')
 =&gt; 2020-04-25T12:00:00+09:00[Asia/Seoul]
 // Convertir une date zoné vers une date sans zone
 Temporal.PlainDateTime.from(zonedDateTime)
 =&gt; 2020-04-25T12:00:00</code></pre>



<p>A ce jour (Mai 2021), Temporal est en Stage 3, en cours d&#8217;implémentation dans les différents moteurs Javascript (Navigateur web, nodejs&#8230;)<br><br>De nombreux autres exemples sont disponible sur le cookbook (sur Chrome ou Edge, vous pouvez ouvrir Dev tools et utiliser l’objet Temporal directement depuis la console)</p>



<p><a href="https://tc39.es/proposal-temporal/docs/cookbook.html">https://tc39.es/proposal-temporal/docs/cookbook.html</a></p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Moment.js est maintenant considéré comme obsolète pour les nouveaux projets. En remplacement, on peut utiliser date-fns pour le côté fonctionnel, et il existe d’autre librairie (luxon, dayjs) selon le style de programmation préféré. Il est également possible d&#8217;utiliser des sites de snippets pour copier les fonctions de manipulation de date sans dépendre d’une librairie externe. Mais tout cela sera rendu obsolète avec l&#8217;arrivé de Temporal proposé par TC39, actuellement en stage 3. Temporal sera donc nativement supporté par les moteurs Javascript (navigateur et node.js)</p><p>The post <a href="https://blog.infine.com/manipuler-les-dates-javascript-en-2021-3158">Manipuler les dates Javascript en 2021</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/manipuler-les-dates-javascript-en-2021-3158/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>infine@Devoxx : Javascript pour les javamen</title>
		<link>https://blog.infine.com/infinedevoxx-javascript-pour-les-javamen-2636?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=infinedevoxx-javascript-pour-les-javamen</link>
					<comments>https://blog.infine.com/infinedevoxx-javascript-pour-les-javamen-2636#respond</comments>
		
		<dc:creator><![CDATA[Antoine]]></dc:creator>
		<pubDate>Tue, 23 Apr 2013 08:58:17 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[javascript java devoxx]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=2636</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">&#60; 1</span> <span class="rt-label rt-postfix">min.</span></span> Lors de devoxx 2013, Florian nous à fait une présentation dont le succès (la plus grande salle pleine à craquer) montre à quel point javascript  avec lequel tout le monde à &#8220;joué&#8221;, reste méconnu par une grande majorité de javamen. Pourtant avec l&#8217;émergence des derniers frameworks javascript (angular, ember, backbone, knockout &#8230;), on ne peut &#8230;</p>
<p>The post <a href="https://blog.infine.com/infinedevoxx-javascript-pour-les-javamen-2636">infine@Devoxx : Javascript pour les javamen</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">&lt; 1</span> <span class="rt-label rt-postfix">min.</span></span><img fetchpriority="high" decoding="async" class="wp-image-2638 alignleft" style="margin-left: 20px; margin-right: 20px;" title="florian_devoxx" src="https://blog.infine.com/wp-content/uploads/2013/04/florian_devoxx1-300x225.jpg" alt="" width="300" height="225" srcset="https://blog.infine.com/wp-content/uploads/2013/04/florian_devoxx1-300x225.jpg 300w, https://blog.infine.com/wp-content/uploads/2013/04/florian_devoxx1-1024x768.jpg 1024w, https://blog.infine.com/wp-content/uploads/2013/04/florian_devoxx1.jpg 1280w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>Lors de devoxx 2013, Florian nous à fait une présentation dont le succès (la plus grande salle pleine à craquer) montre à quel point javascript  avec lequel tout le monde à &#8220;joué&#8221;, reste méconnu par une grande majorité de javamen. Pourtant avec l&#8217;émergence des derniers frameworks javascript (angular, ember, backbone, knockout &#8230;), on ne peut plus faire l&#8217;économie de vraiment se mettre à javascript. Même google avec la mise à l&#8217;écart de GWT, mise sur le développement natif du côté client, qu&#8217;il soit dart ou javascript avec angular &#8230;</p>
<p>Florian, javaman qui s&#8217;est mis à javascript,  aborde lors de cette présentation les pièges qui nous guettent.</p>
<p><a href="http://parleys.com/play/51572cf7e4b0ffdd7e058b28/chapter0/about">http://parleys.com/play/51572cf7e4b0ffdd7e058b28/chapter0/about</a></p>
<p><iframe src="https://www.slideshare.net/slideshow/embed_code/17918206" width="600" height="489" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe><br/></p><p>The post <a href="https://blog.infine.com/infinedevoxx-javascript-pour-les-javamen-2636">infine@Devoxx : Javascript pour les javamen</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/infinedevoxx-javascript-pour-les-javamen-2636/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
