java - 在 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。
解决方案
来自 java.time 的 LocalDate
- 将日期保留和处理为
LocalDate
对象,而不是字符串。 - 只有当您需要提供字符串输出时,才将您的格式
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 格式。所以我们需要不指定格式化程序。这很好,因为摆弄格式模式字符串总是容易出错。
链接
- Oracle 教程:日期时间解释如何使用 java.time。
- 维基百科文章:ISO 8601
推荐阅读
- javascript - 无法在一页中插入 03 弹出窗口
- spring - 带有 Azure AD 的 Spring Security 不会重定向
- python - 如何通过 Selenium Python 刮取 AWS SSO 凭证
- python - 如何在python中创建一个标志以包含/排除数据框中的行
- javascript - 使用 JavaScript 提交时从 DOM 中删除所有空表单字段
- arrays - 在 Python 中使用带有 return 或 print 的 array.sort() 时返回空数组
- r - R:如何根据多列重塑宽
- reactjs - onChange useState 后一字符
- angular - 显示更多/显示更少 ngFor 按钮点击数据
- python - 如何找到两个圆之间的距离。OPENCV.Python