在一周内获得前一天

时间:2013-06-21 07:12:47

标签: java date calendar simpledateformat

我在我的报告页面使用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

5 个答案:

答案 0 :(得分: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天。

编辑:考虑到你的更新,我看到,如果是星期三,你不希望在那之前的星期六,但提前一周。如果已经是星期六,你只会回来一周。 在这种情况下,你检查,如果“daysBackToSat”是7,那么保持这种方式,如果它小于7,那么再添加7。

        if(daysBackToSat<7) {
            daysBackToSat += 7;
        }

答案 1 :(得分: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)

答案 2 :(得分:0)

我相信这个问题和接受的答案很可能导致story in TheDailyWTF

正如该文正确指出的那样,Java的DateCalendar类型是传统的笑话,最好避免使用。正确的解决方案是使用Joda Time或其后继者,Java 8及更高版本(java.time)内置的Tutorial框架:

date.withDayOfWeek(DateTimeConstants.SATURDAY)

另外...... SimpleDateFormat是整个标准库中防线最少的类之一,是一场等待发生的灾难!

答案 3 :(得分:0)

java.time

使用Java 8及更高版本中内置的java.time框架,这项工作更容易,更直接。许多java.time功能已经被反向移植到Java 6&amp; ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

请参阅Oracle Tutorial了解详情。

时间调整器

使用Temporal Adjuster操纵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 ) ) ; 

答案 4 :(得分:-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天前再查看两个日期。