この手のコードはAIがシャシャッと書いてくれる時代。
あ、冒頭はAIのコード貼ってるけど、本題はそこじゃないです。序盤は適当に流してください。本文書こうと思ったら「それAIでよくね?」と脳内で囁かれたので、添えただけ。
いくつか生成
ChatGPTさんに雑に投げてみます。「今年の何%が経過したかを求めるコードをJavaで書いてください」と。
こちらが Java で今年が何%経過したかを求めるコードです!
LocalDate today = LocalDate.now();
LocalDate startOfYear = LocalDate.of(today.getYear(), 1, 1);
LocalDate endOfYear = LocalDate.of(today.getYear(), 12, 31);
long daysPassed = ChronoUnit.DAYS.between(startOfYear, today);
long totalDays = ChronoUnit.DAYS.between(startOfYear, endOfYear) + 1;
double percentage = (daysPassed * 100.0) / totalDays;
System.out.printf("今年の%.2f%%が経過しました。\n", percentage);
まぁ動く。
他のモデル
JetBrains AIではいくつか使えるので、GPT-4o、Claud 3.5 Sonnet、Gemini Pro 1.5に投げてみます。
モデルを変えると口調も変わるのは面白いです。
GPT-4oはGhatGPTとほぼ同じだったので省略。
Claud 3.5 Sonnet
Javaで今年の経過率を計算するコードを提供いたします。うるう年も考慮した、より正確なバージョンを作成しました:
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class YearProgress {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
int year = today.getYear();
LocalDate start = LocalDate.of(year, 1, 1);
LocalDate end = LocalDate.of(year, 12, 31);
long totalDays = ChronoUnit.DAYS.between(start, end) + 1;
long daysPassed = ChronoUnit.DAYS.between(start, today) + 1;
double percentage = (double) daysPassed / totalDays * 100;
System.out.printf("今年の経過パーセンテージ: %.2f%%%n", percentage);
}
}
その +1 ってうるう年対応なの……?
Gemini Pro 1.5
かしこまりました。Javaで今年の経過パーセンテージを計算するコードを、シンプルさと正確さを両立させて記述しました。
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
public class YearProgress {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime startOfYear = LocalDateTime.of(now.getYear(), 1, 1, 0, 0, 0);
LocalDateTime endOfYear = LocalDateTime.of(now.getYear(), 12, 31, 23, 59, 59, 999999999);
double totalNanos = ChronoUnit.NANOS.between(startOfYear, endOfYear);
double elapsedNanos = ChronoUnit.NANOS.between(startOfYear, now);
double percentage = (elapsedNanos / totalNanos) * 100;
System.out.printf("今年は %.6f%% 経過しました。%n", percentage);
System.out.println("現在時刻: " + now.format(java.time.format.DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒")));
System.out.println("年初からの経過時間: " + String.format("%,d", elapsedNanos) + " ナノ秒");
System.out.println("今年の総時間: " + String.format("%,d", (long)totalNanos) + " ナノ秒");
}
}
ナノ秒ときた。
日数とは指定してないからまぁうんって感じではあるが、うん。
irof
自分をこの枠に入れるなと。 聞く前にjshellで書いてました。
(LocalDate.now().getDayOfYear() * 100) / LocalDate.now().with(TemporalAdjusters.lastDayOfYear()).getDayOfYear()
このブログ書こうとしたのがふと「今年何日経ったっけ?」で。
このポストをするために "%d/%d".formatted(LocalDate.now().getDayOfYear(), LocalDate.now().with(TemporalAdjusters.lastDayOfYear()).getDayOfYear())
を書いてから「これくらいのはもう人間が書くものじゃないんだよなぁ」と思いながら冒頭に行った感じです。
本文
生成AIの生成したものを貼って終わりにするのも一興なのかもだけど、見ながらコメント書いたら全然違うのになるのよね。過去のブログとか入力して「私の書きそうなこと書いて」ってやったらできるのかもしれないけど、趣味だから書かせてほしいです。そのうちこう言うの書いても「AIでいいじゃん」って言われそう。ままならないね。
TemporalAdjuster
TemporalAdjuster
さんとか with
メソッドとか。あまり見ないけど、知らないと使わないは違うから知って使えるようになっておくと何かと便利です。
とはいえ1月1日や12月31日のために TemporalAdjusters
を使う必要はないと思います。 LocalDate.of(2025, 1, 1)
の方が読みやすいし。でも LocalDate.of(today.getYear(), 1, 1)
は読みやすいと思わない。これやるなら today.with(MonthDay.of(1, 1))
じゃない?まぁ MonthDay
も存在知られてなかったりするからやらなくていいけど、引数の対称性が取れていないのはもにょります。コードレビューとかでも言わない程度の個人の範囲だけど。 MonthDay
なしなら withMonth
& withDayOfMonth
とかある。
並べてみる。
LocalDate.parse("2025-01-01");
LocalDate.of(2025, 1, 1);
LocalDate.of(today.getYear(), 1, 1);
today.with(MonthDay.of(1, 1));
today.withMonth(1).withDayOfMonth(1);
today.with(firstDayOfYear());
正直「どうでもいいこと」だけど、自分ならどれを選ぶかとか、その理由とかは自分の中で持っておくことをお勧めしたいです。それをコーディング規約にするとか、コードレビューの観点にないのに指摘するとかは個人的には微妙領域。もちろん「今年」であることが重要でそのコードが繰り返し実行されるものなら 2025
のハードコーディングのだけはNGです。なお「どうでもいいこと」に鉤括弧をつけているのは 緊急時の規律 - 日々常々 とか 表出した事象を叩き潰してはいけない - 日々常々 とかと同様の私の中の特殊コンテキストの言葉だから。そのうち書くかもしれません。
ちなみに最後の firstDayOfYear()
は TemporalAdjusters
さんです。 static-importを前提につくられてるAPIなのでこうですが、しなかったら today.with(TemporalAdjusters.firstDayOfYear())
と文字数も最長になり読みにくくもあるダサいAPIになります。
あ、2月の月末日には TemporalAdjusters.lastDayOfMonth()
が使えるので、月末日が必要な時はぜひ思い出してあげてください。 3月1日から minusDays(1)
でもいいけどさ。ダサいじゃん。
getDayOfXxx
getDayOfYear()
は「その年の日数」です。月の満ち欠けを無視して年を基準に生きる人なら「今日は何日だっけ?」には「X月X日」ではなく「X日」と答えるのが当然で、そういう人が使う日付取得メソッドがこれです。そんな人見たことないけど。
LocalDate
には getDayOf
から始まるメソッドが3つあります。JSLのAPI仕様を見ても良いのですが、jshellさんで getDayOf
まで書いてtabを押したら出てきます。素敵機能。

たぶん多くの人は「 LocalDate
から日付を取得したいだけなのになんで getDay()
じゃなく getDayOfMonth()
なんてしなきゃいけないんだ」と面倒に思っていたりするのではないでしょうか。私は面倒に思ってます。だいたいの文脈において月の満ち欠けを前提にしていきているのが地球人類ですから、 getDay()
と言う素直なメソッドで「今日は何日?」に応えてほしいと感じるでしょう。ちなみに今日は8日です。
一週間が重要な業務システムだと getDayOfWeek()
は地味に役立ちます。他の2メソッドは int
返ってくるのに、この子は enum DayOfWeek
を返してくるところとか我が道を行っていてオシャレですよね。
getDayOfWeek()
と似たものに getMonth()
があって、この子も enum Month
が返ってきます。でこっちには int
を返す getMonthValue()
があったりします。 getDayOfWeekValue()
はない。要らないけど。欲しくなったら DayOfWeek
に getValue()
したげればいいです。なんかで使ったことあるけど、なんだっけな。忘れました。
今年の経過日数 / 今年の日数
LocalDate.now().getDayOfYear() / LocalDate.now().with(TemporalAdjusters.lastDayOfYear()).getDayOfYear()
これやると 0
になるんですよね。
で「あー小数点だから double
使わなきゃねー」とかで出てくるんだけど、業務コードで double
を安全に使ってその安全な状態を維持し続けるのは至難の業。 double
は小数点数を扱いますが、固定小数点数でなく浮動小数点数で、そのことを分からないなら使うべきじゃないし、わかっているならそもそもほとんどの場合で使わないと思います。
なので今回みたいな単発書き捨てスクリプトならいいかもだけど、業務では dobule
とかは存在しなかったものくらいに扱って、常に BigDecimal
を使って丸モードに意識を向けるべきだと思ってます。これは先にあげたような人に押し付けないものじゃなく「規約にすべき」くらい強く思っていることです。私がコーディング規約に関わったところでは入ってるんじゃないかな。コードレビューでも出てきたら警戒レベル上げるし。
まとめ
こういう、役に立つようなたたないような話が技術力に繋がると思っています。裏付け考えてみたり、調べてみたり、動かしたり。
こう言うのを楽しめる人たちと会話できると楽しいって思います。楽しめるべきとなんて思ってないので、楽しめない人がいてもいいと思います。押し付ける気はさらさらありません。棲み分けでいいと思います。
とは言え今後はAIにお任せになっていくので、このまんまの技術は要らないものになっていくんだろうなぁとは思っています。
AIネイティブはAIネイティブで同系統の必要な要素を抽出した別の技術を身につけていくことになるだろうから、過渡期を超えた後の人たちの心配は要らないかなと思ってます。
この過渡期の真っ最中はどうしたらいいんだろうなぁとは思っていますが、。
おまけ:AIの話
私は有償のはJetBrainsAIしか使っておらず、Junieさんは順番待ち。他は手を出していません。なので、まるっとお任せ系(なんて表現が妥当なの?)の手触りはわかっていません。
そっち系で「世界が変わった」みたいなのを横目に見つつ、レイトマジョリティである私はいつごろその世界に行くんだろうなぁって思いながら過ごしてます。 その試行錯誤する暇あったらブランチマイニングしてたいし。
その辺りを知らずにあまりAIのことを語っても的外れになる確信だけはあんだけど、的外れでもいいかぁって思いながら言及してます。

感覚だと これくらい(画像のポストしたツリー) ですが、どうなるやら。腰の重いJTCと揶揄されるようなところが無視できないくらいのビジネスインパクトを与えられればもっと早まるかもですけど。
ちなみに今回のはAIに「 TemporalAdjusters
使わないの?」「 getDayOfYear()
は?」とか聞いたら、いろんな言い訳しながら私が書いたのと同じようなコードにはなりはします。聞かないと出してきてくれないです。これに限らず、AIを使う側が存在を知らないと引き出せない系は結構あると思います。これは人相手でも同じなのでそういうものなんでしょうけど。 TemporalAdjusters
& getDayOfYear()
が良くて between
が悪いってことではないですが。ちなみに最初に出してきたコードと TemporalAdjusters
& getDayOfYear()
では当日の扱いが違うので結果が違ってきます。テストコード書いてそれ通す系のAIならいいんですが、単にそれっぽく動くものだとこの違いがあることを言わずに挙動変えてくるので、その辺が迂闊な人に「AI使えばいいじゃん」みたいなことを業務でやるのは……と思ったけど、その辺が迂闊な人はAI使わなくてもたいして変わらないから別に気にしなくていいやって思いました。
おまけ:AIで仕事はなくならない
「AI使ってるのにまだ仕事しなきゃいけないんだけど!」って嘆き(ネタ)が聞こえたので、ざっと描いたもの。

今までできていなかった本来の仕事ができるようになります。AIを使うことで偶有的複雑さを持ち込むことになるので、その仕事も新たに増えるだろうけど。
アジャイルサムライはいまでも読み返すと「それな」ってなります。システム開発をしていない業界の人にも紹介してみたら「仕事でめっちゃ役立ってる」って言ってて、そうよねーって思いました。