Comprobar la hora en java

Iniciado por Zoik, 28 Agosto 2013, 16:05 PM

0 Miembros y 1 Visitante están viendo este tema.

Zoik

Bien tengo una duda, quería hacer un programa en el cual a la 1 de la mañana me apagase el ordenador por temas de ahorrar luz.

Bien esto ya esta echo, lo e echo con un bucle que me comprueba constantemente que hora es, y en el momento que la hora se pone a 1, me sale del bucle y me inicializa el apagado, simple.

El problema que tengo es el siguiente, en el momento que me empieza el bucle me consume demasiados recursos, y me gustaría saber si hay algún método para poder comprobar la hora constantemente sin necesidad de gastar tanta máquina.

Un saludo y gracias de antemano.

Juan.

Claro que lo hay:

Tread.sleep(3600000);

Cada hora comprobará que hora es y ahorrará recursos

1mpuls0

Cita de: Juan. en 28 Agosto 2013, 16:15 PM
Claro que lo hay:

Tread.sleep(3600000);

Cada hora comprobará que hora es y ahorrará recursos

Pero por ejemplo y si el programa inicia a las 11:30 a las 12:30 volverá a comprobar y de ahí hasta la 1:30 xD.
abc

1mpuls0

#3
Me pareció interesante y me dediqué a tirar código un rato xD

Código (java) [Seleccionar]

/*
* Autor: 1mpuls0
*/
package basic;

import java.util.Calendar;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.DateFormat;
import java.text.ParseException;
import java.lang.Thread;

public class CheckTime {
   public static void main(String args[]) {
       Date currentDate = getCurrentDate();
       Date lastDate = stringToDate("2013-08-28 12:10:20");
       long diff = differenceTime(currentDate, lastDate);
       System.out.println(currentDate);
       System.out.println(lastDate);
       System.out.println(diff);
       new ThreadShutdown(diff).run();
   }
       
   public static long differenceTime(Date currentDate, Date lastDate) {
       long msDifference = 0;
       long msCurrentDate = currentDate.getTime();
       long msLastDate = lastDate.getTime();
       if(msLastDate>msCurrentDate)
           msDifference = Math.abs(msCurrentDate - msLastDate);
       return msDifference;
   }
   
   public static Date getCurrentDate() {
       String currentDate;
       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       Date date = new Date();
       currentDate = dateFormat.format(date);
       try {
           dateFormat.parse(currentDate);
       } catch (ParseException ex) {
           ex.printStackTrace();
       }
       return date;
   }
   
   public static Date stringToDate(String strDate) {
       SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       Date date = null;
       try {
           date = format.parse(strDate);
       } catch (ParseException ex) {
           date = getCurrentDate();
       }
       return date;
   }
}

class ThreadShutdown implements Runnable {
   private final Thread thread;
   private long time = 0;

   public ThreadShutdown(long time) {
       this.time = time;
       thread = new Thread(this);
       thread.start();
   }

   private void process() {
       System.out.println("APAGATE!!!");
   }

   public void run() {
       try {
           thread.sleep(time);
           process();
       }
       catch (InterruptedException ie) {
           System.out.println("Error: "+ie);
       }
   }
}


Solo hacen falta un par de validaciones pero ya depende de que deseas que haga, por ejemplo cuando llegue a escribir la fecha de apagado menor a la fecha y hora actual.


Espero que te funcione.

Saludos.
abc

Zoik

#4
Bueno en media hora que e podido sacar me a salido esto, esto es lo que yo queria, esta un poco guarro, pero bueno ya lo pulire cuando tenga tiempo.

Muchas gracias a los dos, que bonito es tu codigo Darhius xD.

package main;

import graphicinterface.Interface;

import javax.swing.SwingUtilities;

import protocols.Timer;

public class Main {

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){  
           public void run(){
            new Timer();
               new Interface();
           }  
       });  
}

}


package protocols;

import java.util.Calendar;

public class Timer {
public Timer(){
protocolOfHour();
}

public boolean protocolOfHour(){
Calendar calendario = Calendar.getInstance();
int hora;
do{
try {
Thread.sleep(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
hora =calendario.get(Calendar.HOUR_OF_DAY);
}while(hora!=1);
return true;
}
}


package protocols;

import java.io.IOException;

public class Protocol {

public Protocol(){
exec("REG ADD HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run /v ShutdownProgramado /t REG_SZ /f /d 'C:\\Users\\Zoik\\Documents\\shutdown.jar'");
exec("shutdown -p -f");
}

private void exec(String cmd) {
try {
Runtime.getRuntime().exec(cmd);
}
catch (IOException e) {
System.out.println("El apagado a fallado");
}
}
}


package graphicinterface;

import java.util.Timer;
import java.util.TimerTask;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import protocols.Protocol;

public class Interface extends JFrame{
private static final long serialVersionUID = 1L;
JLabel text = new JLabel("");
JPanel panel = new JPanel();
int segundos = 300;
Timer timer;

public Interface(){
setSize(300,35);
setLocationRelativeTo(null);
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setResizable(false);
setUndecorated(true);
setAlwaysOnTop(true);
setVisible(true);
addLabel();
contador();
}

class RemindTask extends TimerTask {
public void run() {
 segundos--;
 if(segundos < 0){
 text.setText(String.valueOf("El ordenador se apagará en 0 segundos"));
   new Protocol();
 }else{
 text.setText(String.valueOf("El ordenador se apagará en "+segundos+" segundos"));
 }
}
}

private void addLabel(){
panel.setBorder(BorderFactory.createLoweredBevelBorder());
add(panel);
panel.add(text);
}

private void contador(){
timer = new Timer();
 timer.schedule(new RemindTask(),0, 1*1000);
}

}


Un saludo y gracias de nuevo.

EDITO: ¿Como pongo el código con líneas numeradas como tu Darhius?

1mpuls0

Cita de: Zoik en 28 Agosto 2013, 21:46 PM
Muchas gracias a los dos, que bonito es tu codigo Darhius xD.

Gracias. Aunque algunas librerías están de más y olvidé borrarlas, es que hice pruebas con Calendar
Voy a mejorarlo y hacer pruebas entre timer y thread para ver cual resulta mejor en cuanto al consumo de recursos.
Después de eso le pondré una interfaz  ;D y postearé el código ya mejorado.

Cita de: Zoik en 28 Agosto 2013, 21:46 PM
EDITO: ¿Como pongo el código con líneas numeradas como tu Darhius?

Cuando respondes un mensaje hay un select que por default dice GeSHi ahí seleccionas el lenguaje y colocas el código dentro de las etiquetas que saldrán.


abc