O Calendar nao esta alterando o objeto date

7 respostas
R

Ola,

Eu estou tentando fazer um projeto simples, escrever uma data por extenso e descobrir o intervalo entre horas.

Mas o Calendar parece nao estar respondendo

public class Main {

		

	public static void main(String[] args) {
		Date dataInicial = new Date ();
		Date dataFinal = new Date ();
		Calendar cal = Calendar.getInstance();
		cal.setTime(dataInicial);
		cal.set(Calendar.DAY_OF_MONTH, 26);
		cal.set(Calendar.MONTH, 12);
		cal.set(Calendar.YEAR, 2008);
		System.out.println(cal.get(Calendar.DAY_OF_MONTH) + " " + cal.get(Calendar.MONTH) + " " + cal.get(Calendar.YEAR));
		System.out.println(dateToString(dataInicial));
		
		cal.setTime(dataInicial);
		cal.set(Calendar.HOUR_OF_DAY, 1);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		
		cal.setTime(dataFinal);
		cal.set(Calendar.HOUR_OF_DAY, 2);
		cal.set(Calendar.MINUTE, 2);
		cal.set(Calendar.SECOND, (int) 30.7);
		
		System.out.println(intervaloDeTempo(dataInicial, dataFinal));
	}

	private static String dateToString(Date data){
		String rs = "";
		Calendar cal = Calendar.getInstance();
		cal.setTime(data);
		int day = cal.get(Calendar.DAY_OF_MONTH);
		if (day<10){
			rs+="0" + String.valueOf(day);
		} else{
			rs+= String.valueOf(day);
		}
		rs+= " de " + mes(cal.get(Calendar.MONTH));
		rs+= " de " + String.valueOf(cal.get(Calendar.YEAR));
		
		return rs;
	}
	
	private static String mes(int i){
		switch (i) {
		case 1:
			return "janeiro";
		case 2:
			return "fevereiro";
		case 3:
			return "marco";
		case 4:
			return "abril";
		case 5:
			return "maio";
		case 6:
			return "junho";
		case 7:
			return "julho";
		case 8:
			return "agosto";
		case 9:
			return "setembro";
		case 10:
			return "outubro";
		case 11:
			return "novembro";
		case 0:
			return "dezembro";
		}
		return null;
	}
	
	private static String intervaloDeTempo(Date dataInicial, Date dataFinal){
		Calendar cal = Calendar.getInstance();
		cal.setTime(dataInicial);
		double timeIni = horaToSegundo(cal.get(Calendar.HOUR_OF_DAY), 
				cal.get(Calendar.MINUTE), (double)cal.get(Calendar.SECOND));
		cal.setTime(dataFinal);
		double timeFi = horaToSegundo(cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE),                  (double)cal.get(Calendar.SECOND));				
		return segundoToHora(timeFi-timeIni);
	}
	
	private static double horaToSegundo(int hora, int minuto, double segundo){
		double rs = 0;
		rs+= hora*3600;
		rs+= minuto*60;
		rs+= segundo;
		return rs;
	}
	
	private static String segundoToHora(double x){
		String rs = "";
		int hora = (int) (x-x%3600)/3600;
		x%=3600;
		int minuto = (int) ((x-x%60)/60);
		x%=60;
		Double segundo = x;
		
		rs+= String.valueOf(hora) + "hs ";
		rs+= String.valueOf(minuto) + "min ";
		rs+= String.valueOf(segundo) + "s";
		return rs;
	}
}

Desde ja agradeco e vou procurando a resposta se eu nao achar aqui.

7 Respostas

CintiaDR

Estou boazinha hj :smiley:
Acho que é isso que vc quer.

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;


public class Datas {


	public static void main(String[] args) {
		Calendar data1 = Calendar.getInstance();
		data1.clear();
		Calendar data2 = (Calendar) data1.clone();
		
		DateFormat df = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
		


		//data1 = 26/12/2008 01:00:00
		data1.set(Calendar.DAY_OF_MONTH, 26);
		data1.set(Calendar.MONTH, Calendar.DECEMBER);
		data1.set(Calendar.YEAR, 2008);
		data1.set(Calendar.HOUR_OF_DAY, 1);
		
		//data2 = 27/12/2008 02:02:30
		data2.set(Calendar.DAY_OF_MONTH, 27);
		data2.set(Calendar.MONTH, Calendar.DECEMBER);
		data2.set(Calendar.YEAR, 2008);
		data2.set(Calendar.HOUR_OF_DAY, 2);
		data2.set(Calendar.MINUTE, 2);
		data2.set(Calendar.SECOND, 30);
		
		System.out.print("Data Inicial " + df.format(data1.getTime()));
		System.out.println(", Data Final " + df.format(data2.getTime()));
		
		
		System.out.println("Diferença em horas: " + totalHoras(data1, data2));
		
	}

	private static int totalHoras(Calendar data1, Calendar data2){
		long milissegundos1 = data1.getTimeInMillis();
		long milissegundos2 = data2.getTimeInMillis();
		
		
		long diff = milissegundos2 - milissegundos1;
		
		
		return (int)diff/(1000*60*60);
		
	}

}
CintiaDR

Se as datas estiverem em inglês, ou vc precisar imprimir diferente, procure a documentação do SimpleDateFormat.

R

Ja que pode ser feito tudo com o calendar.

Qual a necessidade do objeto Date?

Felagund

Me assustei com o esquema dele para mostrar datas por extenso.

DateFormat dfmt = new SimpleDateFormat(“EEEE, d ‘de’ MMMM ‘de’ yyyy”);

esse formato mostra a data por extenso contendo o dia.

[]'s

marcelo_mococa

ronaldolocalhost:
Ja que pode ser feito tudo com o calendar.

Qual a necessidade do objeto Date?

Isso é uma boa questão.
Eu aconselhor você a trabalhar diretamente com Calendar. A classe Date tem muitos métodos deprecated e como você mesmo percebeu, sua manipulação é trabalhosa.

Se você for um pouco curioso, pode dar uma olhada na joda time, ela está servindo como referência para a nova API de datas do java.
http://joda-time.sourceforge.net/

CintiaDR

Ronaldo,

Se tu olhar a documentação do Date

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html

verá que maioria das coisas está ‘deprecated’ para o Calendar. Na verdade, quando usamos “calendar.getTime()” conseguimos recuperar um Date.
Sobre o DateFormat, importante ver as funções parse() e format() - note que ambas lidam com Date’s.

http://java.sun.com/j2se/1.4.2/docs/api/java/text/DateFormat.html
http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html

R

Obrigado!

Realmente cheguei a conclusão que não se deve usar o Date, a menos que mandem você usar, como foi no meu trabalho :wink:

PS: Não percam tempo como eu fiz tentando alterar o Date através do Calendar, o Calendar serve para “substituir” o Date não manipula-lo como o Iterator faz com List.

Criado 26 de maio de 2009
Ultima resposta 28 de mai. de 2009
Respostas 7
Participantes 4