HIRO Tracks

山根正大です。Fintech業界エンジニアが日々学んだ知識を発信します。

DateTimeFormatter.formatで型「M/d」指定すると「01」でも「1」でも変換可能

これは何

java.time.DateTimeFormatterのString->日付型の変換が結構柔軟で助かった話です!

型に「yyyy/M/d」と指定すれば、例えば日付が「01」でも「1」でも型変換してくれるようになります。

「2022/1/1」と「2022/1/01」どちらも変換してくれて、「2022年1月1日」を表すようになります。

目次

公式

docs.oracle.com

動作確認

以下テストで全てOKでした。

import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.time.format.DateTimeParseException
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFailsWith

class DateTimeFormatterTest {

    private val formatter = DateTimeFormatter.ofPattern("yyyy/M/d")

    @Test
    fun `2022_01_01でOK`() {
        val result = LocalDate.parse("2022/01/01", formatter)
        assertEquals(LocalDate.of(2022,1,1), result)
    }

    @Test
    fun `2022_1_01でOK`() {
        val result = LocalDate.parse("2022/1/01", formatter)
        assertEquals(LocalDate.of(2022,1,1), result)
    }

    @Test
    fun `2022_01_1でOK`() {
        val result = LocalDate.parse("2022/01/1", formatter)
        assertEquals(LocalDate.of(2022,1,1), result)
    }

    @Test
    fun `2022_11_11でOK`() {
        val result = LocalDate.parse("2022/11/11", formatter)
        assertEquals(LocalDate.of(2022,11,11), result)
    }

    @Test
    fun `2022_11_011でOK`() {
        val result = LocalDate.parse("2022/11/011", formatter)
        assertEquals(LocalDate.of(2022,11,11), result)
    }

    @Test
    fun `2022_11_111(存在しない日付)での時フォーマットできない`() {
        assertThrows<DateTimeParseException> { LocalDate.parse("2022/11/111", formatter) }
    }

    @Test
    fun `202211111形式違いの時フォーマットできない`() {
        assertThrows<DateTimeParseException> { LocalDate.parse("202211111", formatter) }
    }

}

より詳細な記事

Java日付時刻フォーマッターメモ(Hishidama's Java8 DateTimeFormatter Memo)