我存储一些日期和时间在我的MySQL表的时间戳。 我想现在要做的就是找回每天特定用户从上周日工作,直到周日之前(工作一个星期)。 而另一种选择是检索从今天起,每天直到上周日(本周)。 有些员工不日常工作。
我不知道我怎么能这样用Java或者是否有具体的MySQL的功能代码。
我存储一些日期和时间在我的MySQL表的时间戳。 我想现在要做的就是找回每天特定用户从上周日工作,直到周日之前(工作一个星期)。 而另一种选择是检索从今天起,每天直到上周日(本周)。 有些员工不日常工作。
我不知道我怎么能这样用Java或者是否有具体的MySQL的功能代码。
在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();
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
.with( TemporalAdjusters.previous( DayOfWeek.SUNDAY ) )
现代的方法使用java.time类。
请记住, 在MySQL TIMESTAMP数据类型是UTC时区。
相反,你要为特定的某一天的周值特定日期,其中一个特定的时间段是至关重要的。 时区是在确定的日期是至关重要的。 对于任何给定的时刻,日期由区全球各地的变化。 例如,在午夜后几分钟法国巴黎是新的一天,同时还“昨天”在蒙特利尔魁北克 。
指定适当的时区名称 ,格式为continent/region
,如America/Montreal
, Africa/Casablanca
,或Pacific/Auckland
。 切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,不规范,甚至不是唯一的(!)。
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::setObject
和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和更高版本。 这些类取代麻烦的老传统日期时间类,如java.util.Date
, Calendar
,和SimpleDateFormat
。
该乔达-时间的项目,现在在维护模式 ,建议迁移到java.time类。
要了解更多信息,请参阅甲骨文教程 。 和搜索堆栈溢出了很多例子和解释。 规范是JSR 310 。
从哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time。 该项目是为将来可能增加的java.time试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。