Java 计算最后一个星期日前一周以及从今天到最后一个星期日的时间
我在MySQL表中存储了一些天和小时作为时间戳。我现在要做的是检索特定用户从上周日到前一个周日(一周的工作)工作的每一天。另一个选项是从今天到上周日(本周)每天检索。有些员工不每天工作Java 计算最后一个星期日前一周以及从今天到最后一个星期日的时间,java,mysql,date,jdbc,Java,Mysql,Date,Jdbc,我在MySQL表中存储了一些天和小时作为时间戳。我现在要做的是检索特定用户从上周日到前一个周日(一周的工作)工作的每一天。另一个选项是从今天到上周日(本周)每天检索。有些员工不每天工作 我不知道如何用Java编写代码,也不知道是否有特定的MySQL函数。在Java中,您可以很好地使用Calendar类来查找上一个星期天: Calendar c=日历 c.set(Calendar.DAY/u周,Calendar.SUNDAY) datelastsdanday=c.getTime() 然后,您可以按
我不知道如何用Java编写代码,也不知道是否有特定的MySQL函数。在Java中,您可以很好地使用Calendar类来查找上一个星期天:
Calendar c=日历代码>
c.set(Calendar.DAY/u周,Calendar.SUNDAY)代码>
datelastsdanday=c.getTime()代码>
然后,您可以按每月的1周递减,以查找在此之前的星期日:
c.add(日历周/月-1)代码>
datesundaybeforethat=c.getTime()代码>tl;博士
java.time
现代方法使用java.time类
请记住,当前时区位于UTC时区
相反,在特定时区非常关键的情况下,您希望为特定的“星期几”值指定特定的日期。时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”
以大陆/地区
的格式指定,例如,或太平洋/奥克兰
。切勿使用3-4个字母的缩写,如EST
或IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)
让我们看看最后一个星期天,如果是星期天,今天除外。使用TemporalAdjusters
(注意复数)类中的TemporalAdjusters
实现。指定一个DayOfWeek
enum对象
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中完成。因此,让我们从ZonedDateTime
对象中提取Instant
对象,因为根据定义它们总是在UTC中
Instant start = zdtStart.toInstant() ;
Instant stop = zdtStop.toInstant() ;
如果您的JDBC驱动程序支持JDBC 4.2及更高版本,则可以通过和ResultSet::getObject
在查询中直接使用这些Instant
对象
此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 ) ;
String sql=“选择*from tbl_uuu其中col_>=?和col_>=?”;
PreparedStatement pstmt=conn.prepareStatement(sql);
pstmt.setObject(1,开始);
pstmt.setObject(2,停止);
结果集rs=pstmt.executeQuery();
…
Instant Instant=rs.getObject(…,Instant.class);
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
从哪里获得java.time类
- ,及以后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 该项目专门为Android采用了ThreeTen Backport(如上所述)
- 看
该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。谢谢。因此,代码的前3行将检索最后一个星期天的数据。例如,今天是2012年4月27日(星期五)。此变量中的日期为2012年4月22日?再次感谢,我已经尝试过这个代码,它的工作原理有点不同。第一行应该是Calendar c=Calendar.getInstance;第二行返回第二天,而不是前一天。但我很感激你的帮助。现在我可以解决这个问题并找到一个合适的解决方案。哦,是的,我忘记了“.getInstance()”,我的坏:/s至于第二天的返回,可能会有一个内部实现子功能,它会转到下一个星期天或上一个星期天,具体取决于一周的当前日期。。。因此,对代码的这一部分稍加保留。这个答案忽略了时区这一关键问题<代码>日历
隐式使用JVM的当前默认时区。这意味着你的结果会有所不同;不好的。
Instant start = zdtStart.toInstant() ;
Instant stop = zdtStop.toInstant() ;
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 ) ;