获取一周中的前一天

问题描述 投票:0回答:5

我在报告页面中使用 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 应该是上周五。

Case 1

Case 2

java date calendar simpledateformat
5个回答
1
投票
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;
}

1
投票

我最近开发了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)

1
投票

java.time

使用 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 ) ) ;



0
投票
TheDailyWTF 中的故事

正如该文章正确指出的那样,Java 的

Date

Calendar
类型是遗留笑话,最好避免。 正确的解决方案是使用 Joda Time 或其后继者,即 Java 8 及更高版本中内置的
java.time
框架(教程): date.withDayOfWeek(DateTimeConstants.SATURDAY)

另外... 
SimpleDateFormat

是整个标准库中线程安全性最差的类之一,并且是一场即将发生的灾难!

    


-1
投票

// 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 天。

© www.soinside.com 2019 - 2024. All rights reserved.