Kotlin:如何从MM/yy格式的输入中获取日期?

ukdjmx9f  于 2022-12-13  发布在  Kotlin
关注(0)|答案(2)|浏览(177)

如何解析MM/yy格式的字符串(例如:12/22)来Kotlin日期对象?没有日值的日期对象是否可以存在?我尝试了以下方法:

import java.time.LocalDate
import java.util.Locale
import java.time.format.DateTimeFormatter
import java.time.format.DateTimeFormatterBuilder

fun main() {
    var str_date = "06/22"
    
    val df: DateTimeFormatter = DateTimeFormatterBuilder()
    .appendPattern("MM/yy")
    .toFormatter(Locale.ENGLISH);
    
    println(LocalDate.parse(str_date, df))
}

这会导致下列例外状况:
java.time.format.DateTimeParseException: Text '06/22' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {Year=2022, MonthOfYear=6},ISO of type java.time.format.Parsed

um6iljoc

um6iljoc1#

Java LocalDate需要日、月和年,因此无法解析06/22
如果您只需要解析月份和年份,则可以使用YearMonth

import java.time.YearMonth
import java.time.format.DateTimeFormatterBuilder
import java.util.Locale

fun main() {
  val monthYearFormatter = DateTimeFormatterBuilder()
    .appendPattern("MM/yy")
    .toFormatter(Locale.ENGLISH)

  // prints 2022-06
  println(YearMonth.parse("06/22", monthYearFormatter))

  // error: Invalid value for MonthOfYear (valid values 1 - 12): 13
  println(YearMonth.parse("13/22", monthYearFormatter))
}
nlejzf6q

nlejzf6q2#

编辑答案,抱歉之前贴错了答案。
如错误所示,LocalDate需要有关date的信息,而'MM/yy'不完全包括。
所以下面有3个答案:

  1. YearMonth是一个更好的选择来格式化模式。你可以得到一个YearMonth然后选择一个day来得到一个LocalDate
    1.将默认值day_of_month设置为LocalDate
    1.得到一个java.util.Date,然后得到一个LocalDate
// 1
    val fmt = DateTimeFormatter.ofPattern("MM/yy")
    val ym = YearMonth.parse("12/22", fmt)
    val dt = ym.atEndOfMonth()
    println(dt)// 2022-12-31

    // 2
    val fmt2 = DateTimeFormatterBuilder()
        .appendPattern("MM/yy")
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
        .toFormatter()
    val dt2 = LocalDate.parse("12/22", fmt2)
    println(dt2)// 2022-12-01

    // 3 get a java.util.Date
    val fmt3 = SimpleDateFormat("MM/yy")
    val dt3 = fmt3.parse("12/22")
    println(dt3)  // Thu Dec 01 00:00:00 CST 2022

相关问题