首页 > 解决方案 > 在 kotlin 中以 yyyy-mm-dd 形式获取 1 个月前的日期

问题描述

我需要获取今天的日期和一个月前的日期,格式为 yyyy-mm-dd

要获得今天的日期,我有:

val todaysDate = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(Date()).toString()

哪个可以按我的意愿工作:

2021-05-12

但是我不知道如何以相同的格式获取一个月前的日期。我在另一个线程中找到了这个函数,但它返回“Mon Apr 12 18:24:37 GMT+02:00 2021”

    fun getDaysAgo(daysAgo: Int): Date {
        val calendar = Calendar.getInstance()
        calendar.add(Calendar.DAY_OF_YEAR, -daysAgo)

        return calendar.time
    }

如何以相同的格式获取一个月前的日期?谢谢。

编辑:

使用 getDaysAgo 函数对我来说解决方案实际上非常简单

var daysAgo= SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(getDaysAgo(30)).toString()

但是,下面的 Ole 答案可能更好,也是推荐的方法。对我不起作用,因为它需要 api 级别 26 (android) 和 23 上的 im。

标签: javadatedatetimekotlin

解决方案


来自 java.time 的 LocalDate

  1. 将日期保留和处理为LocalDate对象,而不是字符串。
  2. 只有当您需要提供字符串输出时,才将您的格式LocalDate设置为适当格式的字符串。

与评论中的许多人一样,我建议您使用现代 Java 日期和时间 API java.time 进行日期工作。在 Java 代码中,仍然保持处理和格式化分开,并相信你自己翻译成 Kotlin:

public static LocalDate get1MonthAgo() {
    return LocalDate.now(ZoneId.systemDefault()).minusMonths(1);
}

public static String formatToIso8601(LocalDate date) {
    return date.toString();
}

假设您需要将 1 个月前的日期输出为字符串,请使用如下两种方法:

    LocalDate oneMonthAgo = get1MonthAgo();

    String oneMonthAgoFormatted = formatToIso8601(oneMonthAgo);
    System.out.println(oneMonthAgoFormatted);

当我今晚在我的时区跑步时,输出是:

2021-04-12

我正在利用您要求的格式是 ISO 8601(国际格式)的事实,并且LocalDate(以及 java.time 的其他日期时间类)从他们的toString方法中产生 ISO 8601 格式。所以我们需要不指定格式化程序。这很好,因为摆弄格式模式字符串总是容易出错。

链接


推荐阅读