java计算公司加班时间

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * @author: zhaoxu
 * @date: 2020/9/12 12:55
 */
public class CalculateTime {
    public ArrayList<String> xiabanlist = new ArrayList<String>();
    public ArrayList<String> shangbanlist = new ArrayList<String>();
    public ArrayList<String> yueri = new ArrayList<String>();
    String bc_date = "";
    String bc_date_end = "";
    int sum = 0;
    public ArrayList<Integer> index = new ArrayList<Integer>();
    byte[] buffer;
    String all;
    int length;
    String lt = "";

    public void login(String username, String password) {
        final String loginURL = "登录验证地址";
        String form = "portal_username=" + username + "&password=" + password + "&lt=xxx&_eventId=submit&username=" + username;
        final String headerAgent = "User-Agent";
        final String headerAgentArg = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36";
        try {
            CookieManager manager = new CookieManager();
            manager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER);
            CookieHandler.setDefault(manager);
            HttpURLConnection httpURLConnection = (HttpURLConnection) (new URL(loginURL).openConnection());
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.setRequestProperty(headerAgent, headerAgentArg);
            httpURLConnection.connect();
            if (httpURLConnection.getResponseCode() == 200) {
                InputStream inputStream = httpURLConnection.getInputStream();
                buffer = new byte[1024];
                while ((length = inputStream.read(buffer)) != -1) {
                    all = all + new String(buffer, 0, length, "UTF-8");
                }
                httpURLConnection.disconnect();
                // 通过第一次打开的页面获取lt
                lt = all.split("<input type=\"hidden\" name=\"lt\" value=\"")[1].split("\" />")[0];
                all = null;
                httpURLConnection = (HttpURLConnection) (new URL(loginURL).openConnection());
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.setRequestProperty(headerAgent, headerAgentArg);
                httpURLConnection.setDoOutput(true);
                httpURLConnection.connect();
                httpURLConnection.getOutputStream().write(form.replace("xxx", lt).getBytes("UTF-8"));
                httpURLConnection.getInputStream();
                httpURLConnection.disconnect();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public String calculate(String year1, String month1) throws IOException {
        xiabanlist.clear();
        shangbanlist.clear();
        yueri.clear();
        if (month1.equals("01") || month1.equals("03") || month1.equals("05") || month1.equals("07") || month1.equals("08") || month1.equals("10") || month1.equals("12")) {
            bc_date = year1 + "-" + month1 + "-01";
            bc_date_end = year1 + "-" + month1 + "-31";
        } else if (month1.equals("04") || month1.equals("06") || month1.equals("09") || month1.equals("11")) {
            bc_date = year1 + "-" + month1 + "-01";
            bc_date_end = year1 + "-" + month1 + "-30";
        } else if (Integer.valueOf(year1) % 4 == 0 && Integer.valueOf(year1) % 100 != 0 || Integer.valueOf(year1) % 400 == 0) {
            bc_date = year1 + "-" + month1 + "-01";
            bc_date_end = year1 + "-" + month1 + "-29";
        } else {
            bc_date = year1 + "-" + month1 + "-01";
            bc_date_end = year1 + "-" + month1 + "-28";
        }

        String url = "获取打卡数据地址";
        String dateJson = getJson(url);
        JSONObject json = JSONObject.parseObject(dateJson);
        JSONArray list = JSONArray.parseArray(json.get("jsonList").toString());
        String sblist = "";
        String xblist = "";
        for (int i = 0; i < list.size(); i++) {
            String times = list.get(i).toString();
            JSONObject times1 = JSONObject.parseObject(times);
            String status = times1.get("status").toString();
            String riqi = "";
            String xbtime = "";
            String sbtime = "";
            if (status == "1" && i == 0) {
                continue;
            }
            //如果当前节点是上班节点
            else if (status.equals("1")) {
                //如果当前日期的上班节点还没有查找成功
                if (xiabanlist.size() == shangbanlist.size() + 1) {
                    sblist = list.get(i).toString();
                    JSONObject sb = JSONObject.parseObject(sblist);
                    sbtime = sb.get("kq_time").toString();
                    //如果今天上班未打卡,忽略这一天的打卡记录
                    if (!sbtime.split(" ")[0].equals(yueri.get(yueri.size() - 1))) {
                        yueri.remove(yueri.size() - 1);
                        xiabanlist.remove(xiabanlist.size() - 1);
                        continue;
                    }
                    //如果当前节点拥有下个节点
                    if (i + 1 < list.size()) {
                        String next = list.get(i + 1).toString();
                        JSONObject ne = JSONObject.parseObject(next);
                        //如果下个节点是下班节点
                        if (!ne.get("status").toString().equals("1") && (sb.get("addr_status") == null || !sb.get("addr_status").toString().equals("1"))) {
                            //判断当前节点是否脱岗打卡
                            System.out.println(sbtime + "上班");
                            shangbanlist.add(sbtime);
                        }
                        //如果下个节点是脱岗打卡
                        else if (ne.get("addr_status").toString().equals("1")) {
                            System.out.println(sbtime + "上班");
                            shangbanlist.add(sbtime);
                        }
                    }
                    //当前节点为最后一个节点
                    else {
                        System.out.println(sbtime + "上班");
                        shangbanlist.add(sbtime);
                    }
                }
            }
            //如果当前节点是下班节点
            else if (status.equals("5")) {
                if (xiabanlist.size() + 1 == shangbanlist.size() + 1) {
                    xblist = list.get(i).toString();
                    JSONObject xb = JSONObject.parseObject(xblist);
                    xbtime = xb.get("kq_time").toString();
                    riqi = xb.get("bc_date").toString();
                    if (i + 1 < list.size()) {
                        String next = list.get(i + 1).toString();
                        JSONObject ne = JSONObject.parseObject(next);
                        String now = xb.get("kq_time").toString().split(" ")[0];
                        String n = ne.get("kq_time").toString().split(" ")[0];
                        //如果下个节点不是当前日期的节点
                        if (!n.equals(now)) {
                            continue;
                        }
                        //如果当前节点为非脱岗节点
                        else if (xb.get("addr_status") == null || !xb.get("addr_status").toString().equals("1")) {
                            System.out.println(xbtime + "下班");
                            xiabanlist.add(xbtime);
                            yueri.add(riqi);
                        }
                    }
                }
            }
            //如果当前节点是周六/周日的打卡记录节点
            else if (status.equals("6")) {
                if (xiabanlist.size() == shangbanlist.size() + 1) {
                    //当前节点拥有下一个节点
                    sblist = list.get(i).toString();
                    JSONObject sb = JSONObject.parseObject(sblist);
                    sbtime = sb.get("kq_time").toString();
                    //如果今天上班未打卡,忽略这一天的打卡记录
                    if (!sbtime.split(" ")[0].equals(yueri.get(yueri.size() - 1))) {
                        yueri.remove(yueri.size() - 1);
                        xiabanlist.remove(xiabanlist.size() - 1);
                        continue;
                    }
                    if (i + 1 < list.size()) {
                        String next = list.get(i + 1).toString();
                        JSONObject ne = JSONObject.parseObject(next);
                        //如果下一个节点为脱岗打卡
                        if (ne.get("address_status") != null && ne.get("addr_status").toString().equals("1")) {
                            System.out.println(sbtime + "上班");
                            shangbanlist.add(sbtime);
                        } else {
                            String now = sb.get("kq_time").toString().split(" ")[0];
                            String n = ne.get("kq_time").toString().split(" ")[0];
                            //如果下个节点不是当前日期的节点
                            if (!n.equals(now)) {
                                sbtime = sb.get("kq_time").toString();
                                System.out.println(sbtime + "上班");
                                shangbanlist.add(sbtime);
                            }
                        }
                    } else {
                        System.out.println(sbtime + "上班");
                        shangbanlist.add(sbtime);
                    }
                }
                //如果当前节点为第一个下班节点
                else if (xiabanlist.size() + 1 == shangbanlist.size() + 1) {
                    xblist = list.get(i).toString();
                    JSONObject xb = JSONObject.parseObject(xblist);
                    xbtime = xb.get("kq_time").toString();
                    riqi = xb.get("bc_date").toString();

                    if (i + 1 < list.size()) {
                        String next = list.get(i + 1).toString();
                        JSONObject ne = JSONObject.parseObject(next);
                        String now = xb.get("kq_time").toString().split(" ")[0];
                        String n = ne.get("kq_time").toString().split(" ")[0];
                        //如果下个节点不是当前日期的节点
                        if (!n.equals(now)) {
                            continue;
                        }
                        //如果当前节点为非脱岗节点
                        else if (xb.get("addr_status") == null || !xb.get("addr_status").toString().equals("1")) {
                            System.out.println(xbtime + "下班");
                            xiabanlist.add(xbtime);
                            yueri.add(riqi);
                            index.add(yueri.size() - 1);
                        }
                    }
                }
            }
        }
        int index2 = 0;
        for (int i = 0; i < yueri.size(); i++) {
            Integer hour = Integer.valueOf(shangbanlist.get(i).split(" ")[1].split(":")[0]);
            Integer minute = Integer.valueOf(shangbanlist.get(i).split(" ")[1].split(":")[1]);
            Integer second = Integer.valueOf(shangbanlist.get(i).split(" ")[1].split(":")[2]);
            Integer hour1 = Integer.valueOf(xiabanlist.get(i).split(" ")[1].split(":")[0]);
            Integer minute1 = Integer.valueOf(xiabanlist.get(i).split(" ")[1].split(":")[1]);
            Integer second1 = Integer.valueOf(xiabanlist.get(i).split(" ")[1].split(":")[2]);
            //将所有的秒加起来
            Integer sum1 = hour1 * 60 * 60 + minute1 * 60 + second1 - hour * 60 * 60 - minute * 60 - second - 9 * 60 * 60 - 30 * 60;
            //如果当前节点为周六/周日节点
            if (index2 < index.size() && i == index.get(index2)) {
                sum = sum + hour1 * 60 * 60 + minute1 * 60 + second1 - hour * 60 * 60 - minute * 60 - second;
                index2++;
            } else if (sum1 >= 30 * 60) {
                sum = sum + sum1;
            }
        }
        //计算小时/分钟/秒
        int xiaoshi = sum / 3600;
        int fenzhong = sum % 3600 / 60;
        int miao = sum % 3600 % 60;

        System.out.println("您的加班时间为: " + xiaoshi + "小时" + fenzhong + "分钟" + miao + "秒");

        return "您在" + year1 + "年" + month1 + "月" + "的加班时间为: " + xiaoshi + "小时" + fenzhong + "分钟" + miao + "秒";
    }

    private String getJson(String url) throws IOException {
        Document doc = Jsoup.connect(url)
                .ignoreContentType(true)
                .get();
        return doc.select("body").text();
    }

    public static void main(String[] args) throws IOException {
        File file = new File("1.txt");
        Scanner in = new Scanner(System.in);
        if(file.exists()){
            BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
            new CalculateTime().login(bufferedReader.readLine(), bufferedReader.readLine());
            new CalculateTime().calculate(bufferedReader.readLine(), bufferedReader.readLine());
        }
        else{
            System.out.println("请输入您的用户名:");
            String username = in.nextLine();
            System.out.println("请输入您的密码:");
            String password = in.nextLine();
            System.out.println("请输入要查询的年份:");
            String year = in.nextLine();
            System.out.println("请输入要查询的月份:");
            String month = in.nextLine();
            new CalculateTime().login(username, password);
            new CalculateTime().calculate(year, month);
        }

        System.out.println("按任意键退出。。。");
        in.nextLine();
        System.exit(0);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很高兴为您解答。这是一个比较复杂的问题,它可以通过使用 Java 的日期和时间 API 来实现。您可以使用 LocalDateTime 类来计算当前日期和时间,并使用 LocalDateTime.plusHours() 方法来计算加班时间。 ### 回答2: 要实现Java中的加班时间计算,我们可以使用日期时间库(如Javajava.time包)来处理日期和时间计算。以下是一个基本的实现示例: 1. 首先,我们需要获取上班开始时间和下班时间,可以将它们表示为LocalTime对象。假设上班时间为9:00 AM,下班时间为6:00 PM,可以使用以下代码: ```java LocalTime startWorkTime = LocalTime.of(9, 0); LocalTime endWorkTime = LocalTime.of(18, 0); ``` 2. 接下来,我们需要获取实际加班的开始时间和结束时间。假设加班开始时间为6:30 PM,结束时间为8:30 PM,可以使用以下代码: ```java LocalTime startOvertime = LocalTime.of(18, 30); LocalTime endOvertime = LocalTime.of(20, 30); ``` 3. 我们可以使用Duration类来计算加班时间长度。可以使用between方法来计算两个时间之间的持续时间,然后将结果打印出来。以下是示例代码: ```java Duration overtimeDuration = Duration.between(startOvertime, endOvertime); System.out.println("加班时长:" + overtimeDuration.toHours() + "小时 " + overtimeDuration.toMinutes() % 60 + "分钟"); ``` 这将打印出"加班时长:2小时 0分钟",表示加班时长为2小时。 4. 最后,我们可以检查加班时间是否超过设定的工作时间。可以使用Duration类的compareTo方法来比较加班时间和工作时间之间的差异。以下是示例代码: ```java Duration workDuration = Duration.between(startWorkTime, endWorkTime); int comparison = overtimeDuration.compareTo(workDuration); if (comparison > 0) { System.out.println("加班时间超过工作时间"); } else if (comparison < 0) { System.out.println("加班时间小于工作时间"); } else { System.out.println("加班时间等于工作时间"); } ``` 这将根据加班时间与工作时间的关系,打印出相应的结果。 这样,我们就实现了基本的Java加班时间计算功能。当然,根据实际需求,可能还需要考虑其他因素,如休息时间、调休等。 ### 回答3: 在Java中实现加班时间计算可以通过使用日期和时间相关的类和方法来完成。 下面是一种可能的实现方式: 首先,我们可以使用`LocalDateTime`类来表示加班开始和结束的时间点。该类提供了丰富的方法来处理日期和时间计算和操作。 例如,我们可以使用以下代码获取当前的日期和时间: ```java LocalDateTime currentDateTime = LocalDateTime.now(); ``` 对于加班的开始和结束时间,我们可以让用户输入或者从其他数据源获取。以下是一个例子,让用户输入加班开始和结束时间: ```java Scanner scanner = new Scanner(System.in); System.out.print("请输入加班开始时间(格式:yyyy-MM-dd HH:mm:ss):"); String startTimeString = scanner.nextLine(); System.out.print("请输入加班结束时间(格式:yyyy-MM-dd HH:mm:ss):"); String endTimeString = scanner.nextLine(); LocalDateTime startTime = LocalDateTime.parse(startTimeString, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); LocalDateTime endTime = LocalDateTime.parse(endTimeString, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); ``` 接下来,我们可以使用`Duration`类来计算两个时间点之间的时间差: ```java Duration duration = Duration.between(startTime, endTime); ``` 我们可以使用以下方法获取加班的小时和分钟数: ```java long hours = duration.toHours(); long minutes = duration.toMinutesPart(); ``` 最后,我们可以将结果打印出来: ```java System.out.println("加班时间为:" + hours + "小时" + minutes + "分钟"); ``` 整合所有的代码,以下是完整的实现: ```java import java.time.Duration; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Scanner; public class OvertimeCalculator { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入加班开始时间(格式:yyyy-MM-dd HH:mm:ss):"); String startTimeString = scanner.nextLine(); System.out.print("请输入加班结束时间(格式:yyyy-MM-dd HH:mm:ss):"); String endTimeString = scanner.nextLine(); LocalDateTime startTime = LocalDateTime.parse(startTimeString, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); LocalDateTime endTime = LocalDateTime.parse(endTimeString, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); Duration duration = Duration.between(startTime, endTime); long hours = duration.toHours(); long minutes = duration.toMinutesPart(); System.out.println("加班时间为:" + hours + "小时" + minutes + "分钟"); } } ``` 使用以上代码,用户可以输入加班的开始和结束时间,然后程序会计算加班的小时数和分钟数,并将结果打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值