在上周日之前,从今天到最后一个星期日计算1周(Calculate 1 week before the

2019-09-27 18:38发布

我存储一些日期和时间在我的MySQL表的时间戳。 我想现在要做的就是找回每天特定用户从上周日工作,直到周日之前(工作一个星期)。 而另一种选择是检索从今天起,每天直到上周日(本周)。 有些员工不日常工作。

我不知道我怎么能这样用Java或者是否有具体的MySQL的功能代码。

Answer 1:

在Java中,你可以把日历类用好找上一个星期日:

Calendar c = Calendar;
c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
Date lastSunday = c.getTime();

那么你可以通过1个WEEK_OF_MONTH递减之前找到星期日:

c.add(Calendar.WEEK_OF_MONTH, -1);
Date sundayBeforeThat = c.getTime();



Answer 2:

TL;博士

LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
         .with( TemporalAdjusters.previous( DayOfWeek.SUNDAY ) ) 

java.time

现代的方法使用java.time类。

请记住, 在MySQL TIMESTAMP数据类型是UTC时区。

相反,你要为特定的某一天的周值特定日期,其中一个特定的时间段是至关重要的。 时区是在确定的日期是至关重要的。 对于任何给定的时刻,日期由区全球各地的变化。 例如,在午夜后几分钟法国巴黎是新的一天,同时还“昨天”在蒙特利尔魁北克 。

指定适当的时区名称 ,格式为continent/region ,如America/MontrealAfrica/Casablanca ,或Pacific/Auckland 。 切勿使用3-4个字母的缩写,如ESTIST ,因为它们不是真正的时区,不规范,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

让我们的最后一个星期天,今天排除如果它是一个星期天。 使用TemporalAdjuster在发现执行TemporalAdjusters (注意复数)类。 指定DayOfWeek的枚举对象。

LocalDate previousSunday = today.with( TemporalAdjusters.previous( DayOfWeek.SUNDAY ) ) ;

获取进一步星期天回来。

LocalDate startingSunday = previousSunday.minusWeeks( 1 ) ;

我们需要确切的时刻,而不是整个日期。 获取当天的第一时刻。 不要以为这意味着时间的日00:00:00。 异常,如夏令时(DST)表示,当天可能在像01:00:00时开始。 让java.time明白这一点。

ZonedDateTime zdtStart = startingSunday.atStartOfDay( z ) ;

接下来,我们需要的结束时间。 其实,不是结束时间。 确定周的一瞬间结局是棘手的。 在日期 - 时间的工作通常的做法是使用半开的办法,明确时间跨度。 在半开的,刚开始是包容性的 ,而结局是排他的 。 这意味着我们要开始在一个星期天的第一时刻跑起来,但不包括下列周日的第一刻。

请注意,您不能使用BETWEEN在SQL对半开,因为该命令是封闭的,这意味着双方开始和结束的包容性。

ZonedDateTime zdtStop = previousSunday.atStartOfDay( z ) ;

在MySQL查询将在UTC来完成。 因此,让我们提取Instant从目标ZonedDateTime对象,因为他们总是在UTC的定义。

Instant start = zdtStart.toInstant() ;
Instant stop = zdtStop.toInstant() ;

如果您的JDBC驱动程序支持JDBC 4.2和更高版本,可以直接使用这些Instant的查询通过对象PreparedStatement::setObjectResultSet::getObject

这个SQL代码是未经测试,但应该指向你在正确的方向。

String sql = "SELECT * from tbl_ WHERE col_ >= ? AND col_ < ? ; " ;
PreparedStatement pstmt = conn.prepareStatement( sql ) ;
pstmt.setObject( 1 , start ) ;
pstmt.setObject( 2 , stop ) ; 
ResultSet rs = pstmt.executeQuery() ;
…
    Instant instant = rs.getObject( … , Instant.class ) ;

关于java.time

该java.time框架是建立在Java 8和更高版本。 这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar ,和SimpleDateFormat

该乔达-时间的项目,现在在维护模式 ,建议迁移到java.time类。

要了解更多信息,请参阅甲骨文教程 。 和搜索堆栈溢出了很多例子和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • 的Java SE 8Java SE的9 ,后来
    • 内置。
    • 具有捆绑实现标准Java API的一部分。
    • Java的9增加了一些小的功能和修复。
  • Java SE 6中Java SE 7中
    • 多的java.time功能后移植到Java 6和7在ThreeTen-反向移植
  • Android的
    • 所述ThreeTenABP项目适应于Android ThreeTen-反向移植 (上面提到的)特异性。
    • 请参阅如何使用ThreeTenABP ...

ThreeTen-额外项目与其他类扩展java.time。 该项目是为将来可能增加的java.time试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多 。



文章来源: Calculate 1 week before the last Sunday and from today to last Sunday