6

我正在为我的报告页面使用 java 日期 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 应该是上周五。

情况1

案例2

4

5 回答 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 并且 tehre 不是“第 0 天”,所以你从当前日期减去 4 天(第 2 行)。为了在星期六之后获得下一个星期五,您只需添加 6 天。

编辑:考虑到我看到的你的更新,如果是星期三,你不想在那之前有星期六,而是提前 1 周。如果已经是星期六,您将只返回 1 周。在这种情况下,您检查“daysBackToSat”是否为 7,然后保持原样,如果小于 7,则再添加 7。

        if(daysBackToSat<7) {
            daysBackToSat += 7;
        }
于 2013-06-21T07:27:20.140 回答
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)
于 2014-06-29T19:43:33.897 回答
1

java.time

使用Java 8 及更高版本中内置的java.time框架,这项工作更容易、更直接。大部分 java.time 功能已在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在ThreeTenABP进一步适应 Android 。

请参阅Oracle 教程以了解更多信息。

时间调节器

使用时间调整器将 a 操作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 ) ) ; 
于 2016-06-30T01:19:56.530 回答
0

我相信这个问题以及公认的答案很可能导致了TheDailyWTF 中的一个故事

正如那篇文章正确指出的那样,JavaDateCalendar类型是遗留的笑话,最好避免。正确的解决方案是使用 Joda Time 或其继任者,Java 8 及更高版本中内置的java.time框架(教程):

date.withDayOfWeek(DateTimeConstants.SATURDAY)

此外...SimpleDateFormat是整个标准库中线程安全性最低的类之一,是一场等待发生的灾难!

于 2016-04-26T11:27:48.427 回答
-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 天。

于 2013-06-21T07:27:44.507 回答