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



我有一个变量日期,它是一个需要采用这种格式的字符串"yyyy-mm-dd";并且我从CALENDAR类型的变量获得数据,所以当月份或日期小于10时,它只返回数字"0";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.time通过desugaring

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

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

输出:

2021-02-06

您正在组合的格式,它符合ISO 8601标准(底部的链接),您可以从LocalDatetoString方法中获得它。这会更容易吗?

变量类型LocalDate和Calendar之间有什么区别?

旧的Calendar类和现代的LocalDate类之间有很多不同。我几乎很难想象有什么相似之处。以下列表并不详尽,但一些重要的区别是:

  • Calendar类试图成为每个日期和时间目的的一切,这使得设计变得庞大而复杂。LocalDate仅表示ISO或(Proreptic)公历中的日期,因此简单明了
  • Calendar表示时区中的日期和时间,该时区具有周编号方案等。正如我所说,LocalDate代表一个日期,所以它没有一天中的时间和时区。如果您需要这些,还有其他好的java.time类可供您使用
  • Calendar是可变的,并且不是线程安全的。LocalDate是不可变的,因此在设计上是线程安全的
  • Calendar是一个抽象的超类,适用于不同的日历系统:例如,朱利安/格里高利和泰国佛教。因此,当你知道你有一个Calendar对象时,你不知道它属于哪个日历系统。LocalDate是一个最终类,它不能有任何子类,它总是属于前格里高利日历(java.time也为其他日历系统中的日期提供了类)
  • CCD_ 14采用非常通用的CCD_ 15和CCD_。您经常会看到人们连续调用set3或7次来对对象进行一些修改。LocalDate是为一个流畅的API而设计的,你可以在一个语句中做myLocalDate.with(Month.APRIL).withDayOfMonth(30)之类的事情,一旦他们习惯了这种风格,大多数人就会觉得读起来很简单
  • Calendar.toString的输出实际上是不可读的。要格式化其值,您最初应该从中提取一个Date,并使用SimpleDateFormat(一个更麻烦的类)对其进行格式化,并且要通过获取Calendar的值,您需要记住根据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,即现代类的Backport(JSR310的ThreeTen;请参阅底部的链接)
  • 在旧的安卓系统上,可以使用desugaring或安卓版的ThreeTen Backport。它被称为ThreeTenABP。在后一种情况下,请确保使用子包从org.threeten.bp导入日期和时间类

链接

  • Oracle教程:日期时间,解释如何使用java.Time
  • Java规范请求(JSR)310,其中首次描述了java.time
  • ThreeTen Backport项目,java.time到Java 6和7的Backport(JSR-310的ThreeTen)
  • 通过降级提供Java 8+API
  • ThreeTenABP,安卓版ThreeTen背包
  • 问题:如何在Android项目中使用ThreeTenABP,有一个非常彻底的解释
  • 维基百科文章:ISO 8601

手动日期和时间格式化不是一个好主意,Java SDK包括许多类,可以简化日期和时间格式,SimpleDateFormat就是其中之一,请继续阅读文档。以下是关于如何使用的代码片段

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

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

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

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

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

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

这只是基本内容,请阅读文档以获得完整的理解。

最新更新