いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-360 (月の日数を求める)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。よく忘れるのでここにメモメモ。。。

大した内容ではないのですが、月の日数を求めるときに time.Date() の月と日を値をちょいと小細工すると求めることができます。

サンプル

package times

import (
    "time"

    "github.com/devlights/gomy/output"
)

// DaysInMonth は、月の日数を求めるサンプルです.
//
// # REFERENCES
//   - https://cs.opensource.google/go/go/+/refs/tags/go1.21.4:src/time/time.go;l=1467
func DaysInMonth() error {
    //
    // time.Date() で日の値を 0 で指定すると内部で正規化されて
    // -1日する動きとなる。なので、月を1加算して日を0にすると
    // その月の末日となる。
    //

    var (
        year   = time.Now().Year()
        months = [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
    )

    for _, m := range months {
        var (
            daysInMonth = time.Date(year, time.Month(m+1), 0, 0, 0, 0, 0, time.UTC).Day()
        )

        output.Stdoutf("[日数]", "%02d月の日数: %d\n", m, daysInMonth)
    }

    return nil
}

実行すると以下のようになります。

$ task
task: [build] go build .
task: [run] ./try-golang -onetime

ENTER EXAMPLE NAME: time_daysinmonth

[Name] "time_daysinmonth"
[日数]                 01月の日数: 31
[日数]                 02月の日数: 28
[日数]                 03月の日数: 31
[日数]                 04月の日数: 30
[日数]                 05月の日数: 31
[日数]                 06月の日数: 30
[日数]                 07月の日数: 31
[日数]                 08月の日数: 31
[日数]                 09月の日数: 30
[日数]                 10月の日数: 31
[日数]                 11月の日数: 30
[日数]                 12月の日数: 31


[Elapsed] 122.78µs

ちなみに、timeパッケージのコードの中に daysIn という関数があるのですが、公開されていないです。

中の実装は、月の日数をテーブルで持っていて、そこからサクッと求める処理になっています。

https://cs.opensource.google/go/go/+/refs/tags/go1.21.4:src/time/time.go;l=1058

参考情報

Goのおすすめ書籍

Go言語による並行処理

Go言語による並行処理

Amazon

上の書籍の日本語版が下です。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。