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

日付四方山話

Avatar for gallu gallu
April 23, 2025

 日付四方山話

Avatar for gallu

gallu

April 23, 2025
Tweet

More Decks by gallu

Other Decks in Technology

Transcript

  1. 1.日付のフォーマットは?  Atom (例: 2005-08-15T15:52:01+00:00)  HTTP Cookie (例: Monday,

    15-Aug-2005 15:52:01 UTC)  ISO-8601 (例: 2005-08-15T15:52:01+0000)  RSS (例: Mon, 15 Aug 2005 15:52:01 +0000)  World Wide Web Consortium (例: 2005-08- 15T15:52:01+00:00)  などいろいろありますが……
  2.  さて問題です: 年を2桁で省略するとして  04/05/06 これ、何年何月何日?  🇺🇸 アメリカ: 2006年4月5日に決まってるだろ、当然!

     🇬🇧 イギリス:は?2006年5月4日ですけど?  🇯🇵 日本:えっ……2004年5月6日じゃ……ないんですか?  とりあえず  年は4桁で。二桁省略すんな  日付の区切りはハイフンで。それなら YYYY-MM-DD一択!
  3. 2. ユリウス通日?  年月日、を「1つのint」で表せる!  日付の加減算とかループ処理とか、簡単!!  厳密には「小数をつけて時分秒を表せる」  基準点は「西暦

    -4712年1月1日」  マイナスなんだ……  数値がでかくなるから「修正ユリウス日」ってのもある よ!  ユリウス通日から2,400,000.5を差し引いたもの
  4.  例えば、今日の19:30(2025-04-23 19:30:00)だと  ユリウス通日: 2,460,788.93750  修正ユリウス日: 60,788.43750 

    PHPだと gregoriantojd() 関数で計算できるよ!!  逆にするなら jdtogregorian() も!!  「カレンダー 関数」だから --enable-calendar を指定して PHP をコンパイルする必要があるけどね!!
  5. 3. JDT? JSTじゃなくて?  Japan Standard Time。日本標準時です  日本は、協定世界時(UTC)と比較して 9時間

    進んでいます  基準点は明石市なんですって  JDT? typoでしょ?  いいえtypoではありません  話は少々変わりますが。サマータイムはご存じでしょう か?  聞いている限り「悪名高い」出来事をいろいろと伺います  2018年くらいになんか一瞬「サマータイム」とかお話が出 てきて「……なに言ってけつかるん?」とか思った記憶が
  6.  さて時を遡ること1948年  「夏時刻法」なるものが生えてきました(Wikipedia から引用  夏時刻法(なつじこくほう、昭和23年法律第29号)は、1948年(昭和 23年)4月28日に公布・施行された日本の法律。夏時刻を実施するた めに制定されたが、1952年(昭和27年)4月11日に廃止された。 

    適用時間(こちらもWikipedia から引用  1948年(昭和23年) - 五月の第一土曜日の翌日(日曜日)(5月2日) から九月の第二土曜日(9月11日)まで (附則第二項)  1949年(昭和24年) - 四月の第一土曜日の翌日(日曜日)(4月3日) から九月の第二土曜日(9月10日)まで (本則)  1950年(昭和25年) - 五月の第一土曜日の翌日(日曜日)(5月7日) から九月の第二土曜日(9月9日)まで (改正法)  1951年(昭和26年) - 五月の第一土曜日の翌日(日曜日)(5月6日) から九月の第二土曜日(9月8日)まで (改正法)
  7.  この「恐怖の刻限」に使われていたのが、JDTでございま す  Japan Daylight-saving Time の略だそうで  サザエさん(漫画)にも、「サンマータイム」って呼称で「時

    計を進める」ネタが出ております  あと「処理済みフラグの大切さ」がわかるネタでもあります(笑  もし。あなたが。 万が一、1948年から1951年の間の夏頃の日付を扱うと き。もしかしたら、もしかしたら、JDTという亡霊に、遭遇 できる、かもしれません……
  8. 4. 2000年問題を懐古する  Y2K問題とか略称までありました懐かしい(吐血  昔は「1バイト」のメモリが今よりとても重要で貴重なので ございました(吐血  だから「19xx年」の頭の19とか不要だし無駄なわけでご ざいます(吐血

     1980年なら 80 でいいじゃん表示するときに頭に19つけ ればいいんだよ文字列脳(1900を足す、というint脳もござ いました) (吐血  これで1000レコードあったら2000バイトも省略できるんで すスバラシイ!!! (吐血  COPY句だと「05 YY PIC 99.」とか書いてたものです
  9.  時は流れて……あれ、いつ頃から騒がれ始めたんです かねぇ? 1990年くらいにはあちこちで「対応する!!」なお話 が出ていたようには伺ってるんですが  「年二桁」が二桁で桁溢れすると激マズいでございます  1999年の次が1900年になりかねない!! 

    というわけで1990年代後半とか「駆け込み対応」とか  最悪「停電/水道の停止」「医療関連機器の停止等」「金 融系(銀行とか)の誤作動」まで想起される、ってんで必死 でございました  割と無事だったのは皆様の血と涙と汗と怒号と残業の成 果かと思われます(関係者各位、お疲れ様でした
  10. 5. 「一ヶ月後」の危険性  「一ヶ月後」、strtotimeなら簡単でございます  echo date(DATE_ATOM, strtotime('+1 month')), "¥n";

     DateTimeだったらこの通り  echo new DateTime()->add(new DateInterval('P1M')) ->format(DateTimeInterface::ATOM), "¥n";  今をときめくCarbonだったらこの通り  echo Carbon::now()->addMonths(1)->toAtomString() , "¥n";  簡単らくちん。  で終わるんならこんなパワポ作ってません
  11.  さて質問「1月31日の一ヶ月後」は?  ↓ echo date(DATE_ATOM, strtotime('2025-01-31 +1 month')), "¥n";

    echo new DateTime('2025-01-31')->add(new DateInterval('P1M')) ->format(DateTimeInterface::ATOM), "¥n"; echo new Carbon('2025-01-31')->addMonths(1)->toAtomString() , "¥n"; echo new Carbon('2025-01-31')->addMonth()->toAtomString() , "¥n"; 2025-03-03T00:00:00+09:00 2025-03-03T00:00:00+09:00 2025-03-03T00:00:00+09:00 2025-03-03T00:00:00+09:00
  12.  割ときれいさっぱり全滅でございます  ここで燦然と輝くのが Carbon の addMonthsNoOverflow  echo new

    Carbon('2025-01-31') ->addMonthsNoOverflow(1)->toAtomString() , "¥n"; ↓  2025-02-28T00:00:00+09:00  素晴らしいでございます!!!!  ……続くよ
  13. 6. 昭和100年問題  古き良き時代、昭和  いやそうじゃなくて  古いんだけどあんまりよくないネタ「昭和100年問題」  ただ思ったほど起爆しませんでしたねぇ

     古い頃は「1バイトが貴重」でございました(Y2Kでやった  日本は割と「和暦」でデータを持つところもございました  昭和なら2桁(2バイト)あれば余裕じゃんヤッタネ!!  「平成から令和」と違い、「昭和から平成」は、割とどった んばったんした頃合いでございました  詳しく書くと不敬になりそうなんで適宜ググってください
  14. 7. 2038年問題  桁があふれる問題シリーズ、当面のラストでございます  さてコンピュータ内部では「UNIXタイム」で時刻をカウント しております  いろいろな呼び名があるよねぇ 

    1970-01-01 00:00:00 が起点でございます  おいちゃんの生まれ年なんで個人的には覚えやすい(笑  2025-04-23T19:30:00+0900 は 1,745,404,200 です(17億……)
  15.  お話はそれますが、元々の(C言語の)intのサイズは様々 でございます  おいちゃんが昔の頃は16bitとかございました(笑  signedで、最大が 32,767 でございます 

    世の中は64bitが多ございますが、まだ32bitも健在かと 存じ上げます  32bit signed で 2,147,483,647(21億ちょい)  64bit signed で 18,446,744,073,709,551,615(1844京ってなに?
  16.  さて、日本で例えば 2038年1月19日12時14分6秒 なの ですが。strtotimeを使って計算をしてみますと  2,147,483,646  2,147,483,647(参考: 32bit

    signed 最大値  はて?  なお「桁あふれ」すると(PHPと違って)オーバーフローす るので「ものすごいマイナスの値」になります  PHPはfloatになりますよね(それも凄い仕様かと思いますが)  というわけで、1900年くらいにいきなり日付が「バック・ トゥ・ザ・フューチャー」します!
  17. 8. MySQLの日付問題  とりあえずMySQL使ってるなら「timestamp使うな datetime使え」ってお話から  理由は「2038年問題に引っかかるから」  きれいな前振りだったともいえる(笑 

    「TIMESTAMP データ型は、日付と時間の両方の部分を含む 値に使用されます。 TIMESTAMP には、'1970-01-01 00:00:01' UTC から '2038-01-19 03:14:07' UTC の範囲があり ます。」 by MySQLのマニュアル
  18.  もう一つやっかいなのが「タイムゾーンが保持できない」 問題  PostgreSQLは(データ型にもよるが)持てるんだ  いや「日本でしか使わない」サービスなら基本さほど問 題ないんですが  時々「タイムゾーンUTC」のまま運用していて、create_atとか

    が謎い時間になっていて……なんてことが検閲削除  「複数のタイムゾーンにまたがる」サービスの時とか、面 倒が深いんですよねぇ  真っ当にいくなら「UTCにして保存」「出力は適宜」  個人的には「BIGINT型にしてUNIX時間」をやってみたい(笑
  19.  さて不定時報を「PHPで組みたいなぁ」と思ってたら、面 白い関数を教わりました  date_sunrise(): 指定した日付と場所についての日の出時刻を 返す  date_sunset():指定した日付と場所についての日の入り時刻を 返す

     疑問: なぜ標準で存在している? (笑  「日付・時刻 関数」なんで「PHP コアに含まれるため、 追加の インストール無しで使用できます。」(笑
  20.  なお「PHP 8.1.0 で 非推奨 になります」とのことです  でも安心  date_sun_info():日の出/日の入り時刻と薄明かり

    (twilight) の開始/終了時刻の情報を含む配列を返す  なんかパワーアップした(笑  というわけで皆さんも「不定時法」のコードを気軽に書い てみましょう!!