我在MySQL表中存储了几天和几小时的时间戳。我现在要做的是检索特定用户每天从上周日到周日(工作一周)工作的每一天。另一种选择是从今天到最后一个星期日(当前周)每天检索。有些员工每天都不工作。
我不知道如何用Java编写代码或者是否有特定的MySQL函数。
答案 0 :(得分:3)
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)
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
.with( TemporalAdjusters.previous( DayOfWeek.SUNDAY ) )
现代方法使用java.time类。
请记住TIMESTAMP data type in MySQL是UTC时区。
相比之下,您需要特定时区值的特定日期值的特定日期。时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的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::setObject
和Instant
直接在查询中使用这些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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。