Java 如何使用我的代码查找日期之间的天数?

Java 如何使用我的代码查找日期之间的天数?,java,sql,date,Java,Sql,Date,下面是我的代码,它将数据库中存储的日期与当前系统日期进行检查,并计算天数,如果天数小于180天,它将打印其他内容,不打印任何内容,这段代码在普通java程序中工作得很好,没有使用swings概念如果它与swing程序一起使用我更改了sql查询以检查根据文本字段中输入的部门和员工姓名从数据库中获取日期,我在jbutton中编码了这段代码,在输出中,它只打印当前系统日期,但不计算所选日期和当前系统日期之间的天数,朋友这是我面临的问题,请需要您的帮助朋友们…提前感谢 private void jBut

下面是我的代码,它将数据库中存储的日期与当前系统日期进行检查,并计算天数,如果天数小于180天,它将打印其他内容,不打印任何内容,这段代码在普通java程序中工作得很好,没有使用swings概念如果它与swing程序一起使用我更改了sql查询以检查根据文本字段中输入的部门和员工姓名从数据库中获取日期,我在jbutton中编码了这段代码,在输出中,它只打印当前系统日期,但不计算所选日期和当前系统日期之间的天数,朋友这是我面临的问题,请需要您的帮助朋友们…提前感谢

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/leave", "root", "");
        Statement stm = conn.createStatement();
        ResultSet rs = stm.executeQuery("select * from staff where depmt='" + txt1 + "' AND staffs='" + txt2 + "'");
        Calendar javaCalendar = null;
        String currentDate = "";
        javaCalendar = Calendar.getInstance();
        currentDate = javaCalendar.get(Calendar.DATE) + "/" + (javaCalendar.get(Calendar.MONTH) + 1) + "/" + javaCalendar.get(Calendar.YEAR);

        int cdate = javaCalendar.get(Calendar.DATE);
        int cmonth = (javaCalendar.get(Calendar.MONTH) + 1);
        int cyear = javaCalendar.get(Calendar.YEAR);
        int z = 0;
        int date = 0, month = 0, year = 0;

        System.out.println("Current Date\t" + currentDate);
        System.out.println("\n");
        while (rs.next()) {
            date = rs.getInt(3);
            month = rs.getInt(4);
            year = rs.getInt(5);
            System.out.println("Random Date\t" + date + "/" + month + "/" + year + "\n");
            int d = (date - cdate);
            int m = month - cmonth;
            int y = year - cyear;
            int d1 = java.lang.Math.abs(d);
            int d2 = java.lang.Math.abs(m);
            int d3 = java.lang.Math.abs(y);
            z = d1 + (d2 * 30) + (d3 * 365);
            if (z >= 180) {
                System.out.println("something");
                0
            } else {
                System.out.println("nothing");
            }
        }

    } catch (Exception e) {
        System.out.println(e.getMessage());
        //e.printStackTrace();
    }

    // TODO add your handling code here:
}

您应该真正使用准备好的语句,因为这样您的查询很容易被sql注入。 取代currentdate的具体字符串的日期格式化程序

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = formatter.format(todaysDate);
此外,您似乎没有关闭连接,这可能是另一个问题。
是否有任何理由将日期存储在3个单独的列中?

计算两个日期之间的日差的算法已被破坏。它不考虑不同的月长或闰年

不幸的是,Java Calendar根本不提供此功能。所以,你们要么应用你们自己的算法并不容易,但在网络上有一些关于如何将公历日期映射到历元日的资料,要么你们这样使用:

LocalDate db = new LocalDate(year, month, date);
int days = Days.daysBetween(db, LocalDate.now()).getDays();

请注意,如果db日期在将来,结果将为负值。毕竟,您可以大大缩短代码并放弃所有日历内容,这对计算持续时间非常不利。

尝试一下,将返回值从毫秒改为天

public static int daysBetween(Date dateFrom, Date dateTo){
      return (int)( (dateTo.getTime() - dateFrom.getTime()) / (1000 * 60 * 60 * 24));
      }
试试这个:

一天的开始 如果从午后的日期时间对象开始,通过计算秒*分钟*小时*180返回180天,那么最终将排除180天前的日期时间,而我认为您希望将其包括在内。你应该注意一天的开始

时区 这个问题和其他答案都忽略了时区问题。时区定义了一天的开始。鉴于上述关于一天开始的观点,时区是一个相关的组成部分

避免使用java.util.Date和.Calendar 与java捆绑在一起的java.util.Date和.Calendar类是出了名的麻烦。避开它们。取而代之的是使用Java8中的新java.time包

乔达时间 下面是一些使用Joda Time 2.3的示例代码

请注意,虽然Joda Time DateTime对象类似于java.util.Date,但DateTime确实知道自己分配的时区

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime dateTimeInQuestion = new DateTime( 2013, 6, 5, 4, 3, 2, timeZone );
DateTime now = new DateTime( timeZone );
DateTime hundredEightyDaysAgo = now.minusDays( 180 ).withTimeAtStartOfDay();
boolean isExpired = dateTimeInQuestion.isBefore( hundredEightyDaysAgo );
转储到控制台

System.out.println( "dateTimeInQuestion: " + dateTimeInQuestion );
System.out.println( "now: " + now );
System.out.println( "hundredEightyDaysAgo: " + hundredEightyDaysAgo );
System.out.println( "isExpired: " + isExpired );
当运行时

问题日期时间:2013-06-05T04:03:02.000+02:00 现在:2014-03-10T07:34:26.937+01:00 第一百天:2013-09-11T00:00:00.000+02:00 我猜是真的
因为在命令行应用程序中也可以使用相同的方法。或者servlet作为Swing应用,似乎Swing与这个问题并不相关。删除标记。删除时间戳,而不是日/月/年…并停止那些荒谬的编辑:-/@devbj。这是因为当你转换成swing时你改变了东西,而不是因为swing。此外,使用日历为您计算。这是日历的范围。另外请注意,我的名字不是“安德烈”。是的,这样计算起来就很容易了,因此我可以得到日期。必须使用日历进行操作。参考您是否有任何链接,我可以从中获得如何使用当前系统日期计算从存储日期算起的天数的参考。。
System.out.println( "dateTimeInQuestion: " + dateTimeInQuestion );
System.out.println( "now: " + now );
System.out.println( "hundredEightyDaysAgo: " + hundredEightyDaysAgo );
System.out.println( "isExpired: " + isExpired );