Percorrer e concatenar String

PessoALL,

Preciso fazer a subtração de 2 horas (entrada e saída). Exemplo: E - 09:00hs // S - 18:00hs = 09:00hs

Pesquisei uma maneira de fazer isso achei as classes Date e DateFormat, porém não achei eficiente.

Tive a idéia de validar as 2 horas (tipo String), depois percorrer cada uma através do charAt(), pegar os dois primeiros caracteres e transformar em tipo int.
Somente após isso fazer a subtração das datas e ao final concatenar, além de transformar novamente p/ String.

É trabalhoso mas acho que funciona.

Vocês acham que vale a pena o trabalho ou existe uma maneira mais simples e eficiente?

Obrigado desde já.
Rafael

Achei um código que talvez lhe ajudaria, da uma olhada:

http://www.javafree.org/javabb/viewtopic.jbb?t=4461

See you…

Razec,

Coincidência, nesse exato momento estou com esse código aberto aqui e tentando entender.

Vamos ver se serve para o que preciso.

Se mais alguém opinar, fico agradecido.

Boa noite.

Utiliza a classe Calendar que vc pode adicionar ou subtrair dias, horas, minutos, segundos, anos, enfim…vc pode manipular as horas ou data com muita facilidade e eficiência.

Por exemplo para subtrair 2 horas:

Calendar calendar = Calendar.getInstance();

calendar.add(Calendar.HOUR_OF_DAY, -2);

System.out.println(calendar.getTime());

vlw abraços

Só para complementar a resposta,

Date está deprecated, o novo objeto que veio para tomar as funcionalidades de data é a Calendar,

que por sua vez é uma classe abstrata, a implementação dela que corresponde ao tipo de data que utilizamos

no nosso dia a dia, é a GregorianCalendar.

A API pura do Java é uma completa droga para manipular datas.
Não é eficiente, não é produtivo e, no final das contas, também não é multi-plataforma.

Entretanto, alguns programadores criaram outra API, chamada JODA-Time, que não só resolveu todos os problemas de maneira simples, como também já está sendo cotada para entrar nas próximas versões do Java.

Use-a:
http://joda-time.sourceforge.net/

Claro que cada caso é um caso, somente vendo par eu pode opinar melhor, mas de príncipio concordo com nosso amigo Pablo Diego, simples e objetivo.
[]´s

[quote]Boa noite.

Utiliza a classe Calendar que vc pode adicionar ou subtrair dias, horas, minutos, segundos, anos, enfim…vc pode manipular as horas ou data com muita facilidade e eficiência.

Por exemplo para subtrair 2 horas:

Calendar calendar = Calendar.getInstance();

calendar.add(Calendar.HOUR_OF_DAY, -2);

System.out.println(calendar.getTime());

vlw abraços
[/quote]

Vai por mim… usar o Calendar é um caminho rápido e certo para o arrependimento.
Certas operações com datas ficam muito complexas com ele.

Use o JODA-Time, senão depois vc terá que sair mudando o programa inteiro.

Só a título de exemplo. Como vocês fariam esses dois métodos, aqui escritos com JODA-Time, usando Calendar?

public Days daysToNewYear(LocalDate fromDate) {
  LocalDate newYear = fromDate.plusYears(1).withDayOfYear(1);
  return Days.daysBetween(fromDate, newYear);
}

public boolean isRentalOverdue(DateTime datetimeRented) {
  Period rentalPeriod = new Period().withDays(2).withHours(12);
  return datetimeRented.plus(rentalPeriod).isBeforeNow();
}

O primeiro testa quantos dias existe entre hoje e 1 de janeiro do próximo ano.
O segundo testa se um aluguel está dentro do período de aluguel, que é de 2 dias e 12 horas.

Notem a sintaxe extremamente compacta e elegante.

Resumindo…

Melhor eu esquecer a idéia de criar uma classe para subtrair horas?

Normalmente é melhor usar algo que já existe do que reiventar a roda

[quote=ViniGodoy]Vai por mim… usar o Calendar é um caminho rápido e certo para o arrependimento.
Certas operações com datas ficam muito complexas com ele.

Use o JODA-Time, senão depois vc terá que sair mudando o programa inteiro.[/quote]

ViniGodoy, estou olhando o JODA-Time, porém não estou achando os métodos para fazer o procedimento que preciso.
Pode dar uma força?

E também, onde (pasta) devo descompactar o pacote do JODA?
Uso o JCreator.

Bem, eu nunca usei o JodaTime, então não posso dizer muito, mas com Calendar, vc pode converter para milisegundos, fazer a operação, e converter para horas. Se for apenas horas redondas, pode fazer algo do tipo:

long dif = cal.getTimeInMillis() - cal2.getTimeInMillis(); dif = dif/3600000L; System.out.println(Math.abs(Math.round(dif)));

EDIT:

Para precisão em minutos

			long dif = cal.getTimeInMillis() - cal2.getTimeInMillis();
			long hora = dif/3600000L;						
			String horas = "" + Math.abs(Math.round(hora));
			if(horas.length()==1){
				horas = "0"+horas;
			}
			long min = dif%3600000L/60000L;
			String mins = "" + Math.abs(Math.round(min));
			if(mins.length()==1){
				mins = "0" + mins;
			}
			String horasDif = horas+":"+mins;

[quote=lgmhorus]Bem, eu nunca usei o JodaTime, então não posso dizer muito, mas com Calendar, vc pode converter para milisegundos, fazer a operação, e converter para horas.
[/quote]

Pesquisei sobre o Calendar, encontrei diversos comentários falando sobre sua ineficiência. Isso me deixou com um pé atrás.

Desa forma gostaria de utilizar o JODA Time.

Nesse momento estou lendo a doc, mas devido a minha falta de experiência está complicado.

Não sei nem onde descompatar o pacote do JODA.

Creio que com isso eu consigo fazer o que preciso (documentação JODA)…

[code]hoursBetween

public static Hours hoursBetween(ReadableInstant start,
ReadableInstant end)

Creates a Hours representing the number of whole hours between the two specified datetimes.

Parameters:
    start - the start instant, must not be null
    end - the end instant, must not be null 
Returns:
    the period in hours 
Throws:
    IllegalArgumentException - if the instants are null or invalid[/code]

Porém não consigo aplicar na prática.
Primeiro pela dificuldade de trabalhar com pacotes. Segundo por desconhecer alguns parâmetros.

Alguém por aí já trabalhou com o JODA?

O que você quer fazer, exatamente?

[quote=ViniGodoy]O que você quer fazer, exatamente?
[/quote]

Receber…(ex.)
Data de entrada: 08:00
Data de Saída: 17:00
Resposta: 09:00

E preciso também, agora, saber onde descompactar o pacote do JODA e como importar isso p/ minha classe.

Obrigado!

Aqui vai um exemplo que funciona:

[code]
import java.util.Scanner;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.PeriodFormatter;
import org.joda.time.format.PeriodFormatterBuilder;

public class Main {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormat.forPattern(“H:mm”);
private static final PeriodFormatter PERIOD_FORMAT = new PeriodFormatterBuilder()
.printZeroAlways().minimumPrintedDigits(2)
.appendHours().appendLiteral(":").appendMinutes()
.toFormatter();

private static DateTime leHora(String texto) {
    while (true) {
        Scanner in = new Scanner(System.in);
        System.out.println(texto);
        String hora = in.nextLine();
        try {
            DateTime dt = DATE_FORMAT.parseDateTime(hora);
            return dt;
        } catch (Exception e) {
            System.out.println("Hora inválida!");
        }
    }
}

public static void main(String[] args) {
    DateTime entrada = leHora("Hora de entrada: ");
    DateTime saida = leHora("Hora de saída: ");
    Period period = new Period(entrada, saida);
    System.out.println("Periodo: " + PERIOD_FORMAT.print(period));
}

}[/code]

Vou dar uma olhada com calma.

Valeu Vini!

Atualizei o exemplo ali em cima para trabalhar com um formatter de período.
É uma boa política definir os formatos que sua aplicação vai usar em constantes.

No JODA, os formatos são responsáveis tanto por imprimir uma data ou período em texto, quanto transformar um texto numa data ou período. Eles lançam uma exceção caso o texto informado for inválido.

Note que o exemplo ali em cima não tem nenhuma calculeira proposta pelos colegas, que você fatidicamente teria que fazer caso você tivesse que trabalhar com Calendar.