Upgrade to Pro — share decks privately, control downloads, hide ads and more …

フロントエンドで日時処理と戦うために 2025 ver

Saji
February 28, 2025
3.1k

フロントエンドで日時処理と戦うために 2025 ver

JSConf.jp おかわり Node学園46時限目
- https://nodejs.connpass.com/event/344588/
X
- https://twitter.com/sajikix

Saji

February 28, 2025
Tweet

Transcript

  1. ೔࣌ͷදه+4Ͱͷඪ४ϑΥʔϚοτ &$."4DSJQU͸ʮ*40֦ுܗࣜΛ୯७Խͨ͠΋ͷʯΛඪ४ͱͯ͠Δ > ECMAScript de fi nes a string interchange

    format for date-times based upon a simpli fi cation of the ISO 8601 calendar date extended format. The format is as follows: YYYY-MM-DDTHH:mm:ss.sssZ ͭ·Γ*40֦ுܗࣜ㲈3'$㲈+4ͷඪ४ϑΥʔϚοτ w ຊ౰͸શ෦Ϗϛϣʔʹҧ͏͚ͲجຊϋϚΔ͜ͱ͸ͳ͍͸ͣ %BUFQSPUPUZQFUP65$4USJOH Ͱੜ੒Ͱ͖Δ
  2. ʲ༨ஊʳݴޠλάͷ֦ுαϒλά ֦ுαϒλάͬͯԿʁ w <ݴޠ><จࣈମܥ><஍Ҭ><ҟମ><֦ு><ࢲ༻> w ݴޠλάΛ֦ுͰ͖Δߏจ w <จࣈ><dจࣈ>ͱ͍͏ܗࣜ ྫKB+1VDBKBQBOFTF 

    w *&5'͔ΒͷϨϏϡʔΛड͚ͯ*"/"͔ΒׂΓ౰ͯΒΕͨ΋ͷ AYAҎ֎  6֦ு u-Ͱ࢝·Δ΍ͭ ͸6OJDPEF͕؅ཧ͍ͯ͠Δˠ-%.-Λࢀরͷ͜ͱ
  3. ॻࣜԽͷͨΊͷ࢓༷-%.- 654 -%.- -PDBMF%BUB.BSLVQ-BOHVBHF ͱ͸ w 6OJDPEF͕ఆΊ͍ͯΔϩέʔϧ΍ࠃࡍԽʹؔ͢Δ͋ΒΏΔσʔλΛه࿥͢Δ ͨΊͷ౷Ұతͳ9.-ʹΑΔϑΥʔϚοτ w ϩέʔϧࣝผࢠ਺஋೔࣌ͷϑΥʔϚοτෳ਺ܗ΍ং਺ʜ

    ೔࣌ʹؔͯ͠΋ॻࣜԽͷύλʔϯ΍ྐྵͷ৘ใͳͲͷܗࣜΛఆΊͯΔ w Α͘࢖͏1BUUFSOจࣈྻ ZZZZ..EE ͷҙຯͳͲ΋ఆٛͯ͠Δ w ༨ஊ ͜Εʹैͬͯͳ͍ϥΠϒϥϦ΋ͪΒ΄Βʜ
  4. ೔࣌จࣈྻͷύʔεڍಈ͕Θ͔Γʹ͍͘ ༗໊೔෇·Ͱͩͱ65$͚ͩͲ࣌ࠁؚΊΔͱγεςϜͷλΠϜκʔϯʹͳΔ • 2025-02-27 → "Thu Feb 27 2025 09:00:00

    GMT+0900" • 2025-02-27T00:00:00 → "Thu Feb 27 2025 00:00:00 GMT+0900" ࢓্༷໌ه͞Εͯͳ͍͚ͲύʔεͰ͖ͪΌ͏΍ͭ΋͋Δ • RFC 2822ܗࣜ : "Thu Feb 27 2025" • εϥογϡ(/) ۠੾Γ : "2025/02/27"
  5. *OUM%BUF5JNF'PSNBUͰେମͷχʔζ͸ຬͨͤΔ *OUM%BUF5JNF'PSNBUͷॻࣜԽΦϓγϣϯ͕͔ͳΓਐา͍ͯ͠Δ w EBUF4UZMFUJNF4UZMFͰ·ͱΊͯελΠϧࢦఆ w ֤ߏ੒ཁૉ ZFBSNPOUIEBZ ͝ͱʹࡉ͔͘ελΠϧ͕ௐ੔΋Ͱ͖Δ const formatter

    = new Intl.DateTimeFormat('en-US', { year: 'numeric', // ਺஋Ͱදࣔ month: 'long', // ௕͍ܗͰදࣔ day: '2-digit', // 2 ܻͷ਺஋Ͱදࣔ weekday: 'long', // ௕͍ܗͰදࣔ era: 'short' // ୹͍ܗͰදࣔ });
  6. *OUMʹGPSNBU5P1BSUT ϝιου΋͋Δ ߏ੒ཁૉ͝ͱͷ഑ྻͱͯ͠ग़ྗͯ͘͠ΕΔ Ͳ͏ͯ͠΋GPSNBUϝιουͰ໨తͷจࣈྻ͕ग़ͳ͍৔߹ w GSPNBU5P1BSUTϝιουˠҰ෦ॻ͖׵͑ˠWBMVFΛKPJOˠ໨తͷจࣈྻ new Intl.DateTimeFormat("ja-JP").formatToParts(new Date(2024, 11,

    7)); // [ // { "type": "year", "value": "2024" }, // { "type": "literal", "value": "/" }, // { "type": "month", "value": "12" }, // { "type": "literal", "value": "/" }, // { "type": "day", "value": "7" } // ]
  7. ʲ༨ஊʳ1BUUFSOʹΑΔॻࣜԽͷޭࡑ ΈΜͳ1BUUFSOจࣈྻ ZZZZ..EE ͰॻࣜԽ͕ͨ͠Δ͚Ͳʜ w 1BUUFSOจࣈྻΛࣗ෼Ͱ؅ཧࠃࡍॻࣜԽػೳΛશ෦ࣗલͰ΍Δ֮ޛ w ͦͷ1BUUFSO͸ਖ਼֬ʁଞϩέʔϧ͸ߟྀͰ͖ͯΔʁϩέʔϧؒͰ౷Ұੑ͋Δ  w

    *OUM͸-PDBMFͱ%BUF͔ΒͳΔ΂͘ద੾Ͱ౷Ұײ͋ΔΑ͏ʹจࣈྻΛબ୒͢Δ ͦΕ΋͋ͬͯ*OUMଆ͸جຊ1BUUFSOॻࣜԽΛରԠ͠ͳ͍ํ਑Λ؏͍͍ͯΔ Ͱ΋΍ͬͺΓࠜڧ͍ʮཉ͍͠ʯͷ੠ w 5FNQPSBMWͰೖΔʜ͔΋Ͷ
  8. ύʔεͷݫ֨Խͱ*9%5' 5FNQPSBM͸ݫີʹ3'$ͱͦΕΛ֦ுͨ͠3'$ͷΈαϙʔτ RFC 3339 : ISO8601ͱ΄΅Ұॹ / toISOString() ͷ݁Ռ •

    "2025-02-27T00:00:00.000Z" 3'$*OUFSOFU&YUFOEFE%BUF5JNF'PSNBU *9%5'  w 3'$ͷλΠϜκʔϯ΍ΧϨϯμʔ৘ใΛ௥ՃͰ͖ΔΑ͏֦ு • "2025-02-27T00:00:00.000Z[Asia/Tokyo][u-ca-japanese]"
  9. 5FNQPSBMͷΞϓϩʔν ֤ΦϒδΣΫτͰ໌֬ʹʮઈର࣌ؒPSϩʔΧϧ೔࣌ʯΛ۠ผ • ઈର࣌ؒ : Temporal.Instant • ϩʔΧϧͳ೔࣌ : Temporal.Plainʓʓ

    • ϩʔΧϧͳ೔࣌ʹ͸͸ΧϨϯμʔΛࢦఆͰ͖Δ ม׵ʹ͸λΠϜκʔϯ৘ใ͕ඞཁˠڮ౉͠ͷͨΊͷΫϥε • Temporal.ZonedDateTime Ͱ૬ޓͷม׵Λߦ͏
  10. ΄΅ɺλΠϜκʔϯͱΧϨϯμʔͱॻࣜԽͷ͍ͤ ೔࣌ͷΊΜͲ͘͞͞Λ෼ղ͢Δͱ w λΠϜκʔϯ ࣌ࠩ ͷܭࢉ͕໘౗ w ΧϨϯμʔ ྐྵ ͷॲཧ͕೉͍͠

    w ࠃࡍԽͰͷॻࣜԽύλʔϯ͕ແ਺ ΈΜͳ͕6OJY5JNF 1PTJY5JNF ͰಡΈॻ͖Ͱ͖ͯΕ͹΍΍͘͜͠͸ͳ͍ w ͚Ͳਓؒ͸ͦ͏͸Ͱ͖͍ͯͳ͍ ࠓ೔ͷ5BML͸͔ΒͩΑʂʂ
  11. ʲະདྷʳ೔࣌ͷ໘౗ࣄˠ5FNQPSBM *OUMͰղܾ ೔࣌ͷෳࡶͩͬͨ෦෼Λ5FNQPSBMͱ*OUMͰΧόʔͰ͖Δະདྷ w λΠϜκʔϯ ࣌ࠩ ͷܭࢉ͕໘౗ˠ5FNQPSBMͷ୲౰ w ΧϨϯμʔ ྐྵ

    ͷॲཧ͕೉͍͠ˠ5FNQPSBMͷ୲౰ w ࠃࡍԽͰͷॻࣜԽύλʔϯ͕ແ਺ˠ*OUMͷ୲౰ ͋Δ͍͸ˢΛ͍͍ײ͡ʹϥοϓͨ͠ϥΠϒϥϦ͕ྲྀߦΔՄೳੑ ˠ͜ͷະདྷΛ৴͡Δ৔߹ɺٯࢉͯ͠Ͳ͏͓ͯ͘͠΂͖ͩΖ͏ʁ
  12. ݱঢ়Ͱͷબ୒ࢶ ݱঢ়͸͜Μͳײ͡ʹ͓ͯ͘͠ͷ͕ྑͦ͞͏ w λΠϜκʔϯ ࣌ࠩ ͷܭࢉ͕໘౗ w ˠϥΠϒϥϦͰؤுΓͭͭɺ5FNQPSBMΛ଴ͭ w ΧϨϯμʔ

    ྐྵ ͷॲཧ͕೉͍͠ w ˠϥΠϒϥϦ΍࣮૷ͰؤுΓͭͭɺ5FNQPSBMΛ଴ͭPSະαϙʔτ w ࠃࡍԽͰͷॻࣜԽύλʔϯ͕ແ਺ˠ*OUM͸΋͏͋ΔͷͰͳΔ΂͘࢖͏