きり丸の技術日記

技術検証したり、資格等をここに残していきます。

開始日と解約"月"を元に暦上で日割のない解約"日"を求める(Java)

小ネタ。「今年の12月に解約したい。日割りが必要ない日付を教えてほしい」といった、解約する「年月」までは把握しているが、解約する「年月日」までは分からないといったケースに対応するロジックをJavaで求めます。

環境

  • Java
    • 17

対応

暦上の1ヵ月の定義については、こちらの記事を見てください。

雑に表現すると次のどちらかです。

  • 開始日の"日" -1日
  • 月末

月末はYearMonth型を使用すると非常に楽ですので、まずは「解約月」をYearMonth型に変換します。

YearMonth#isValidDayにて、指定日付が存在するかをチェックできます。YearMonth#atDayにて、指定の日付のLocalDate型に変換できます。それぞれのパラメータに「開始日の日-1日」を渡します。もし指定日付が存在すれば、その日付が「解約日」となります。存在しなければ、「解約日」は月末です。

public LocalDate from年月to日割りなし日付(LocalDate startDate, LocalDate endMonth) {
  YearMonth yearMonth = YearMonth.from(endMonth);
  if (yearMonth.isValidDay(localDate.getDayOfMonth() - 1)) {
    return yearMonth.atDay(localDate.getDayOfMonth() - 1);
  } else {
    return yearMonth.atEndOfMonth();
  }
}

なお、存在しない日付とは次のケースです。

  • 開始日が1日
    • パラメータが0日になるため
  • 存在しない日付
    • 2月30日 等々 閏年も含む

ソースコード

テストケースはこの記事参照してください。

終わりに

テストケースさえ思いつけばシンプルです。

LocalDateのまま処理するとチェックメソッドがないため、DateTimeExceptionが発生していたのですが、YearMonth#isValidDayのおかげで安全に処理できました。

地味な内容ですが、検証することでYearMonth#isValidDayの存在に気づけて良かったです。

類似情報

Pythonで初期配列をset型で作りたければbrace {} リスト型はbracket []

小ネタ。いつもset([data for data in datum])のように、List型を経由してたので、備忘録。なお、タイトルの出オチ記事です。

環境

  • Python
    • 3.8

対応

ブレース(brace, {})でくくると、set型になります。

ブラケット(bracket, [])でくくると、list型になります。

set_datum: set = {"A", "A", "B", "C"}
list_datum: list = ["A", "A", "B", "C"]

# わざわざ、listを経由する必要はない
set_constructor_datum: set = set(list_datum)

# これは同じもの
datum: list = ["A", "A", "B", "C"]
set([data for data in datum])
{data for data in datum}

公式引用

Use a comma-separated list of elements within braces: {'jack', 'sjoerd'}
Use a set comprehension: {c for c in 'abracadabra' if c not in 'abc'}
Use the type constructor: set(), set('foobar'), set(['a', 'b', 'foo'])

ソースコード

終わりに

普段、list型をメインで活用するので、set型はbraceでくくれば作れるということを知りませんでした。まぁ、pandasで操作している時に、項目をユニークにしたい時は、drop_duplicatesで間に合うことも多いのですが。

型情報が無い状態で実行すると、{}がsetで、[]がlistになるというのは、初心者には理解が難しい箇所かもしれませんが、覚えておくと便利だと思います。

参考情報

WindowsのVS CodeのデフォルトターミナルをGit Bashに変更する

WindowsのVS Codeのデフォルトターミナルを変更したかったので、Git Bashに変更する方法を残します。

環境

  • VS Code
    • 1.64.2
  • Windows
    • 11
  • Git Bash
    • 4.4.23

方法

VS Codeのsettings.jsonを開く。

$HOME/AppData/Roaming/Code/User/settings.json

settings.jsonに次の設定を追加する。

{
    "terminal.integrated.defaultProfile.windows": "Git Bash"
}

もし、起動時のターミナルにパラメータを渡したい等があれば、カスタマイズしたプロファイルから起動することもできます。

次の設定は、KirimaruWinプロファイルをデフォルトのプロファイルにしています。

{
    "terminal.integrated.profiles.windows": {
        "KirimaruWin": {
            "source": "Git Bash"
        }
    },
    "terminal.integrated.defaultProfile.windows": "KirimaruWin"
}

なお、windowsだけでなく、linux, mac等も設定できます。

終わりに

検索したら大量に出てくるのですが、Deprecatedな設定だったりするので、一応自分でも残しておきました。

新規性に関してはあまりありません。

参考情報