从 DatePickerDialog 显示日期更容易

Display dates from DatePickerDialog more easier

现显示日期如下:

    val calendar = Calendar.getInstance()
    val currentYear = calendar.get(Calendar.YEAR)
    val currentMonth = calendar.get(Calendar.MONTH)
    val currentDay = calendar.get(Calendar.DAY_OF_MONTH)

    pickDate.setOnClickListener {
        val datePickDialog = DatePickerDialog(
            activity,
            DatePickerDialog.OnDateSetListener { view, year, month, dayOfMonth ->
                val dateFormat = SimpleDateFormat("d MMMM yyyy")
                calendar.set(year, month, dayOfMonth)
                val dateString = dateFormat.format(calendar.time)
                currentDateView.text = dateString
            },
            currentYear,
            currentMonth,
            currentDay
        )
        datePickDialog.show()
    }

可以做的更简单吗?

再简单不过了。两个简化建议:

  1. 使用 java.time,现代 Java 日期和时间 API。在这种情况下,我们用一个新的 class、LocalDate 替换两个旧的 class,CalendarDate。所以它为我们节省了一次转换。此外,您使用的 classes 早已过时,通常 java.time 更易于使用。
  2. 为用户的语言环境使用内置的本地化日期格式,而不是编写格式模式字符串。后者往往容易出错,使用内置格式更利于国际化。

下面的代码未经测试,可能有一两个错字,但你应该明白了。

    val date = LocalDate.now(ZoneId.of("Africa/Abidjan"))
    val currentYear = date.year
    val currentMonth = date.monthValue
    val currentDay = date.dayOfMonth

    val dateFormatter = DateTimeFormatter.ofLocalizedDate(TextStyle.MEDIUM)

    pickDate.setOnClickListener {
        val datePickDialog = DatePickerDialog(
            activity,
            DatePickerDialog.OnDateSetListener { view, year, month, dayOfMonth ->
                val selectedDate = LocalDate.of(year, month + 1, dayOfMonth)
                val dateString = selectedDate.format(dateFormatter)
                currentDateView.text = dateString
            },
            currentYear,
            currentMonth - 1,
            currentDay
        )
        datePickDialog.show()
    }

在我输入 Africa/Abidjan 的地方插入你想要的时区。使用 ZoneId.systemDefault 作为默认时区(这是您问题中使用的代码)。我还从事件侦听器中取出了格式化程序。无需每次都构造新的格式化程序

问题:我可以在 Android 上使用 java.time 吗?我在项目中使用 min API 21

是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置了现代 API。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,现代 classes 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 classes。

链接