计算最后一个星期日之前一周,从今天到最后一个星期日

时间:2012-04-26 06:56:14

标签: java mysql date jdbc

我在MySQL表中存储了几天和几小时的时间戳。我现在要做的是检索特定用户每天从上周日到周日(工作一周)工作的每一天。另一种选择是从今天到最后一个星期日(当前周)每天检索。有些员工每天都不工作。

我不知道如何用Java编写代码或者是否有特定的MySQL函数。

2 个答案:

答案 0 :(得分:3)

在Java中,您可以很好地使用Calendar类来查找上一个星期日:

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();

答案 1 :(得分:0)

TL;博士

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

java.time

现代方法使用java.time类。

请记住TIMESTAMP data type in MySQL是UTC时区。

相比之下,您需要特定时区值的特定日期值的特定日期。时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如ESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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

接下来我们需要结束时间。实际上,不是结束时间。确定本周的第二个结尾是很棘手的。日期时间工作的常见做法是使用半开放方法来定义时间跨度。在半开放中,开头是包含,而结尾是独占。这意味着我们希望从一个星期天的第一个时刻开始,然后跑到但不包括下一个星期天的第一个时刻。

请注意,您不能在SQL中使用BETWEEN进行半开放,因为该命令已关闭,这意味着开头和结尾都包含在内。

ZonedDateTime zdtStop = previousSunday.atStartOfDay( z ) ;

MySQL中的查询将以UTC格式完成。因此,让我们从Instant对象中提取ZonedDateTime个对象,因为它们始终是UTC中的定义。

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

如果您的JDBC驱动程序支持JDBC 4.2及更高版本,则可以通过PreparedStatement::setObjectInstant直接在查询中使用这些ResultSet::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及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore