タイムゾーンまわりの日付処理の検証/Node.js 標準テストランナーの素振り
- fix: クラサバのタイムゾーンの相違からHydration Errorが起こる問題 by kyonenya · Pull Request #23 · kyonenya/manuscript
- 【Next.js】SSRとTimezoneについて調べてみた【Day.js】 - kk-web
結論:dayjs を使ってはいけない
- そもそも
dayjs("2022-01-01 00:00:00")
からして副作用関数- 「Day.js は、デフォルトでは、オブジェクトを生成すると、ローカルタイム扱いになります」
.format()
も副作用関数.tz().format()
は参照透過。もちろんtoISOString()
も
- もし dayjs を使うなら
dayjs('ISODateString').tz().format()
とdayjs.tz('withoutTimezone').toISOString()
以外使ってはいけない- しかしこの二つの処理では
.tz()
の意味が別だろ?無理やりメソッドチェーンにするからこんな曖昧な仕様になるんだよ
- しかしこの二つの処理では
- 結局のところ
dayjs
オブジェクトもDate
オブジェクトと欠陥を抱えており、このライブラリには罠が多すぎる- どのメソッドとどのメソッドを組み合わせれば参照透過になるのか、どのメソッドを単体で使うとローカルタイムゾーンという副作用をもつのか、API からまったく見えてこない
- date-fns を使えば全て解決する
- JavaScript: date-fns でタイムゾーンを扱う - Qiita
- この記事以外全部 fake
- タイムゾーンを意識した Day.js オブジェクトの生成 - Qiita
dayjs.tz('2018-01-24T18:53:00+09:00', 'Asia/Tokyo')
は使わないほうがいいとのこと、分かるtz()
はタイムゾーンなし文字列に対してタイムゾーンを付与するもの
- Vercel 環境でタイムゾーンがズレる場合の対処法 | Tech Blog
- 「Date オブジェクトはミリ秒の情報しか保持しておらず……」
- Day.js の.tz.setDefault()が動かないと思ったけど使い方が間違ってただけだった | DevelopersIO
- 「.tz() の引数(='Asia/Tokyo')を省略できるものであり、.tz() 自体は都度呼んであげる必要がある」
特定のディレクトリ内の TypeScript ファイルの Node 組み込みテストランナーを実行するには?· 問題 #3902 · nodejs/help
- ① node-glob の CLI を使った方法
"test": "glob -c \"node --loader tsx --no-warnings --test\" \"./tests/**/*.test.ts\"
- node-test-with-typescript/package.json at main · scottwillmoore/node-test-with-typescript
- CLI - isaacs/node-glob: glob functionality for node.js
- ②「また、追加の依存関係をインストールしたくない非 Windows ユーザー向けの別のソリューションもあります」
"test": "find ./src -name '\*.spec.ts' -exec node --loader @swc-node/register/esm --test {} \\;"
- nodejs/help#3902 (comment)
- ChatGPTによる解説:#1 (comment)
- Node.js の標準 API にテストランナーが追加された
- テストのスキップ - Node.js の標準 API にテストランナーが追加された
- test - npm
- Node.js の assert の小話 - from scratch
- node:assert/strict があるよ、という話
- Node.js コアモジュールの import/require には
node
scheme がつけられる - from scratch - play-ts-using/src/index.ts at main · mizchi/play-ts-using · GitHub
- テスト例
- 0 から調べる--moduleResolution bundler
- サーバーサイドで TypeScript の ESM(ES Modules)プロジェクトを esbuild で bundle する
- tsx を使ってる
- 0 から調べる--moduleResolution bundler
- *.ts 拡張子をそのまま書く方針が使えるようになった - Native ESM + TypeScript 拡張子問題: 歯にものが挟まったようなスッキリしない書き流し
- ESModule かつ TypeScript で Node.js の環境構築を行う - Qiita
- 2022 年度の TypeScript 製 ES Modules レシピ - Qiita
- fake
- Next.js with ESM