時間-日付とJavaScript今日の時間!
Important!: This article as been written almost 2 years ago
Temporal
updated their API and is even more awesome now - Part two of the article coming soon!
彼らのキャリアのいくつかの時点ですべての開発者は、日付と時刻を再生する必要があった場合は幸運です.あなたが旅しているときにのみタイムゾーンに対処する必要がありました.
JavaScriptのコミュニティ&開発者は、独自のライブラリを開発することによって、または瞬間のような一般的なソリューションを使用して、日付のFNSやDayJsの間でさまざまな方法でこれを解決しようとしている.ブログ一覧にもどるFixing JavaScript Date .
「それはまだ私のパッケージにあります。
これらのすべての人々や、これらのライブラリで素晴らしい仕事をしたコミュニティに対して何も持っていない、私はそれが一度にこの長年の問題を解決する標準の一部である解決策を持っている時間だと信じている.代わりに、我々は構築することができます
moment
ブラウザにも.ダニエルEhrenberg
リトルレダン
私の同僚は、JavaScriptの組み込みの日付時刻ライブラリのステージ2 TC 39の提案を一時的に取り組んでいます.NPMのポリフィルを試してみて、フィードバックを与えるために我々の調査に答えてください!twitter.com/therealptomato…
午後7時06分- 2020年7月23日
フィリップ
@ therealptomato
@ bloombergtechと共同で@ igaliaで働いてきたことはここにあります.これはあなたのチャンスを試してみるとフィードバックを与えることです.
https://t.co/Dsalt6mSqh
「時間はここです・・・これは何ですか?」
Timeは新しいステージであり、EcmasScriptの土地に最新の日付/時刻APIをもたらすステージ2に既にある.
At the time of writing there is no browser implementation yet, a polyfill is available at npm, please give it a try and provide feedback.
時間についてのクールなもの?
概要
この概要は、私がプロジェクトで最も使用する機能をカバーします.そして、この概要を通して達成しようとしている目標と非目標を知りたいです.
概略
Temporal
用途
Intentionally no configuration or extra plugins for time zone & locales are used, this is required by some libraries and may affect results that won't be showing accordingly with my time zone(Europe/Madrid) or locale(es-ES).
日付
// Temporal
Temporal.now.date().day;
// moment
moment().date();
// dayjs
dayjs().date();
// date-fns
import { getDate } from 'date-fns';
getDate(new Date());
// => 14 (Current Day)
曜日
// Temporal
Temporal.now.date().dayOfWeek;
// moment
moment().day();
// dayjs
dayjs().day();
// date-fns
import { getDay } from 'date-fns';
getDay(new Date());
// => 2 (Current Day of Week)
追加
// Temporal
Temporal.now.absolute().plus({ days: 7 });
// => 2020-07-22T13:03:01.419163174Z
// moment
moment().add(7, 'days');
// => Wed Jul 22 2020 15:03:24 GMT+0200
// dayjs
dayjs().add(7, 'day');
// => Wed, 22 Jul 2020 13:03:52 GMT
// date-fns
import { add } from 'date-fns';
add(new Date(), { days: 7 });
// => 2020-07-22T13:04:37.366Z
減算する
// Temporal
Temporal.now.absolute().minus({ days: 7 });
// => 2020-07-08T13:07:17.807181419Z
// moment
moment().subtract(7, 'days');
// => Wed Jul 08 2020 15:08:03 GMT+0200
// dayjs
dayjs().subtract(7, 'day');
// => Wed, 08 Jul 2020 13:08:24 GMT
// date-fns
import { sub } from 'date-fns';
sub(new Date(), { days: 7 });
// => 2020-07-08T13:08:54.558Z
差異
const startDate = new Date('1986-07-1');
const endDate = new Date('2020-07-1');
// Temporal
const temporalStart = Temporal.Absolute.from(startDate.toISOString());
const temporalEnd = Temporal.Absolute.from(endDate.toISOString());
const temporalDiff = temporalEnd.difference(temporalStart, {
largestUnit: 'days',
});
console.log(temporalDiff.toString());
// => P12419D (ISO 8601 notation)
// Or `temporalDiff.days`
// => 12419
// moment & dayjs have similar API
const momentStart = moment(startDate);
const momentEnd = moment(endDate);
const momentDiff = momentEnd.diff(momentStart, 'days');
console.log(momentDiff.toString());
// => 12419
// date-fns
import { differenceInDays } from 'date-fns';
differenceInDays(startDate, endDate); //=> -12419
differenceInDays(endDate, startDate); //=> 12419
期間
// Temporal
new Temporal.Duration(0, 0, 0, 0, 23, 59, 59);
Temporal.Duration.from({ hours: 23, minutes: 59, seconds: 59 });
// moment
moment.duration('23:59:59');
moment.duration({ hours: 23, minutes: 59, seconds: 59 });
// dayjs
// => This dependent on `Duration` plugin to work
// .toString() output
// => PT23H59M59S
// => PT23H59M59S
// date-fns
import formatISODuration from 'date-fns/formatISODuration'; // ESM export is not working
formatISODuration({ hours: 23, minutes: 59, seconds: 59 });
//=> P0Y0M0DT23H59M59S
月の日
// Temporal
new Temporal.YearMonth(2020, 2).daysInMonth;
new Temporal.YearMonth(2021, 2).daysInMonth;
// Moment
moment('2020-02', 'YYYY-MM').daysInMonth();
moment('2021-02').daysInMonth();
// DayJS
dayjs('2020-02').daysInMonth();
dayjs('2021-02', 'YYYY-MM').daysInMonth();
// date-fns
import { getDaysInMonth } from 'date-fns';
// https://date-fns.org/v2.14.0/docs/getDaysInMonth
getDaysInMonth(new Date(2020, 1));
getDaysInMonth(new Date(2021, 1));
// Output
// => 29
// => 28
比較する
// Temporal
const t1 = Temporal.Date.from('2020-02-20');
const t2 = Temporal.Date.from('2020-03-21');
Temporal.Date.compare(t1, t2); //=> `−1` if one comes before two;
Temporal.Date.compare(t2, t1); //=> `1` if one comes after two.
Temporal.Date.compare(t2, t2); //=> `0` if one and two are the same;
// moment & dayjs have similar API
const m1 = '2020-02-20';
const m2 = '2020-03-21';
moment(m1).isBefore(m2); // => true
moment(m1).isAfter(m2); // => false
moment(m1).isSame(m1); // => true
// date-fns
import { compareAsc, compareDesc } from 'date-fns';
const fns1 = new Date('2020-02-20');
const fns2 = new Date('2020-03-21');
compareAsc(fns1, fns2); //=> `-1` if the first date is before the second
compareAsc(fns2, fns1); //=> `1` if the first date is after the second
compareAsc(fns2, fns2); //=> `0` if dates are equal.
compareDesc(fns1, fns2); //=> `1` if the first date is before the second
compareDesc(fns2, fns1); //=> `-1` if the first date is after the second
compareDesc(fns2, fns2); //=> `0` if dates are equal.
I 18 N
// Temporal
Temporal.now.date().toLocaleString('es-ES', {
weekday: 'long',
}); // => martes
// moment (only works loading locale strings separately - 4.04 KB)
moment().locale('es-ES').format('dddd'); //=> martes
// dayjs (only works loading locale strings separately - 1.01 KB)
dayjs().locale('es-ES').format('dddd'); //=> martes
// date-fns only works import locale strings separately - no size info)
import { format } from 'date-fns';
import { es } from 'date-fns/locale';
format(new Date(), 'cccc', { locale: es }); //=> martes
総括
第一印象
私が以前書いたようにTemporal
提案はステージ2ですが、すでに非常に良い形です.機能は、使用ケース、日付と時刻、別のカレンダーシステム、タイムゾーンなどでの作業の広いスペクトルをカバーしています.
APIの表面と他のすべてのintlbuilt-in
オブジェクトは、国際化と共にブラウザで日付/時刻を扱うこの長年のジレンマに重要な役割を果たします.
APIはアクセス可能で使いやすく、良いdocumentation .
採用
Temporal
はstandards
そして、TC39 process ECMAScript言語の一部となり、ブラウザで実装されます.
採用は、以下を含むことから始めることができますproposal-temporal
プロジェクトにおけるポリフィルfollowing the instructions .
Voilaaa!これ以上余分な依存関係、これ以上のローディングロケール固有のデータと完全な機能.
ポリフィルを覚えて"...is code that implements a feature on web browsers that do not support the feature..." , 彼らはサポートを行う場合は、ライブラリを使用してからの大きな違いは必要ありません.
note: specification text, documentation and polyfill at time of writing still under development and should be understood non-production ready.
利益と機会
利用者
note: specification text, documentation and polyfill at time of writing still under development and should be understood non-production ready.
Intl
, これは、高品質の日付と時刻の書式設定を提供する多くの言語やオプションstandards
プレゼント
図書館
moment(12.443.725)
, date-fns(6.499.163)
and dayJS(1.941.696)
合計20 m週間のダウンロードは、これは、言語に直接ソリューションを持つ必要性を検証する一方で、これらの数字は、将来の影響について明確な指標ですTemporal
JavaScriptの風景になります.この新しいAPIはまた、あなたの例を持っている既存のものに将来の改善のための基盤を舗装している
Intl.DisplayNames
それはTemporal
さらに多くのオプションを提供するカレンダーread more here ).未来
Temporal
, 前に彼らの前にマラソンが広く受け入れられている、これは我々が知っている基準のほとんどで起こった_.assign()
対Object.assign()
など遷移プロセスは明確に定義された経路を必要とし、それから自然に続く.私はそれらの図書館のために道の終わりを見ません、しかし、より多くの可能性はゴールを達成する感覚です.将来有望な、そして、異なる相乗効果は、この新しい
standard
.ヘルプとフィードバック
決して標準には、音声を持って簡単に、テストによって開始することができますし、ドキュメントを読んでfeedback form または開くことによってGithub issues アイデアやフィードバックを作ることに役立つことができます
Temporal
さらに良い.全体的に、私はいくつかの懸念を持って
Temporal
, 私は問題のトラッカーのような問題に関して私が上げてきた#770 , #772 . JSデイトライブラリから一時的なものへの移行が正確にどのように働くかについて、私には不明瞭なままです.したがって、私は方向を見つけるのを助けるために、時間の問題トラッカーに参加していました.私はあなたがあなたの考えを共有することを望む!👏 すべてのライブラリの著者への功績は、この時間中に我々の背中を維持して
Temporal
それは言語の一部を作るために一生懸命働いているチーム.あなたがこのポストについてあなたが何を考えるかについて知らせてください、そして、私はあなたがそれを楽しんだことを望みます.
私がこの記事をレビューするのを手伝ったすべての人々に感謝します.
Reference
この問題について(時間-日付とJavaScript今日の時間!), 我々は、より多くの情報をここで見つけました https://dev.to/romulocintra/temporal-date-time-in-javascript-today-23cbテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol