Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算最后一个星期日前一周以及从今天到最后一个星期日的时间_Java_Mysql_Date_Jdbc - Fatal编程技术网

Java 计算最后一个星期日前一周以及从今天到最后一个星期日的时间

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() 然后,您可以按

我在MySQL表中存储了一些天和小时作为时间戳。我现在要做的是检索特定用户从上周日到前一个周日(一周的工作)工作的每一天。另一个选项是从今天到上周日(本周)每天检索。有些员工不每天工作


我不知道如何用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 ) ;