Skip to content

Commit 3909f59

Browse files
committed
parser refactoring based on feedback
1 parent 1774bbc commit 3909f59

7 files changed

Lines changed: 246 additions & 203 deletions

File tree

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/ParserOptions.kt

Lines changed: 181 additions & 152 deletions
Large diffs are not rendered by default.

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/api/convert.kt

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ import org.jetbrains.kotlinx.dataframe.documentation.ExpressionsGivenRow
4242
import org.jetbrains.kotlinx.dataframe.documentation.Indent
4343
import org.jetbrains.kotlinx.dataframe.documentation.LineBreak
4444
import org.jetbrains.kotlinx.dataframe.documentation.SelectingColumns
45-
import org.jetbrains.kotlinx.dataframe.impl.api.Parsers
4645
import org.jetbrains.kotlinx.dataframe.impl.api.convertRowColumnImpl
4746
import org.jetbrains.kotlinx.dataframe.impl.api.convertToDoubleImpl
4847
import org.jetbrains.kotlinx.dataframe.impl.api.convertToTypeImpl
@@ -1582,7 +1581,7 @@ public fun DataColumn<Int?>.convertToLocalDate(zone: TimeZone = defaultTimeZone)
15821581
@JvmName("convertToLocalDateFromString")
15831582
public fun DataColumn<String>.convertToLocalDate(format: DateTimeFormat<LocalDate>? = null): DataColumn<LocalDate> =
15841583
convertTo<LocalDate>(
1585-
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withDateTimeFormat(it)) },
1584+
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withFormat(it)) },
15861585
)
15871586

15881587
/**
@@ -1612,7 +1611,7 @@ public fun DataColumn<String>.convertToLocalDate(pattern: String): DataColumn<Lo
16121611
@JvmName("convertToLocalDateFromStringNullable")
16131612
public fun DataColumn<String?>.convertToLocalDate(format: DateTimeFormat<LocalDate>? = null): DataColumn<LocalDate?> =
16141613
convertTo<LocalDate?>(
1615-
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withDateTimeFormat(it)) },
1614+
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withFormat(it)) },
16161615
)
16171616

16181617
/**
@@ -1934,7 +1933,7 @@ public fun DataColumn<Int?>.convertToLocalTime(zone: TimeZone = defaultTimeZone)
19341933
@JvmName("convertToLocalTimeFromString")
19351934
public fun DataColumn<String>.convertToLocalTime(format: DateTimeFormat<LocalTime>? = null): DataColumn<LocalTime> =
19361935
convertTo<LocalTime>(
1937-
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withDateTimeFormat(it)) },
1936+
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withFormat(it)) },
19381937
)
19391938

19401939
/**
@@ -1964,7 +1963,7 @@ public fun DataColumn<String>.convertToLocalTime(pattern: String): DataColumn<Lo
19641963
@JvmName("convertToLocalTimeFromStringNullable")
19651964
public fun DataColumn<String?>.convertToLocalTime(format: DateTimeFormat<LocalTime>? = null): DataColumn<LocalTime?> =
19661965
convertTo<LocalTime?>(
1967-
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withDateTimeFormat(it)) },
1966+
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withFormat(it)) },
19681967
)
19691968

19701969
/**
@@ -2340,7 +2339,7 @@ public fun DataColumn<String>.convertToLocalDateTime(
23402339
format: DateTimeFormat<LocalDateTime>? = null,
23412340
): DataColumn<LocalDateTime> =
23422341
convertTo<LocalDateTime>(
2343-
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withDateTimeFormat(it)) },
2342+
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withFormat(it)) },
23442343
)
23452344

23462345
/**
@@ -2372,7 +2371,7 @@ public fun DataColumn<String?>.convertToLocalDateTime(
23722371
format: DateTimeFormat<LocalDateTime>? = null,
23732372
): DataColumn<LocalDateTime?> =
23742373
convertTo<LocalDateTime?>(
2375-
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withDateTimeFormat(it)) },
2374+
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withFormat(it)) },
23762375
)
23772376

23782377
/**
@@ -2746,7 +2745,7 @@ public fun DataColumn<String>.convertToDateTimeComponents(
27462745
format: DateTimeFormat<DateTimeComponents>? = null,
27472746
): DataColumn<DateTimeComponents> =
27482747
convertTo<DateTimeComponents>(
2749-
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withDateTimeFormat(it)) },
2748+
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withFormat(it)) },
27502749
)
27512750

27522751
/**
@@ -2778,7 +2777,7 @@ public fun DataColumn<String?>.convertToDateTimeComponents(
27782777
format: DateTimeFormat<DateTimeComponents>? = null,
27792778
): DataColumn<DateTimeComponents?> =
27802779
convertTo<DateTimeComponents?>(
2781-
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withDateTimeFormat(it)) },
2780+
parserOptions = format?.let { ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withFormat(it)) },
27822781
)
27832782

27842783
/**

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/impl/api/parse.kt

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@ import org.jetbrains.kotlinx.dataframe.ColumnsSelector
2323
import org.jetbrains.kotlinx.dataframe.DataColumn
2424
import org.jetbrains.kotlinx.dataframe.DataFrame
2525
import org.jetbrains.kotlinx.dataframe.DataRow
26+
import org.jetbrains.kotlinx.dataframe.api.DateTimeParserOptions
2627
import org.jetbrains.kotlinx.dataframe.api.GlobalParserOptions
27-
import org.jetbrains.kotlinx.dataframe.api.JavaDateTimeParserOptions
28-
import org.jetbrains.kotlinx.dataframe.api.KotlinDateTimeParserOptions
2928
import org.jetbrains.kotlinx.dataframe.api.ParseDateTimeLibrary
3029
import org.jetbrains.kotlinx.dataframe.api.ParseDateTimeLibrary.JAVA
3130
import org.jetbrains.kotlinx.dataframe.api.ParseDateTimeLibrary.KOTLIN
@@ -513,7 +512,7 @@ internal object Parsers : GlobalParserOptions {
513512
options.dateTimeFormatsProvided() &&
514513
options.shouldUseKotlinxDateTime() && this.shouldUseKotlinxDateTime()
515514
) {
516-
val dateTimeOptions = (options?.dateTime as? KotlinDateTimeParserOptions)
515+
val dateTimeOptions = (options?.dateTime as? DateTimeParserOptions.Kotlin)
517516
?: error(
518517
"Should not happen, but ParserOptions expected custom Kotlin dateTimeParserOptions yet found `null`.",
519518
)
@@ -546,7 +545,7 @@ internal object Parsers : GlobalParserOptions {
546545
options.dateTimeFormatsProvided() &&
547546
options.shouldUseJavaTime() && this.shouldUseJavaTime()
548547
) {
549-
val dateTimeOptions = (options!!.dateTime as? JavaDateTimeParserOptions)
548+
val dateTimeOptions = (options!!.dateTime as? DateTimeParserOptions.Java)
550549
?: error(
551550
"Should not happen, but ParserOptions expected custom Java dateTimeParserOptions yet found `null`.",
552551
)
@@ -959,11 +958,11 @@ internal object Parsers : GlobalParserOptions {
959958
.applyOptions(ParserOptions(useFastDoubleParser = useFastDoubleParser))
960959
}
961960

962-
internal fun ParserOptions?.shouldUseKotlinxDateTime(): Boolean = this?.dateTime is KotlinDateTimeParserOptions?
961+
internal fun ParserOptions?.shouldUseKotlinxDateTime(): Boolean = this?.dateTime is DateTimeParserOptions.Kotlin?
963962

964963
internal fun ParserOptions?.shouldNotUseKotlinxDateTime(): Boolean = !shouldUseKotlinxDateTime()
965964

966-
internal fun ParserOptions?.shouldUseJavaTime(): Boolean = this?.dateTime is JavaDateTimeParserOptions?
965+
internal fun ParserOptions?.shouldUseJavaTime(): Boolean = this?.dateTime is DateTimeParserOptions.Java?
967966

968967
internal fun ParserOptions?.shouldNotUseJavaTime(): Boolean = !shouldUseJavaTime()
969968

@@ -1002,8 +1001,6 @@ internal fun DateTimeFormat.Companion.fromPattern(pattern: String, formatType: K
10021001
* fails to parse any value, the next parser is tried. If all the others fail, the final parser
10031002
* simply returns the original string, leaving the column unchanged.
10041003
*
1005-
* Parsers that are [covered by][StringParser.coveredBy] other parsers are skipped.
1006-
*
10071004
* @param options options for parsing, like providing a locale or a custom date-time formatter
10081005
* @throws IllegalStateException if no valid parser is found (unlikely, unless the `String` parser is disabled)
10091006
* @return a new column with parsed values

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/api/parse.kt

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class ParseTests {
7979

8080
val parsed = date.parse(
8181
ParserOptions(
82-
dateTime = KotlinDateTimeParserOptions.withDateTimeFormat(format),
82+
dateTime = DateTimeParserOptions.Kotlin.withFormat(format),
8383
),
8484
).cast<LocalDate>()
8585

@@ -94,7 +94,7 @@ class ParseTests {
9494
with(date.toDataFrame()) {
9595
convert { date }.toLocalDate(format)[date.name] shouldBe parsed
9696
parse(
97-
ParserOptions(dateTime = KotlinDateTimeParserOptions.withDateTimeFormat(format)),
97+
ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withFormat(format)),
9898
)[date.name] shouldBe
9999
parsed
100100
}
@@ -117,7 +117,7 @@ class ParseTests {
117117

118118
val parsed = date.parse(
119119
ParserOptions(
120-
dateTime = JavaDateTimeParserOptions.withDateTimePattern<JavaLocalDate>(pattern),
120+
dateTime = DateTimeParserOptions.Java.withPattern<JavaLocalDate>(pattern),
121121
),
122122
).cast<JavaLocalDate>()
123123

@@ -129,14 +129,14 @@ class ParseTests {
129129
}
130130

131131
date.convertTo<JavaLocalDate>(
132-
parserOptions = ParserOptions(dateTime = JavaDateTimeParserOptions.withDateTimePattern(pattern)),
132+
parserOptions = ParserOptions(dateTime = DateTimeParserOptions.Java.withPattern(pattern)),
133133
) shouldBe parsed
134134
with(date.toDataFrame()) {
135135
convert { date }.to<JavaLocalDate>(
136-
parserOptions = ParserOptions(dateTime = JavaDateTimeParserOptions.withDateTimePattern(pattern)),
136+
parserOptions = ParserOptions(dateTime = DateTimeParserOptions.Java.withPattern(pattern)),
137137
)[date.name] shouldBe parsed
138138
parse(
139-
ParserOptions(dateTime = JavaDateTimeParserOptions.withDateTimePattern(pattern)),
139+
ParserOptions(dateTime = DateTimeParserOptions.Java.withPattern(pattern)),
140140
)[date.name] shouldBe
141141
parsed
142142
}
@@ -267,7 +267,7 @@ class ParseTests {
267267

268268
val parsed = dateTime.parse(
269269
ParserOptions(
270-
dateTime = ParserOptions.KotlinDateTime.withDateTimeFormat<LocalDateTime>(format),
270+
dateTime = DateTimeParserOptions.Kotlin.withFormat<LocalDateTime>(format),
271271
locale = locale,
272272
),
273273
).cast<LocalDateTime>()
@@ -286,7 +286,7 @@ class ParseTests {
286286
with(dateTime.toDataFrame()) {
287287
convert { dateTime }.toLocalDateTime(format)[dateTime.name] shouldBe parsed
288288
parse(
289-
ParserOptions(dateTime = ParserOptions.KotlinDateTime.withDateTimeFormat<LocalDateTime>(format)),
289+
ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withFormat<LocalDateTime>(format)),
290290
)[dateTime.name] shouldBe
291291
parsed
292292
}
@@ -310,7 +310,7 @@ class ParseTests {
310310

311311
val parsed = dateTime.parse(
312312
ParserOptions(
313-
dateTime = DateTimeParserOptions.Java.withDateTimePattern<JavaLocalDateTime>(pattern),
313+
dateTime = DateTimeParserOptions.Java.withPattern<JavaLocalDateTime>(pattern),
314314
locale = locale,
315315
),
316316
).cast<JavaLocalDateTime>()
@@ -327,18 +327,18 @@ class ParseTests {
327327

328328
dateTime.convertTo<JavaLocalDateTime>(
329329
ParserOptions(
330-
dateTime = DateTimeParserOptions.Java.withDateTimePattern<JavaLocalDateTime>(pattern),
330+
dateTime = DateTimeParserOptions.Java.withPattern<JavaLocalDateTime>(pattern),
331331
),
332332
) shouldBe parsed
333333
with(dateTime.toDataFrame()) {
334334
convert { dateTime }.to<JavaLocalDateTime>(
335335
ParserOptions(
336-
dateTime = DateTimeParserOptions.Java.withDateTimePattern<JavaLocalDateTime>(pattern),
336+
dateTime = DateTimeParserOptions.Java.withPattern<JavaLocalDateTime>(pattern),
337337
),
338338
)[dateTime.name] shouldBe parsed
339339
parse(
340340
ParserOptions(
341-
dateTime = DateTimeParserOptions.Java.withDateTimePattern<JavaLocalDateTime>(pattern),
341+
dateTime = DateTimeParserOptions.Java.withPattern<JavaLocalDateTime>(pattern),
342342
),
343343
)[dateTime.name] shouldBe
344344
parsed
@@ -349,7 +349,7 @@ class ParseTests {
349349
dateTime.parse(ParserOptions(locale = locale)) shouldBe parsed
350350
dateTime.convertTo<JavaLocalDateTime>(
351351
ParserOptions(
352-
dateTime = DateTimeParserOptions.Java.withDateTimePattern<JavaLocalDateTime>(pattern),
352+
dateTime = DateTimeParserOptions.Java.withPattern<JavaLocalDateTime>(pattern),
353353
),
354354
) shouldBe parsed
355355

@@ -366,7 +366,7 @@ class ParseTests {
366366
val pattern = "HH-mm-ss"
367367

368368
val parsed = time.parse(
369-
ParserOptions(dateTime = ParserOptions.KotlinDateTime.withUnicodePattern<LocalTime>(pattern)),
369+
ParserOptions(dateTime = DateTimeParserOptions.Kotlin.withPattern<LocalTime>(pattern)),
370370
).cast<LocalTime>()
371371

372372
parsed.type() shouldBe typeOf<LocalTime>()
@@ -380,7 +380,7 @@ class ParseTests {
380380
convert { time }.toLocalTime(pattern)[time.name] shouldBe parsed
381381
parse(
382382
options = ParserOptions(
383-
dateTime = ParserOptions.KotlinDateTime.withUnicodePattern<LocalTime>(pattern),
383+
dateTime = DateTimeParserOptions.Kotlin.withPattern<LocalTime>(pattern),
384384
),
385385
)[time.name] shouldBe parsed
386386
}
@@ -399,7 +399,7 @@ class ParseTests {
399399
val pattern = "HH-mm-ss"
400400

401401
val parsed = time.parse(
402-
ParserOptions(dateTime = ParserOptions.JavaDateTime.withDateTimePattern<JavaLocalTime>(pattern)),
402+
ParserOptions(dateTime = DateTimeParserOptions.Java.withPattern<JavaLocalTime>(pattern)),
403403
).cast<JavaLocalTime>()
404404

405405
parsed.type() shouldBe typeOf<JavaLocalTime>()
@@ -409,15 +409,15 @@ class ParseTests {
409409
second shouldBe 30
410410
}
411411
time.convertTo<JavaLocalTime>(
412-
ParserOptions(dateTime = ParserOptions.JavaDateTime.withDateTimePattern<JavaLocalTime>(pattern)),
412+
ParserOptions(dateTime = DateTimeParserOptions.Java.withPattern<JavaLocalTime>(pattern)),
413413
) shouldBe parsed
414414
with(time.toDataFrame()) {
415415
convert { time }.to<JavaLocalTime>(
416-
ParserOptions(dateTime = ParserOptions.JavaDateTime.withDateTimePattern<JavaLocalTime>(pattern)),
416+
ParserOptions(dateTime = DateTimeParserOptions.Java.withPattern<JavaLocalTime>(pattern)),
417417
)[time.name] shouldBe parsed
418418
parse(
419419
options = ParserOptions(
420-
dateTime = ParserOptions.JavaDateTime.withDateTimePattern<JavaLocalTime>(pattern),
420+
dateTime = DateTimeParserOptions.Java.withPattern<JavaLocalTime>(pattern),
421421
),
422422
)[time.name] shouldBe parsed
423423
}
@@ -431,10 +431,32 @@ class ParseTests {
431431
}
432432

433433
@Test
434-
fun `todo`() {
435-
val col = columnOf("2017-05-30T08:34:14.000Z")
434+
fun `parse date adjusting library`() {
435+
try {
436+
val col = columnOf("2017-05-30 08:34:14")
437+
val parsedJava = col.parse(
438+
ParserOptions(dateTime = DateTimeParserOptions.Java),
439+
)
440+
parsedJava.type shouldBe typeOf<JavaLocalDateTime>()
441+
442+
val parsedKotlin = col.parse(
443+
ParserOptions(dateTime = DateTimeParserOptions.Kotlin),
444+
)
445+
parsedKotlin.type shouldBe typeOf<LocalDateTime>()
446+
447+
val parsedDefault = col.parse()
448+
parsedDefault.type shouldBe typeOf<LocalDateTime>()
449+
450+
DataFrame.parser.dateTimeLibrary = ParseDateTimeLibrary.JAVA
451+
col.parse() shouldBe parsedJava
436452

437-
col.parse().print()
453+
DataFrame.parser.dateTimeLibrary = ParseDateTimeLibrary.KOTLIN
454+
col.parse() shouldBe parsedKotlin
455+
456+
col.parse().print()
457+
} finally {
458+
DataFrame.parser.resetToDefault()
459+
}
438460
}
439461

440462
@Test

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/samples/api/Modify.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,12 @@
33
package org.jetbrains.kotlinx.dataframe.samples.api
44

55
import io.kotest.matchers.shouldBe
6-
import kotlinx.datetime.LocalDateTime
7-
import kotlinx.datetime.format.DateTimeFormat
86
import org.jetbrains.kotlinx.dataframe.AnyFrame
97
import org.jetbrains.kotlinx.dataframe.DataFrame
108
import org.jetbrains.kotlinx.dataframe.DataRow
119
import org.jetbrains.kotlinx.dataframe.alsoDebug
1210
import org.jetbrains.kotlinx.dataframe.annotations.DataSchema
13-
import org.jetbrains.kotlinx.dataframe.api.JavaDateTimeParserOptions
14-
import org.jetbrains.kotlinx.dataframe.api.KotlinDateTimeParserOptions
11+
import org.jetbrains.kotlinx.dataframe.api.DateTimeParserOptions
1512
import org.jetbrains.kotlinx.dataframe.api.ParserOptions
1613
import org.jetbrains.kotlinx.dataframe.api.add
1714
import org.jetbrains.kotlinx.dataframe.api.addAll
@@ -274,7 +271,7 @@ class Modify : TestBase() {
274271
df.parse(
275272
options = ParserOptions(
276273
locale = Locale.CHINA,
277-
dateTime = JavaDateTimeParserOptions.withDateTimeFormatter<java.time.LocalDateTime>(formatter = DateTimeFormatter.ISO_WEEK_DATE)
274+
dateTime = DateTimeParserOptions.Java.withFormatter<java.time.LocalDateTime>(formatter = DateTimeFormatter.ISO_WEEK_DATE)
278275
)
279276
)
280277
// SampleEnd

dataframe-csv/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/DelimCsvTsvTests.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import io.kotest.matchers.shouldNotBe
1010
import kotlinx.datetime.LocalDateTime
1111
import org.intellij.lang.annotations.Language
1212
import org.jetbrains.kotlinx.dataframe.DataFrame
13-
import org.jetbrains.kotlinx.dataframe.api.JavaDateTimeParserOptions
13+
import org.jetbrains.kotlinx.dataframe.api.DateTimeParserOptions
1414
import org.jetbrains.kotlinx.dataframe.api.ParserOptions
1515
import org.jetbrains.kotlinx.dataframe.api.allNulls
1616
import org.jetbrains.kotlinx.dataframe.api.convert
@@ -525,8 +525,8 @@ class DelimCsvTsvTests {
525525
text = frenchCsv,
526526
delimiter = ';',
527527
parserOptions = ParserOptions(
528-
dateTime = JavaDateTimeParserOptions(locale = Locale.FRENCH)
529-
.withDateTimePattern("dd/MM/yyyy"),
528+
dateTime = DateTimeParserOptions.Java(locale = Locale.FRENCH)
529+
.withPattern("dd/MM/yyyy"),
530530
),
531531
)
532532

samples/src/test/kotlin/org/jetbrains/kotlinx/dataframe/samples/api/Read.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ import kotlinx.datetime.format.byUnicodePattern
1313
import kotlinx.datetime.format.char
1414
import org.jetbrains.kotlinx.dataframe.DataFrame
1515
import org.jetbrains.kotlinx.dataframe.DataRow
16-
import org.jetbrains.kotlinx.dataframe.api.JavaDateTimeParserOptions
17-
import org.jetbrains.kotlinx.dataframe.api.KotlinDateTimeParserOptions
16+
import org.jetbrains.kotlinx.dataframe.api.DateTimeParserOptions
1817
import org.jetbrains.kotlinx.dataframe.api.ParserOptions
1918
import org.jetbrains.kotlinx.dataframe.api.columnNames
2019
import org.jetbrains.kotlinx.dataframe.api.columnTypes
@@ -122,7 +121,7 @@ class Read {
122121
val df = DataFrame.readCsv(
123122
file,
124123
parserOptions = ParserOptions(
125-
dateTime = JavaDateTimeParserOptions.withDateTimePattern("dd/MMM/yy h:mm a"),
124+
dateTime = DateTimeParserOptions.Java.withPattern("dd/MMM/yy h:mm a"),
126125
),
127126
)
128127
// SampleEnd
@@ -135,7 +134,7 @@ class Read {
135134
val df = DataFrame.readCsv(
136135
file,
137136
parserOptions = ParserOptions(
138-
dateTime = KotlinDateTimeParserOptions.withDateTimeFormat(
137+
dateTime = DateTimeParserOptions.Kotlin.withFormat(
139138
LocalDate.Format {
140139
monthNumber(padding = Padding.SPACE); char('/'); day(); char(' '); year()
141140
},

0 commit comments

Comments
 (0)