groovy - 上一年的开始
问题描述
**DATE FROM:**
def format=new java.text.SimpleDateFormat("yyyyMMdd")
def cal=Calendar.getInstance()
cal.get(Calendar.YEAR);
cal.set(Calendar.MONTH, 0);
cal.set(Calendar.DAY_OF_MONTH, 31);
[format.format(cal.getTime())]
**DATE TO:**
def format=new java.text.SimpleDateFormat("yyyyMMdd")
def cal=Calendar.getInstance()
cal.add(Calendar.DAY_OF_MONTH,-cal.get(Calendar.DAY_OF_MONTH))
[format.format(cal.getTime())]
当年份发生变化时(2020 - 2021) - 它将上一年的 1 月与今年的 1 月混淆,
我必须进行更正,以便在 1 月(12 月报告)中提取 31.01 - 31.12 期间的数据。上一年的。
作业是错误的,因为它从 31.01.2021 到 31.12.2020 提取数据
// retrieve details of the current date
def cal = Calendar.instance;
def currentYear = cal.get(Calendar.YEAR);
def currentMonth = cal.get(Calendar.MONTH);
// set the instance to the start of the previous month
if ( currentMonth == 0 ) {
cal.set(currentYear-1, 11, 1);
} else {
cal.set(currentYear, (currentMonth-1), 1);
}
// extract the date, and format to a string
Date previousMonthStart = cal.time;
String previousMonthStartFormatted = previousMonthStart.format('yyyy-MM-dd');
解决方案
如果您要查找的只是标题中的上一年的开始,那么以下代码:
import java.time.*
def startOfPreviousYear = LocalDate.now()
.withDayOfMonth(1)
.withMonth(1)
.minusYears(1)
println startOfPreviousYear
def againStartingFromJanuary = LocalDate.of(2021, 1, 15)
.withDayOfMonth(1)
.withMonth(1)
.minusYears(1)
println againStartingFromJanuary
演示了实现此目的的一种方法。运行时,将打印(now
今天的日期为 2021.Mar.10):
─➤ groovy solution.groovy
2020-01-01
2020-01-01
评论后更新
您可以通过以下方式获得上个月和当前月份的结束:
import java.time.*
def endOfPreviousMonth = LocalDate.now()
.withDayOfMonth(1)
.minusDays(1)
def endOfCurrentMonth = LocalDate.now()
.withDayOfMonth(1)
.plusMonths(1)
.minusDays(1)
println "end of last month: ${endOfPreviousMonth}"
println "end of current month: ${endOfCurrentMonth}"
当前日期打印:
end of last month: 2021-02-28
end of current month: 2021-03-31
或者如果我们在一月份:
def endOfPreviousMonth = LocalDate.of(2021, 1, 15)
.withDayOfMonth(1)
.minusDays(1)
def endOfCurrentMonth = LocalDate.of(2021, 1, 15)
.withDayOfMonth(1)
.plusMonths(1)
.minusDays(1)
println "end of last month: ${endOfPreviousMonth}"
println "end of current month: ${endOfCurrentMonth}"
打印:
─➤ groovy solution.groovy
end of last month: 2020-12-31
end of current month: 2021-01-31
一般来说,如果您的目标基于当前日期(如上个月、下个月、三个月前等),则在处理日期时,您应该尽可能避免使用手动日期算法。使用 java 交给你的 api:s。日期类处理滚动年份、滚动月份、滚动天数、闰年等,所有这些你真的不想花时间自己解决的问题。
推荐阅读
- mysql - MySQL中具有多个连接的一行结果
- javascript - 在 NestJS 中获取 Auth0 用户信息
- java - 如何在没有 Eclipse 的情况下运行 Eclipse 项目
- java - 使用 VM-options 启动 jar
- html - 使用 XPath 从网站中抓取伪元素
- angular - 将 Angular Material Progress 条链接到 Observable 值
- ruby-on-rails - 应用程序无法在 heroku 上加载,无法破译 heroku 日志来判断错误是什么
- html - CSS3 使用 :before, :after 来制作嵌入和开始的阴影
- slider - 带 2 个输入的基础范围滑块?
- jenkins - Jenkins:管道上游触发器在多分支项目中停止工作