Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Temporalはなぜ必要なのか
Search
fuku
January 29, 2024
Technology
66
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Temporalはなぜ必要なのか
fuku
January 29, 2024
More Decks by fuku
See All by fuku
これからの時代に向けて RSCを使いこなす
akito_fukuda
0
35
Other Decks in Technology
See All in Technology
Post AI時代のリファクタリング実践記 / Refactoring in the post AI era
kaminashi
1
230
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
920
Conditional PED-ANOVA: Hyperparameter Importance in Hierarchical & Dynamic Search Spaces
pfn
PRO
0
130
M5Stackで作る BLEマウス GPSログの世界
tomokusaba
0
420
Classmethod Company Deck
satoshi7
1
680
SAENM ~Jupyterで残すPoCの試行錯誤、未来の自分と仲間を助ける記録!~
terapyon
0
110
子育てエンジニアの可処分時間が減っても成長を諦めない戦い方
sudoakiy
6
4.6k
自作バイナリを動かす「入口」8選
puhitaku
2
1.3k
Rust で関数型ドメインモデリング
takonda
0
140
触りたくないデータに、どう触るか AI時代のRBACアクセスガバナンス
ivry_presentationmaterials
0
260
re:Invent初参加で変わったこと、2回目にやってみたいこと(JAWS-UG彩の国埼玉 #12)
mhrtech
2
220
今さら理解するウェブフォントver.2026
takanorip
3
770
Featured
See All Featured
Navigating Team Friction
lara
192
16k
Practical Orchestrator
shlominoach
192
12k
Exploring anti-patterns in Rails
aemeredith
4
540
Marketing to machines
jonoalderson
1
5.9k
A designer walks into a library…
pauljervisheath
211
25k
エンジニアに許された特別な時間の終わり
watany
109
250k
ラッコキーワード サービス紹介資料
rakko
1
5.3M
Game over? The fight for quality and originality in the time of robots
wayneb77
1
300
The Mindset for Success: Future Career Progression
greggifford
PRO
0
540
Speed Design
sergeychernyshev
33
2.2k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Transcript
Temporalはなぜ必要なのか ふくだ あきと
Temporalとは Temporal は、日付系のグローバルオブジェクトで、Dateの既存の問題を解決するべく 提案されたもの。 現在は stage3 であり、使用するにはPolifillを使用する必要があるが、将来的には標準 APIとしてブラウザなどで提供される。 const nowInstant
= Temporal.Now.instant(); // output: 2023-12-12T14:04:39.123Z ← 現在時刻 const nowPlainDateISO = Temporal.Now.plainDateISO(); // output: 2023-12-14 ← ISO8601のカレンダーからの現在日付
Dateが抱えていた課題 ❏ 0から始まる月のインデックス ❏ タイムゾーンの問題 異なるタイムゾーンで日付などを扱う場合に問題が起きる ❏ 日付文字列パースをする場合に起きる不一致 ブラウザ間での結果に相違がある場合がある ❏
日時以外の扱いにくさ 日付や時間のみや、期間を扱うためのAPIが提供されていない const date = new Date(2023, 11, 4) // output: 2023年12月04日
Temporalの特徴 ❏ サマータイムなどの考慮など、全てのタイムゾーンをサポート ❏ 特定の日時や時刻を明確に表し、日付と時刻が扱いやすいAPIの提供 ❏ 日付文字列が一貫しているため、ブラウザ間での相違がない ❏ さまざまなカレンダーをサポート ❏
乱立したDate系ライブラリのインターフェース統一
Exact Time と Wall-Clock Time ❏ Exact Time とは 国際的な定義を持っており、
UTC という特別なタイムゾーンによって定義される時間のこと。 Unix epoch(1970 年 1 月 1 日の真夜中)からの差分を数値で表すことができる。 ❏ Wall-Clock Time とは サマータイムやタイムゾーンによって影響を受けるようなローカルな時間のこと。 UTC Offset によって定義され、 UTC からどれだけ離れているかを表す。 例えば、日本の場合は、 `+09:00` となる。
TemporalのAPI全体像
Instant Exact Timeを表す。 人にとって読みにくい形式ではないため、他APIを駆使して使用することで、人が読みや すい形式へと変換する。 const instant = Temporal.Instant.from("2023-12-12T00:00:00Z"); //
output: 2023-12-12T00:00:00Z // exact time
ZonedDateTime 日付、時間、タイムゾーンなどを含むクラスで、タイムゾーンなどを含むため、別の値と の演算などを行う場合に適切。 const zonedDateTime = Temporal.ZonedDateTime.from({ year: 2023, month:
12, day: 12, hour: 22, minute: 30, second: 20, timeZone: "Asia/Tokyo", calendar: "iso8601", });// output: 023-12-12T22:30:20+09:00[Asia/Tokyo]
PlainDateTime タイムゾーンに紐づかない Wall-Clockを表す。 日付と時間を扱えるため、それらを扱う場合に適切。 const plainDateTime = Temporal.PlainDateTime.from({ year: 2023,
month: 12, day: 12, hour: 18, minute: 29, second: 9, }); // output: 2023-12-12T18:29:09
Calendar 任意のカレンダーシステムを利用することで、国際化や地域化を行うことができる。計算 などを行う場合に、どのカレンダーシステム(ISO 8601、グレゴリオ歴など)を使うかを指 定したい場合に使用する。 const cal = Temporal.Calendar.from("iso8601"); const
date = cal.dateFromFields({ year: 1999, month: 12, day: 31 }, {}); console.log(date.daysInMonth); // output: 31 console.log(date.monthsInYear); // output: 12 console.log(date.daysInYear); // output: 365
TimeZone IANAタイムゾーンや、特定のUTCオフセット、またはUTC自体を表す。 const timeZone = Temporal.TimeZone.from("Asia/Tokyo"); console.log(timeZone.getInstantFor?.("2023-12-12T00:00:00").toString()); // output: 2023-12-11T15:00:00Z
console.log(timeZone.getPlainDateTimeFor?.("2023-12-12T00:00:00Z").toString()); // output: 2023-12-12T09:00:00
サマータイムから生まれる曖昧性 サマータイムとは、時計の針を1時間進め、1日を23時間とするもの。 では、サマータイムにおける実施中から終了の瞬間はどのようになるか →時間が1時間戻るため、同じ時間が2度繰り返される ⇒これが曖昧性につながる
Temporalにおける曖昧性の解決 一般的に、曖昧性が生まれる瞬間はどのような時か。 ①正確でないソースから Exact Time を作成する場合 ②タイムゾーン定義が永続的に変更される場合
①正確でないソースから Exact Time を作成する場合 '2019-02-19'や'2019-02-19T00:00'といった日付や日時には、オフセット情報が含まれない。 →ブラジルのサンパウロの日時に変更する時に、元の時間がどこの時間かによって、結果が異なる可能 性が生まれる。 これを解決するため、曖昧性が生まれる変換時に disambiguationオプションをつける。これは、タイム ゾーンの正負方向の変化に合わせて
Exact Time を返却する。 これによって、曖昧性を解決する。 // オフセットがわからないので曖昧になる可能性があります! const zdt1 = Temporal.PlainDate.from('2019-02-19').toZonedDateTime('America/Sao_Paulo'); // 曖昧 const zdt2 = Temporal.PlainDateTime.from('2019-02-19T00:00').toZonedDateTime('America/Sao_Paulo'); // 曖昧
②タイムゾーン定義が永続的に変更される場合 タイムゾーンの定義は変更される可能性がある。 こういった場合、古いタイムゾーン定義と新しいタイムゾーン定義がコンフリクトすること がある。
②タイムゾーン定義が永続的に変更される場合 2024-05-28T00:00+09:00[Asia/Tokyo] 誕生日おめでとう 2024年1月28日 そうだ!ふくだくんに 誕生日にメッセージを 送ってあげよう!
②タイムゾーン定義が永続的に変更される場合 2024-05-28T00:00+09:00[Asia/Tokyo] 誕生日おめでとう 2024年1月28日 そうだ!ふくだくんに 誕生日にメッセージを 送ってあげよう! タイムゾーン定義が変更され、 +10:00[Asia/Tokyo]になると...
②タイムゾーン定義が永続的に変更される場合 2024-05-28T00:00+09:00[Asia/Tokyo] 誕生日おめでとう 2024年1月28日 そうだ!ふくだくんに 誕生日にメッセージを 送ってあげよう! 2024年5月27日23:00 タイムゾーン定義が変更され、 +10:00[Asia/Tokyo]になると...
2024-05-28T00:00+09:00[Asia/Tokyo] 誕生日おめでとう あれ! 誕生日祝われた?!(喜)
②タイムゾーン定義が永続的に変更される場合 2024-05-28T00:00+09:00[Asia/Tokyo] 誕生日おめでとう 2024年1月28日 そうだ!ふくだくんに 誕生日にメッセージを 送ってあげよう! 2024年5月27日23:00 タイムゾーン定義が変更され、 +10:00[Asia/Tokyo]になると...
2024-05-28T00:00+09:00[Asia/Tokyo] 誕生日おめでとう ほな、自分とちゃうか 新旧タイムゾーン定義との間でずれが生じる
②タイムゾーン定義が永続的に変更される場合 タイムゾーンの定義は変更される可能性がある。 こういった場合、古いタイムゾーン定義と新しいタイムゾーン定義がコンフリクトすること がある。 →これにより曖昧性が生じる このような問題を解決するために offset オプションを使用する。
Temporalを使う上での注意点 ❏ とはいえ、まだ stage3 ❏ 今まで以上にタイムゾーンを意識する必要がある ❏ まだ周辺ライブラリが十分ではない
まとめ 結論: より「正確」かつより「直感的」に、時間を扱うためにTemporalは必要。 また、Dateにおける使いにくい部分もTemporalでは解決してくれる。 ただタイムゾーンについて、注意しながら使用する必要はあるが、 使いこなせると時間をより便利に使えるようになる。
以上!! 参考文献: https://tc39.es/proposal-temporal/docs/ja/index.html https://tc39.es/proposal-temporal/docs/ja/ambiguity.html https://zenn.dev/coedo/articles/typescript-temporal みんな、ご清聴ありがとうやで!!!