Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/03/2011, 14:03
Yackpott
 
Fecha de Ingreso: febrero-2011
Mensajes: 10
Antigüedad: 13 años, 10 meses
Puntos: 2
Información APORTE Programa que saca diferencias de fechas con código fuente

Este es un programa que te pide una fecha y te devuelve que día cae y cuantos días han pasado o faltan. Funciona con fechas desde -2.000.000.000 a 2.000.000.000.

Tiene todo el código fuente y comentarios de cada parte del programa.
Todo en el archivo [URL="http://www.megaupload.com/?d=MEWFHWU6"]Fecha.jar[/URL]

Código:
/* Por Yackpott
 * Para ForosDelWeb.com
 */
import java.awt.*;
import java.awt.event.*;

class ventanaFecha implements ActionListener,WindowListener{
	//Las variables
	Label label1;
	Label label2;
	TextField text1;
	public ventanaFecha(){
		//Ventana frame
		Frame a = new Frame();
		//Ordena la ventana
		GridBagLayout layout = new GridBagLayout();
		GridBagConstraints gbc = new GridBagConstraints();
		//Los pixeles
		a.setSize(220,140);
		//Para que este centrado
		a.setLocationRelativeTo(null);
		//No se pueda agrandar la ventana
		a.setResizable(false);
		//No tiene decoración
		a.setUndecorated(false);
		//Para que sea visivle
		a.setVisible(true);
		//Agrega a frame el ordenador de ventanas (GridBagLayout)
		a.setLayout(layout);
		//Un escuchador de ventana para que más adelante se cierre
		a.addWindowListener(this);
		//Titulo
		a.setTitle("Fecha");
		//Distancia de los bordes de la ventana con las cosas
		gbc.weightx = 0.5;
		gbc.weighty = 0.5;
		//Posición
		gbc.gridx = 0;
		gbc.gridy = 0;
		//Se agrega el texto
		a.add(new Label("   Escriba una fecha (DD/MM/AAAA...)"),gbc);
		//Se crea el expacio para introducir palabras para 16 caracteres
		text1 = new TextField(16);
		gbc.weightx = 0.5;
		gbc.weighty = 0.5;
		//Posición uno más abajo que el anterior
		gbc.gridx = 0;
		gbc.gridy = 1;
		//Se agrega el textfield
		a.add(text1,gbc);
		//Se agrega el escuchador para que al apretar "enter" se obtenga el texto
		text1.addActionListener(this);
		//Otro texto
		label1 = new Label();
		gbc.weightx = 0.5;
		gbc.weighty = 0.5;
		gbc.gridx = 0;
		gbc.gridy = 2;
		//El texto que se va a agregar, lo espacios los puse para poner despues el día de semana
		label1.setText("Día semana:               ");
		//Se agraga el texto
		a.add(label1,gbc);
		label2 = new Label();
		gbc.weightx = 0.5;
		gbc.weighty = 0.5;
		gbc.gridx = 0;
		gbc.gridy = 3;
		//El texto de los días
		label2.setText("Días:                             ");
		//Se agrega el texto
		a.add(label2,gbc);
	}
	public void	actionPerformed(ActionEvent evt) {
		//Obtiene el texto
		String x = text1.getText();
		//Convierte el texto antiguo a nada "null"
		text1.setText(null);
		//Contador del arrglo de más abajo
		int i=0;
		//Arreglo
		int[]a=new int[3];
		//Aca se le saca al textfield los "/" y se obtiene los numero
		while(i<2){
			String y = x.substring(0,x.indexOf('/'));
			a[i]=Integer.parseInt(y);
			x=x.replaceFirst(y,"");x=x.replaceFirst("/","");
			i++;
		}
		a[2]=Integer.parseInt(x);
		//LLama a las funciónes que entragan el día de semana y los días y los imprime en la ventana
		label1.setText("Día semana: "+diaSemana(a[2],a[1],a[0]));
		label2.setText("Días: "+diaFecha (a[2],a[1],a[0]));
	}
	static public String diaSemana(int A1,int M1,int D1){
		/*Java acepta meses del 0(Enero)-11(Diciembre),
		 *porlo que al ponerle a 12(Diciembre) un menos 
		 *1 que en 11 el cual java lo lee.
		 */
		M1 = M1 - 1;
		//Crea objeto para manejar fechas con los datos indroducidos
		java.util.GregorianCalendar fecha1 = new java.util.GregorianCalendar(A1,M1,D1);
		//Lo mismo con la fecha "minima"(porque más adelante se modifica para que no sea la minima)
		java.util.GregorianCalendar fecha2 = new java.util.GregorianCalendar(1970,0,1);
		//Fecha en días
		long ndias = (fecha1.getTimeInMillis()) / (1000 * 60 * 60 * 24);
		//Arregla un error de un día que se produce cuando la fecha es menor a la fecha mínima
		if((fecha1.getTimeInMillis())<(fecha2.getTimeInMillis())){
			ndias = ndias - 1;
		}
		/*Se arregla para que no alla fecha minima ni maxima
		 * aunque en verdad si hay -2.000.000.000 a 2.000.000.000
		 */
		while (ndias<7){
			ndias = ndias + 7;
		}
		while (ndias>=14){
			ndias = ndias - 7;
		}
		//Devuelve que dia cae con respecto a la fecha minima la cual es jueves
		if(ndias%7==4)return "Lunes";
		else if(ndias%7==5)return "Martes";
		else if(ndias%7==6)return "Miércoles";
		else if(ndias%7==0)return "Jueves";
		else if(ndias%7==1)return "Viernes";
		else if(ndias%7==2)return "Sábado";
		else if(ndias%7==3)return "Domingo";
		else return "error";
	}
	static public long diaFecha(int A1,int M1,int D1){
		//Lo mismo que antes
		M1 = M1-1;
		//Objetos para trabajar fechas
		java.util.GregorianCalendar fecha1 = new java.util.GregorianCalendar(A1,M1,D1);
		//Nos da la fecha actual en milisegundos.
		long fecha2 = System.currentTimeMillis();
		//Diferencia de la fecha actual y la antigua
		long diferencia = fecha2 - fecha1.getTimeInMillis();
		//Lo convierte a días
		long dias = diferencia / (1000 * 60 * 60 * 24);
		//Esto es para arreglar un problema cuando la fecha actual es menor a la "antigua"
		if(fecha2<fecha1.getTimeInMillis()){
			dias = dias - 1;
			return dias;
		}
		else{
			return dias;
		}
	}
	//Windows listener, se tienen que implementar todos lo metodos
	public void windowDeactivated(WindowEvent asd){}
	public void windowDeiconified(WindowEvent asd){}
	public void windowIconified(WindowEvent asd){}
	public void windowActivated(WindowEvent asd){}
	public void windowOpened(WindowEvent asd){}
	public void windowClosed(WindowEvent asd){}
	public void windowClosing(WindowEvent asd){
		System.exit(0); //Esto es para que al apretar en signo X la ventana se cierre
	}
	static public void main(String[] args){
		ventanaFecha vF = new ventanaFecha(); //Crea el objeto ventanaFecha (el unico objeto)
	}
}

Última edición por Yackpott; 29/03/2011 a las 14:02 Razón: Poner link.