我在报告页面中使用 java date java.util.Calendar 和 java.text.SimpleDateFormat。
我想始终将开始日期设置为上一个星期六,并将结束日期设置为该星期六之后的星期五。
我编写了一个java代码来检查这一点并按如下方式执行,但我确信它的逻辑是错误的
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -7);
setToDate(sdf.format(cal.getTime()));
cal.add(Calendar.DATE, -6);
setFromDate(sdf.format(cal.getTime()));
如何获取之前的 FromDate(yyyy-mm-dd) 和 ToDate(yyyy-mm-dd),其中 FromDate 应该是上周六,ToDate 应该是上周五。
int daysBackToSat = cal.get(Calendar.DAY_OF_WEEK );
cal.add(Calendar.DATE, daysBackToSat * -1);
System.out.println(sdf.format(cal.getTime()));
在第 1 行中,您会得到一个数字,表示一周中的当前日期,其中 1 表示星期日,7 表示星期六,6 表示星期五,依此类推。因此,如果今天是星期三,您将得到 4。因为星期六是 7,没有“第 0 天”,您从当前日期减去 4 天(第 2 行)。为了得到星期六后的下一个星期五,您只需添加 6 天。
编辑:考虑到您的更新,我发现如果是星期三,您不想在那之前的星期六,而是提前 1 周。如果已经是周六了,那么你只能回去 1 周。 在这种情况下,您检查“daysBackToSat”是否为 7,则保持原样,如果小于 7,则再添加 7。
if (daysBackToSat < 7) {
daysBackToSat += 7;
}
我最近开发了Lamma Date,它非常适合这个用例。
Date today = new Date(2014, 7, 1);
Date to = today.previous(DayOfWeek.FRIDAY); // Date(2014,6,27)
Date from = to.previous(DayOfWeek.SATURDAY); // Date(2014,6,21)
使用 Java 8 及更高版本中内置的 java.time 框架,这项工作更加容易和直接。许多 java.time 功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。
请参阅 Oracle 教程了解更多信息。
使用 时间调整器 将
LocalDate
操纵到另一个 LocalDate
实例中。 TemporalAdjusters
类(注意复数)为您的目的提供预定义的调节器,利用方便的 DayOfWeek
枚举:
请注意,时区对于确定当前日期至关重要。你的问题忽略了这个问题。对于任何给定时刻,全球各地的日期因时区而异。例如,巴黎的午夜过后几分钟就是新的一天,而蒙特利尔仍然是“昨天”。
如果省略,则隐式应用 JVM 当前的默认时区。此默认值可以在运行时随时更改(!),因此最好明确指定预期/所需的时区。
ZoneId zoneId = ZoneId.of( "America/Montreal" ) ;
LocalDate localDate = LocalDate.now( zoneId ) ;
上周六,接下来是周五
星期六该怎么办。此代码使用 previous
,但您的业务规则可能需要
previousOrSame
,具体取决于您。LocalDate previousSaturday = localDate.with( TemporalAdjusters.previous( DayOfWeek.SATURDAY ) ) ;
下一个要求是获取上周六之后的周五。我们可以添加直到周五的天数,但既然我们知道了时间调整器,为什么还要费心计算呢?
LocalDate fridayFollowingPreviousSaturday = previousSaturday.with( TemporalAdjusters.next( DayOfWeek.FRIDAY ) ) ;
Date
和
Calendar
类型是遗留笑话,最好避免。 正确的解决方案是使用 Joda Time 或其后继者,即 Java 8 及更高版本中内置的 java.time框架(教程):
date.withDayOfWeek(DateTimeConstants.SATURDAY)
另外...
SimpleDateFormat
是整个标准库中线程安全性最差的类之一,并且是一场即将发生的灾难!
// Get milliseconds of 1 day
long millisecOneDay = TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);
// Get actual date
Date today = new Date();
// 0 Sunday, 1 Monday...
int day = today.getDay(); // It use a deprecated method
// Previous saturday
long millisecPrevSat = today.getTime() - (day + 1) * millisecOneDay;
// Previous friday
long millisecNextFri = millisecPrevSat + (6 * millisecOneDay);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// setToDate(sdf.format(new Date(millisecPrevSat)));
System.out.println("PREV SAT: " + sdf.format(new Date(millisecPrevSat)));
// setFromDate(sdf.format(new Date(millisecNextFri)));
System.out.println("NEXT FRID: " + sdf.format(new Date(millisecNextFri)));
您可以检查今天是否是星期五,然后将两个日期再向后移动 7 天。