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

日付四方山話

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
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) の開始/終了時刻の情報を含む配列を返す  なんかパワーアップした(笑  というわけで皆さんも「不定時法」のコードを気軽に書い てみましょう!!