小可爱~ 发表于 2019-9-16 00:20

【原创源码】【Java】实现时间段强制关机, 还有玩手机时间控制软件推荐!坚持不熬夜

本帖最后由 小可爱~ 于 2019-9-23 14:45 编辑

天天熬夜使用电脑, 身体一天不如一天



快过来, 我帮你戒掉这个坏习惯:lol, 不过觉得有更好方案的朋友, 希望能够分享出来给大家, 谢谢了{:1_893:}
来, 这是所有要用到的东西, 一个jar包, 一个脚本, 还有个脚本快捷方式




代码写的不好, 想要自己修改的, 给, 这是您的源码:

package com.zhazha;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**
* @author zhazha
* @version 1.0.0
* @date 2019/9/15 18:28
* @msg
**/
public class Demo {

    private static Logger logger = LogManager.getLogger(Demo.class);

    /**
   * 至少保留两秒时间
   */
    private static final String CMD = "shutdown -s -t 2 ";

    private static final String PATH = "logs\\lastTime.txt";

    /**
   * 简单的自动关机
   */
    // private static void simpleAutoShutdown() {
    //   Calendar calendar = Calendar.getInstance();
    //   int hour = calendar.get(Calendar.HOUR_OF_DAY);
    //   if (hour >= 0 && hour <= 5) {
    //         try {
    //             Runtime.getRuntime().exec(CMD);
    //         } catch (IOException e) {
    //             e.printStackTrace();
    //         }
    //   }
    // }

    private static void autoShutdown(String[] args) throws IOException {

      if (null == args || args.length != 1) {
            args = new String;
            args = "0:30";
      }

      /**
         * 检测上次关闭系统时间
         */
      if (readLastOffSystemTime()) {
            return;
      }


      String strCloseTime = args;
      String[] split = strCloseTime.split(":");
      if (split.length != 2 || "".equals(split) || "".equals(split)) {
            logger.error("定时关机时间格式不对");
            return;
      }
      logger.info("定时关机时间: " + split + " : " + split);


      Calendar c1 = Calendar.getInstance();

      Integer offHour = Integer.valueOf(split);
      Integer offMinute = Integer.valueOf(split);

      int hour = c1.get(Calendar.HOUR_OF_DAY);
      int minute = c1.get(Calendar.MINUTE);

      Calendar c2 = Calendar.getInstance();
      if (offHour < hour) {
            c2.add(Calendar.DAY_OF_MONTH, 1);
      }
      else if (offHour == hour && offMinute < minute) {
            c2.add(Calendar.DAY_OF_MONTH, 1);
      }

      c2.set(Calendar.HOUR_OF_DAY, offHour);
      c2.set(Calendar.MINUTE, offMinute);

      long sub = c2.getTimeInMillis() - c1.getTimeInMillis();
      logger.info("还有" + (sub / 1000 / 60) + "分钟关闭系统");


      threadOffSystem(true, sub);
    }

    private static boolean readLastOffSystemTime() throws IOException {
      /**
         * 检测上次关机时间文档是否存在, 如果不存在则自动创建
         */
      File file = new File(PATH);
      if (!file.exists()) {
            if (!file.createNewFile()) {
                logger.error("文件创建失败, 请手动在程序运行目录下创建logs\\lastTime.txt文件夹和文档");
                throw new IOException("文件创建失败, 请手动在程序运行目录下创建logs\\lastTime.txt文件夹和文档");
            }
      }

      /**
         * 读取上次关机时间
         */
      BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
      try (bufferedReader) {
            String lastTime = bufferedReader.readLine();

            // 检测关机格式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            long lastTimeMis = sdf.parse(lastTime).getTime();
            long curTimeMis = new Date().getTime();
            long flag = curTimeMis - lastTimeMis;
            if (flag <= (5 * 60 * 60 * 1000)) {
                threadOffSystem(false, 0);
                return true;
            }

      } catch (Exception e) {
            e.printStackTrace();
      }
      return false;
    }

    /**
   * 线程关机
   *
   * @param flag
   *         true 正常线程关机,false 文件读取关机, 不需要重写最后关机时间
   * @param minute
   *         多少秒关机
   */
    private static void threadOffSystem(boolean flag, long minute) {
      System.out.println("关机");
      new Timer().schedule(new TimerTask() {
            public void run() {
                BufferedWriter writer = null;
                try {
                  Runtime.getRuntime().exec(CMD);
                  if (flag) {
                        writer = new BufferedWriter(new FileWriter(PATH));
                        writer.write(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
                  }
                } catch (Exception e) {
                  e.printStackTrace();
                  logger.error("关闭系统失败");
                } finally {
                  if (writer != null) {
                        try {
                            writer.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                  }
                }
                System.exit(0);
            }
      }, minute);
    }

    /**
   * 输入格式 1:1
   *
   * @param args
   */
    public static void main(String[] args) throws IOException {
      autoShutdown(args);
      // simpleAutoShutdown();
    }

}


来, 这是vbs脚本(至于为啥不用 cmd 是因为开机的时候程序启动比较多, 所以cmd启动窗口会很慢, 有机会把 cmd 关掉, 当然隐藏也行, 随你 :victory:)
Set ws = CreateObject("Wscript.Shell")
ws.run "AutoShutdown.jar 1:0",vbhide

好, 源码就这么简单, 剩下的都是电脑上的操作了

第一步: 打开vbs脚本文件看到下面的这行代码, 里面的 1:0 就是关机时间, 你要改啥就该啥, 不过必须是合理的时间, 如 00:30 , 别给我整个 25:61 分 哈
不过可能会有一分钟的延迟哦~~~
ws.run "AutoShutdown.jar 1:0",vbhide
为啥不用计算机管理器里面的任务计划功能, 因为我懒~~~;www
第二步: 把编译好的windows可直接运行的jar包和vbs脚本放在相同的目录下



第三步: 直接给他丢到启动选里面(我win7, 启动目录: C:\Users\XXXX\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup)




第四步: 重启电脑看下, jar包所在的目录下面是不是多了个文件, 看下里面的内容, 就知道成功没




来, 这是项目的源码和编译后的jar程序(程序在out文件夹中):
链接:https://pan.baidu.com/s/1l5byOCwhrZeLQF9Ow0OYHA

提取码:7jyg
哦, 对了, 还有一款定时段控制手机的软件不错, 只要时间一到, 软件就把手机锁住咯, 直到你设置的结束时间
当然白名单内的app可以自己设置, 一个月有三次取消锁机的机会~~~
番茄TODO, (这是我从360手机助手下载来的哦, 不知道安全不, 所以记住这个图标自己去手机上查找吧~~~):handshake

链接:https://pan.baidu.com/s/1TVPLicIQpsCenj9RkY0ufQ
提取码:zq9k

老板, 电脑关机了, 是电脑自己动的手, 我没按~~~可以下班了么???
   

小可爱~ 发表于 2019-9-16 00:44

doufan 发表于 2019-9-16 00:39
我还是控制不住,最好是把电网还是电信之类的给搞停了

emmm, 还是身体重要, 睡前一个小时, 就不要碰电脑和手机, 去运动运动, 做做仰卧起坐之类的运行, 把自己整累了, 就控制住了{:1_901:}

追逐太阳 发表于 2019-9-17 09:09

小可爱~ 发表于 2019-9-16 00:44
emmm, 还是身体重要, 睡前一个小时, 就不要碰电脑和手机, 去运动运动, 做做仰卧起坐之类的运行, 把自己整 ...

厉害,我也喜欢那样的作息,但是有的时候就是控制不住

睡梦成瘾 发表于 2019-9-16 00:29

6666666666

Crazy开发仔 发表于 2019-9-16 00:33

java实现这个功能,确实有点大材小用了。略显繁琐

小可爱~ 发表于 2019-9-16 00:38

Crazy开发仔 发表于 2019-9-16 00:33
java实现这个功能,确实有点大材小用了。略显繁琐

哈哈, 是的, 手头没c/c++编译器;www

doufan 发表于 2019-9-16 00:39

我还是控制不住,最好是把电网还是电信之类的给搞停了{:1_909:}

A陈尘 发表于 2019-9-16 07:31

小孩就是闹钟⏰

ZHISHANCHUNGYI 发表于 2019-9-16 07:37

感谢分享

zaijiankelu 发表于 2019-9-16 13:48

凌乱的思绪 发表于 2019-9-16 13:51

厉害了,感谢
页: [1] 2
查看完整版本: 【原创源码】【Java】实现时间段强制关机, 还有玩手机时间控制软件推荐!坚持不熬夜