ããã¯ããªã«ãããããŠæžãããã®ïŒ
DateTimeFormatter
ã§æååãšããŠè¡šçŸãããæ¥æãããŒã¹ããæã«æ¡æ°ã空çœã®æ±ãã«ã€ããŠããŸãæèããŠããªãã£ãã®ã§ã
ã¡ãã£ãšèŠãŠã¿ãããšã«ããŸããã
DateTimeFormatter (Java SE 17 & JDK 17)
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã
$ java --version openjdk 17.0.5 2022-10-18 OpenJDK Runtime Environment (build 17.0.5+8-Ubuntu-2ubuntu122.04) OpenJDK 64-Bit Server VM (build 17.0.5+8-Ubuntu-2ubuntu122.04, mixed mode, sharing) $ mvn --version Apache Maven 3.8.7 (b89d5959fcde851dcb1c8946a785a163f14e1e29) Maven home: $HOME/.sdkman/candidates/maven/current Java version: 17.0.5, vendor: Private Build, runtime: /usr/lib/jvm/java-17-openjdk-amd64 Default locale: ja_JP, platform encoding: UTF-8 OS name: "linux", version: "5.15.0-58-generic", arch: "amd64", family: "unix"
æºå
確èªã¯ããã¹ãã³ãŒãã§è¡ããŸããå¿ èŠãªMavenäŸåé¢ä¿çã¯ãã¡ãã
<properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> </properties> <dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.9.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.24.2</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M7</version> </plugin> </plugins> </build>
ããŒã¹ãã
æåã¯ããŒã¹ããã
以äžããã¹ãã³ãŒãã®é圢ã«ããŠãããŸãã
src/test/java/org/littlewings/datetimeformatter/ParseTest.java
package org.littlewings.datetimeformatter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.time.format.ResolverStyle; import java.util.Calendar; import java.util.GregorianCalendar; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; public class ParseTest { // ããã«ããã¹ããæžãïŒïŒ }
SimpleDateFormatãšDateTimeFormatterã«ããããããŒã¹æã®æ¡æ°ã«å¯Ÿããæ¯ãèã
ãã®ãšã³ããªãŒãæžããã£ããã«ãªã£ã話ã§ããã
ãŸãã¯æãªããã®SimpleDateFormat
ãçŽ çŽã«äœ¿ã£ãŠã¿ãŸããæ¥ä»ãšæ¥æã«å¯ŸããŠãããããããŒã¹ã
@Test void simpleDateFormat() throws ParseException { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); simpleDateFormat.setLenient(true); Calendar date = new GregorianCalendar(2022, 9, 25); assertThat(simpleDateFormat.parse("2022-10-25")) .isEqualTo(date.getTime()); SimpleDateFormat simpleDateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); simpleDateTimeFormat.setLenient(true); Calendar dateTime = new GregorianCalendar(2022, 9, 25, 16, 30, 25); assertThat(simpleDateTimeFormat.parse("2022-10-25 16:30:25")) .isEqualTo(dateTime.getTime()); }
ç¶ããŠãDateTimeFormatter
ã
@Test void dateTimeFormatter() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDate.parse("2022-10-25", dateFormatter)) .isEqualTo(LocalDate.of(2022, 10, 25)); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDateTime.parse("2022-10-25 16:30:25", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2022, 10, 25, 16, 30, 25)); }
ãŸãããµã€ãã ãšæããŸãã
次ã«ãæ¡æ°ãå°ãªãããŒã¿ãæž¡ããŠã¿ãŸãã
SimpleDateFormat
ã
@Test void shortWidthSimpleDateFormat() throws ParseException { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); simpleDateFormat.setLenient(true); Calendar date = new GregorianCalendar(2023, 0, 5); assertThat(simpleDateFormat.parse("2023-1-5")) .isEqualTo(date.getTime()); SimpleDateFormat simpleDateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); simpleDateTimeFormat.setLenient(true); Calendar dateTime = new GregorianCalendar(2023, 0, 5, 2, 3, 4); assertThat(simpleDateTimeFormat.parse("2023-1-5 2:3:4")) .isEqualTo(dateTime.getTime()); }
åé¡ãªãããŒã¹ã§ããŸãã
DateTimeFormatter
ã
@Test void shortWidthDateTimeFormatter() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd").withResolverStyle(ResolverStyle.STRICT); assertThatThrownBy(() -> LocalDate.parse("2023-1-5", dateFormatter)) .isInstanceOf(DateTimeParseException.class) .hasMessage("Text '2023-1-5' could not be parsed at index 5"); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss").withResolverStyle(ResolverStyle.STRICT); assertThatThrownBy(() -> LocalDateTime.parse("2023-1-5 2:3:4", dateTimeFormatter)) .isInstanceOf(DateTimeParseException.class) .hasMessage("Text '2023-1-5 2:3:4' could not be parsed at index 5"); }
ãã¡ãã¯ãããŒã¹ã«å€±æããŸãããããåé¿ããã«ã¯ã©ããããïŒãšããã®ããä»åã®ãšã³ããªãŒãæžãããã£ããã§ããã
åœããåã§ããã足ããªãæ¡ã0åãããã°ããŒã¹ã«ã¯å€±æããŸããã
@Test void shortWidthDateTimeFormatter2() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDate.parse("2023-01-05", dateFormatter)) .isEqualTo(LocalDate.of(2023, 1, 5)); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDateTime.parse("2023-01-05 02:03:04", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2023, 1, 5, 2, 3, 4)); }
ã¡ãªã¿ã«ã空çœã眮ããŠããã¡ã§ãã
@Test void shortWidthDateTimeFormatter3() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu/MM/dd").withResolverStyle(ResolverStyle.STRICT); assertThatThrownBy(() -> LocalDate.parse("2023/ 1/ 5", dateFormatter)) .isInstanceOf(DateTimeParseException.class) .hasMessage("Text '2023/ 1/ 5' could not be parsed at index 5"); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu/MM/dd HH:mm:ss").withResolverStyle(ResolverStyle.STRICT); assertThatThrownBy(() -> LocalDateTime.parse("2023/ 1/ 5 2: 3: 4", dateTimeFormatter)) .isInstanceOf(DateTimeParseException.class) .hasMessage("Text '2023/ 1/ 5 2: 3: 4' could not be parsed at index 5"); }
ãã®ãã¿ãŒã³ã®æã¯ãåºåãæåã/
ã«ããŠããŸãã
ãã¿ãŒã³ã1æåã«ãã
ããã§ãããããæã«ããŒã¹ãããã£ããã©ãããããšãããšããã¿ãŒã³ã1æåã«ãããšããŒã¹ã§ããããã«ãªããŸãã
@Test void shortWidthShortDateTimeFormatter() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu-M-d").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDate.parse("2022-10-25", dateFormatter)) .isEqualTo(LocalDate.of(2022, 10, 25)); assertThat(LocalDate.parse("2023-1-5", dateFormatter)) .isEqualTo(LocalDate.of(2023, 1, 5)); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-M-d H:m:s").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDateTime.parse("2022-10-25 16:30:25", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2022, 10, 25, 16, 30, 25)); assertThat(LocalDateTime.parse("2023-1-5 2:3:4", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2023, 1, 5, 2, 3, 4)); }
ãªãã·ã§ã³ã§ç©ºçœã眮ã
DateTimeFormatter
ã«ã¯ããªãã·ã§ã³ããšãããã®ãããã[]
ã§è¡šçŸããŸãã
ãªãã·ã§ã³ã®ã»ã¯ã·ã§ã³: ãªãã·ã§ã³ã®ã»ã¯ã·ã§ã³ã®ããŒã«ãŒã¯ãDateTimeFormatterBuilder.optionalStart()ããã³DateTimeFormatterBuilder.optionalEnd()ã®åŒåºããšãŸã£ããåæ§ã«æ©èœããŸãã
DateTimeFormatter (Java SE 17 & JDK 17)
DateTimeFormatterBuilder.html#optionalStart
ã®èª¬æãèŠããšããããªããšãæžãããŠããŸãã
æžåŒèšå®ã®åºåã«ã¯ããªãã·ã§ã³ã®ã»ã¯ã·ã§ã³ãå«ããããšãã§ãããããã¯å ¥ãåã«ããããšãã§ããŸãã ãªãã·ã§ã³ã®ã»ã¯ã·ã§ã³ã¯ããã®ã¡ãœããã®åŒåºãã«ãã£ãŠå§ãŸããoptionalEnd()ã®åŒåºãããã«ããŒã»ããã»ã¹ã®çµäºã«ãã£ãŠçµãããŸãã
ãªãã·ã§ã³ã®ã»ã¯ã·ã§ã³ã«å«ãŸãããã¹ãŠã®èŠçŽ ã¯ããªãã·ã§ã³ãšããŠæ±ãããŸãã æžåŒèšå®æã¯ãã»ã¯ã·ã§ã³å ã®ãã¹ãŠã®èŠçŽ ã«é¢ããããŒã¿ãTemporalAccessorã§äœ¿çšå¯èœãªå Žåã®ã¿ãã»ã¯ã·ã§ã³ãåºåãããŸãã 解ææã¯ã解æãããæååããã»ã¯ã·ã§ã³å šäœãæ¬ ããŠããå ŽåããããŸãã
DateTimeFormatterBuilder#optionalStart)
DateTimeFormatter
ã®å Žåã¯ã[]
ã§å²ã£ãç¯å²ããªãã·ã§ã³ã«ãªããšããããšã¿ããã§ãã
è©ŠããŠã¿ãŸãããã
@Test void shortWidthOptionalSpaceDateTimeFormatter() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu/[ ]M/[ ]d").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDate.parse("2022/10/25", dateFormatter)) .isEqualTo(LocalDate.of(2022, 10, 25)); assertThat(LocalDate.parse("2023/1/5", dateFormatter)) .isEqualTo(LocalDate.of(2023, 1, 5)); assertThat(LocalDate.parse("2023/ 1/ 5", dateFormatter)) .isEqualTo(LocalDate.of(2023, 1, 5)); assertThat(LocalDate.parse("2023/01/05", dateFormatter)) .isEqualTo(LocalDate.of(2023, 1, 5)); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu/[ ]M/[ ]d [ ]H:[ ]m:[ ]s").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDateTime.parse("2022/10/25 16:30:25", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2022, 10, 25, 16, 30, 25)); assertThat(LocalDateTime.parse("2023/1/5 2:3:4", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2023, 1, 5, 2, 3, 4)); assertThat(LocalDateTime.parse("2023/ 1/ 5 2: 3: 4", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2023, 1, 5, 2, 3, 4)); assertThat(LocalDateTime.parse("2023/01/05 02:03:04", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2023, 1, 5, 2, 3, 4)); }
空çœããã£ãŠããªããŠããããªãã2æ¡ã§ãã£ãŠãããŒã¹ã§ããŸããã1æ¡ã§ã2æ¡ã§ãããŒã¹ã§ããã®ã¯ããã¿ãŒã³ã1æåã«ããŠããããã§
ãããŸã§ãªãã·ã§ã³ãªã®ã¯ç©ºçœãªã®ã§ããã
ãªãã·ã§ã³ãããå°ã
ããå°ãããªãã·ã§ã³ã®ãã¿ãŒã³ãè©ŠããŠã¿ãŸãããã
æ¥æã®éšåããªãã·ã§ã³ã«ããŠã¿ãŸãã
@Test void optionalDateTimeFormatter() { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd[ HH:mm:ss]").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDate.parse("2022-10-25", dateTimeFormatter)) .isEqualTo(LocalDate.of(2022, 10, 25)); assertThat(LocalDate.parse("2023-01-05", dateTimeFormatter)) .isEqualTo(LocalDate.of(2023, 1, 5)); assertThat(LocalDateTime.parse("2022-10-25 16:30:25", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2022, 10, 25, 16, 30, 25)); assertThatThrownBy(() -> LocalDateTime.parse("2023-01-05 2:3:4", dateTimeFormatter)) .isInstanceOf(DateTimeParseException.class) .hasMessage("Text '2023-01-05 2:3:4' could not be parsed, unparsed text found at index 10"); }
ãªãã·ã§ã³ããã¹ããããããšãã§ããŸãããã¡ãã¯ç§ã®éšåããªãã·ã§ã³ã«ããŠããŸãã
@Test void nestedOptionalDateTimeFormatter() { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd[ HH:mm[:ss]]").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDate.parse("2022-10-25", dateTimeFormatter)) .isEqualTo(LocalDate.of(2022, 10, 25)); assertThat(LocalDate.parse("2023-01-05", dateTimeFormatter)) .isEqualTo(LocalDate.of(2023, 1, 5)); assertThat(LocalDateTime.parse("2022-10-25 16:30:25", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2022, 10, 25, 16, 30, 25)); assertThat(LocalDateTime.parse("2023-01-05 02:03:04", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2023, 1, 5, 2, 3, 4)); assertThat(LocalDateTime.parse("2022-10-25 16:30:25", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2022, 10, 25, 16, 30, 25)); assertThat(LocalDateTime.parse("2023-01-05 02:03", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2023, 1, 5, 2, 3, 0)); }
ããã£ã³ã°
å°ã芳ç¹ãå€ããŠãããã£ã³ã°ãæå®ããå Žåã¯p
ã䜿ããŸãã
@Test void shortWidthPaddingDateTimeFormatter() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu/ppM/ppd").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDate.parse("2022/10/25", dateFormatter)) .isEqualTo(LocalDate.of(2022, 10, 25)); assertThat(LocalDate.parse("2023/ 1/ 5", dateFormatter)) .isEqualTo(LocalDate.of(2023, 1, 5)); assertThat(LocalDate.parse("2023/01/05", dateFormatter)) .isEqualTo(LocalDate.of(2023, 1, 5)); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu/ppM/ppd ppH:ppm:pps").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDateTime.parse("2022/10/25 16:30:25", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2022, 10, 25, 16, 30, 25)); assertThat(LocalDateTime.parse("2023/ 1/ 5 2: 3: 4", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2023, 1, 5, 2, 3, 4)); assertThat(LocalDateTime.parse("2023/01/05 02:03:04", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2023, 1, 5, 2, 3, 4)); }
pp
ã§ã2æ¡ã§ããããšãæ±ããŠããŸãããæ¡æ°ã«æºããªãå Žåã¯ç©ºçœãå¿
é ã«ãªããŸãã
ãªã®ã§ã以äžã®ããã«æ¡æ°ãäžè¶³ããå Žåã«ããã£ã³ã°ããŠããªããšããŒã¹ã§ããŸããã
@Test void shortWidthPaddingDateTimeFormatter2() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu/ppM/ppd").withResolverStyle(ResolverStyle.STRICT); assertThatThrownBy(() -> LocalDate.parse("2023/1/5", dateFormatter)) .isInstanceOf(DateTimeParseException.class) .hasMessage("Text '2023/1/5' could not be parsed at index 10"); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu/ppM/ppd ppH:ppm:pps").withResolverStyle(ResolverStyle.STRICT); assertThatThrownBy(() -> LocalDateTime.parse("2023/1/5 2:3:4", dateTimeFormatter)) .isInstanceOf(DateTimeParseException.class) .hasMessage("Text '2023/1/5 2:3:4' could not be parsed at index 10"); }
1æåã®ãã¿ãŒã³ã¯é·ããèŠãŠããªã
ããèŠããšã1æåã®ãã¿ãŒã³ãšãªãã·ã§ã³ã®çµã¿åãããæè»ã§è¯ãããã«èŠããŸããã1æåã®ãã¿ãŒã³ã¯é·ããèŠãŠããªãæãã
ããŸããã
以äžã®ãããªãã¿ãŒã³ãããŒã¹ã§ããŠããŸããŸãã
@Test void looseDateTimeFormatter() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu-M-d").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDate.parse("2023-00001-00005", dateFormatter)) .isEqualTo(LocalDate.of(2023, 1, 5)); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-M-d H:m:s").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDateTime.parse("2023-00001-00005 00002:00003:00004", dateTimeFormatter)) .isEqualTo(LocalDateTime.of(2023, 1, 5, 2, 3, 4)); }
ãã®æ¡æ°ãå³å¯ã«å¶åŸ¡ããããšæããšãDateTimeFormatter#ofPattern
ã§ãã¿ãŒã³æååããäœãã®ã§ã¯ãªãã
DateTimeFormatterBuilder
ã¯ã©ã¹ã®appendValue`ã¡ãœããã䜿ãããšã«ãªãããã§ãã
å³å¯è§£æã¢ãŒãã§ã¯ã解æãããæ¡æ°ã®æå°ã¯minWidthãæ倧ã¯maxWidthã§ãã éå³å¯è§£æã¢ãŒãã§ã¯ã解æãããæ¡æ°ã®æå°ã¯1ãæ倧ã¯19ã§ã(é£æ¥å€è§£æã«ãã£ãŠå¶éãããå Žåãé€ã)ã
DateTimeFormatterBuilder#appendValue)
ä»åã¯ãDateTimeFormatterBuilder
ã¯ã©ã¹ã¯æ±ããŸãããã
ãã©ãŒããããã
ããŒã¹ãã§ããã®ã§ã次ã¯ãã©ãŒãããããŠã¿ãŸãã
ãã¡ãããã¹ãã³ãŒãã§ç¢ºèªããã®ã§ãé圢ããã
src/test/java/org/littlewings/datetimeformatter/FormatTest.java
package org.littlewings.datetimeformatter; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.ResolverStyle; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; public class FormatTest { // ããã«ããã¹ããæžãïŒïŒ }
ã·ã³ãã«ãªãã¿ãŒã³ã§ãã©ãŒããããã
ãŸãã¯ãã·ã³ãã«ãªãã¿ãŒã³ã§ãã©ãŒãããããŠã¿ãŸãã
@Test void format() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDate.of(2022, 10, 25).format(dateFormatter)) .isEqualTo("2022-10-25"); assertThat(LocalDate.of(2023, 1, 5).format(dateFormatter)) .isEqualTo("2023-01-05"); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDateTime.of(2022, 10, 25, 16, 30, 25).format(dateTimeFormatter)) .isEqualTo("2022-10-25 16:30:25"); assertThat(LocalDateTime.of(2023, 1, 5, 2, 3, 4).format(dateTimeFormatter)) .isEqualTo("2023-01-05 02:03:04"); }
ãã®å Žåãæ¡æ°ã«æºããªãå€ã¯0åããããŸãã
ãã¿ãŒã³æåã1ã«ãã
次ã«ããã¿ãŒã³æåã1æåã«ããŠã¿ãŸãã
@Test void shortFormat() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu-M-d").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDate.of(2022, 10, 25).format(dateFormatter)) .isEqualTo("2022-10-25"); assertThat(LocalDate.of(2023, 1, 5).format(dateFormatter)) .isEqualTo("2023-1-5"); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu-M-d H:m:s").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDateTime.of(2022, 10, 25, 16, 30, 25).format(dateTimeFormatter)) .isEqualTo("2022-10-25 16:30:25"); assertThat(LocalDateTime.of(2023, 1, 5, 2, 3, 4).format(dateTimeFormatter)) .isEqualTo("2023-1-5 2:3:4"); }
ãã®å Žåãæ¡æ°ããã®ãŸãŸæååé·ã«åæ ãããæãã«ãªããŸããã
ãªãã·ã§ã³ã§ç©ºçœã眮ããŠã¿ã
ããŒã¹ããæã«ã空çœããªãã·ã§ã³ã«ããããã«ããŠã¿ãŸããããããã ãšã©ããªãã§ãããã
@Test void optionalShortFormat() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu/[ ]M/[ ]d").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDate.of(2022, 10, 25).format(dateFormatter)) .isEqualTo("2022/ 10/ 25"); assertThat(LocalDate.of(2023, 1, 5).format(dateFormatter)) .isEqualTo("2023/ 1/ 5"); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu/[ ]M/[ ]d [ ]H:[ ]m:[ ]s").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDateTime.of(2022, 10, 25, 16, 30, 25).format(dateTimeFormatter)) .isEqualTo("2022/ 10/ 25 16: 30: 25"); assertThat(LocalDateTime.of(2023, 1, 5, 2, 3, 4).format(dateTimeFormatter)) .isEqualTo("2023/ 1/ 5 2: 3: 4"); }
åžžã«ç©ºçœã確ä¿ãããããã«ãªããŸããâŠã
ããã£ã³ã°ã䜿ã
ããã£ã³ã°ã䜿ããšãp
ã§æå®ããæ¡æ°ã«æºããªãå Žåã¯ç©ºçœã§åããããŸãã
@Test void paddingShortFormat() { DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu/ppM/ppd").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDate.of(2022, 10, 25).format(dateFormatter)) .isEqualTo("2022/10/25"); assertThat(LocalDate.of(2023, 1, 5).format(dateFormatter)) .isEqualTo("2023/ 1/ 5"); DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("uuuu/ppM/ppd ppH:ppm:pps").withResolverStyle(ResolverStyle.STRICT); assertThat(LocalDateTime.of(2022, 10, 25, 16, 30, 25).format(dateTimeFormatter)) .isEqualTo("2022/10/25 16:30:25"); assertThat(LocalDateTime.of(2023, 1, 5, 2, 3, 4).format(dateTimeFormatter)) .isEqualTo("2023/ 1/ 5 2: 3: 4"); }
ãããªãšããã§ããããã
ãŸãšã
ããã«é°å²æ°ã§DateTimeFormatter
ã䜿ã£ãŠããã®ãããããããããŸããâŠã
æžåŒæååã®ãã§ãã¯ã§DateTimeFormatter
ã䜿ãæã¯ãä»ã®ç¢ºèªæ¹æ³ãšçµã¿åãããããšãèããæ¹ãããã®ãããããŸããã
ãŸããããŒã¹ãšãã©ãŒãããã§åäžã®ãã¿ãŒã³å®çŸ©ã§è¯ãã®ããèãã©ããã§ããã
ããšã¯ããã¡ãã䜿ããªã©ã§ããããã
DateTimeFormatter#parse(java.lang.CharSequence,java.text.ParsePosition))