Kotlin-如何从日历中获取 "dd" 的日期和 "mm" 的月份?

Kotlin- How to get the day as "dd" and the month as "mm" from Calendar?

我有一个可变日期,它是一个字符串,需要采用这种格式“yyyy-mm-dd”,我从 CALENDAR 类型的变量中获取数据,所以当月份或日期小于 10 时,它只有 returns 数字“d”或“m”。 这是我现在正在做的代码,不是很好。有更好的方法吗?

val date: String
if(cal.get(Calendar.MONTH)<9) {
           date = cal.get(Calendar.YEAR).toString() + "-0" +
(cal.get(Calendar.MONTH) + 1).toString() + "-" + cal.get(Calendar.DAY_OF_MONTH).toString()
                        }  
else {date = cal.get(Calendar.YEAR).toString() + "-"
 + (cal.get(Calendar.MONTH) + 1).toString() + "-" + cal.get(Calendar.DAY_OF_MONTH).toString()}

谢谢

手动格式化日期和时间不是一个好主意,Java SDK 包含许多 类 来简化日期和时间格式化,SimpleDateFormat 就是其中之一,去吧提前阅读文档。 以下是有关如何使用它的代码片段

val formatter = SimpleDateFormat("yyyy-MM-dd")
val formattedDate = formatter.format(Calendar.getInstance().time)

“yyyy-MM-dd”是格式模式。每个字符具有以下含义

  1. y - 年(yyyy 因为我们需要 4 个字符作为年份,如 2021 年)

  2. M(大写 M) - 年中的月份(MM 因为我们至少需要两个字符来表示月份(所以如果月份小于 10,则写成 01,04 等))

  3. dd - 月中的第几天(我们写 dd 是因为我们至少需要两个字符来表示与月相同的日期)

  4. -(连字符)- 它是一个分隔符

这只是基本的东西,阅读文档以获得完整的理解。

java.time 通过脱糖

考虑使用 java.time,现代 Java 日期和时间 API,进行日期格式化工作。在Java中,我能写的是:

    LocalDate someDate = LocalDate.of(2021, Month.FEBRUARY, 6);
    String dateString = someDate.toString();
    System.out.println(dateString);

输出:

2021-02-06

你拼出来的格式,符合ISO 8601标准(link在下),你可以从LocalDatetoString方法获取.可以更简单吗?

What is the difference between the variable type LocalDate and Calendar?

旧的Calendar和现代的LocalDateclass有很多区别。我几乎很难想到任何相似之处。以下列表并不详尽,但一些重要的区别是:

  • Calendar class 试图成为每个日期和时间目的的一切,这使得设计变得庞大而复杂。 LocalDate 仅适用于 ISO 或(预想的)公历中的日期,因此简单明了。
  • A Calendar 表示具有周编号方案等的时区中的日期和时间。正如我所说,LocalDate 代表一个日期,因此它没有时间和时区。如果您需要这些,java.time 中还有其他 class 供您使用。
  • A Calendar 是可变的并且不是线程安全的。 LocalDate 是不可变的,因此在设计上是线程安全的。
  • Calendar 是 classes 的抽象超 class,适用于不同的日历系统:例如 Julian/Gregorian 和泰国佛教。所以当你知道你有一个 Calendar 对象时,你不知道它属于哪个日历系统。 LocalDate 是一个最终的 class,它不能有任何子class,并且它始终属于公历(java.time 还提供 class es 用于其他日历系统中的日期)。
  • Calendar 有一个老式的设计,具有非常通用的 getset 方法。你会经常看到有人连续调用 3 次或 7 次 set 来对对象进行一些修改。 LocalDate 是为流利的 API 设计的,您可以在一个语句中做类似 myLocalDate.with(Month.APRIL).withDayOfMonth(30) 的事情,一旦他们习惯了这种风格,大多数人会觉得很容易阅读。
  • Calendar.toString 的输出几乎不可读。要格式化它的值,您最初应该从中提取一个 Date 并使用 SimpleDateFormat 格式化它(一个更麻烦的 class),并获得 [=13] 的值=] 通过你需要记住根据 Calendar 设置 TimeZone 和可能的 SimpleDateFormat 的其他属性。 LocalDate.toString 如我们所见,以 ISO 8601 格式输出。

问题:java.time 不需要 Android API 26 级吗?

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

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置现代 API。
  • 在非 Android Java 6 和 7 中获得 ThreeTen Backport,现代 classes 的 backport(ThreeTen for JSR 310;参见 link s 在底部)。
  • 在较旧的 Android 上使用脱糖或 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。在后一种情况下,请确保使用子包从 org.threeten.bp 导入日期和时间 classes。

链接