Calendar ou Joda: pegar o primeiro e o último dia da semana

6 respostas
A

Hoje é dia 29 de Março, eu queria que alguma coisa me retorna-se o primeiro dia da semana (25 de Março) e o último dia da semana (31 de março), considerando que Domingo é o primeiro dia e Sábado é o último.

Obrigada!

6 Respostas

V

Esse é o problema da classe Calendar... nem ela, nem GregorianCalendar foram feitas para facilitar sua vida.

Vai ter que fazer continha:
public class Datas {
    private static void eraseTime(Calendar cal)
    {
        cal.set(Calendar.HOUR, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);        
    }
    
    public static void main(String[] args) {
        final long millisPorDia = 1000 * 60 * 60 * 24;
        
        Calendar cal = Calendar.getInstance();        
        int diaDaSemana = cal.get(Calendar.DAY_OF_WEEK);
        long time = cal.getTimeInMillis();

        //Calculo do primeiro dia da semana
        long primeiroDiaDaSemana = time - ((diaDaSemana - Calendar.SUNDAY) * millisPorDia);
        Calendar primeiroDia = Calendar.getInstance();
        primeiroDia.setTimeInMillis(primeiroDiaDaSemana);
        eraseTime(primeiroDia);
        System.out.println("Primeiro dia da semana: " + primeiroDia.get(Calendar.DAY_OF_MONTH) + "/" + (primeiroDia.get(Calendar.MONTH)+1));
        
        //Calculo do último dia da semana
        long ultimoDiaDaSemana = time + ((Calendar.SATURDAY - diaDaSemana) * millisPorDia);
        Calendar ultimoDia = Calendar.getInstance();
        ultimoDia.setTimeInMillis(ultimoDiaDaSemana);
        eraseTime(ultimoDia);
        System.out.println("Último dia da semana: " + ultimoDia.get(Calendar.DAY_OF_MONTH) + "/" + (ultimoDia.get(Calendar.MONTH)+1));
    }
}
A

Obrigada! Sabia que ia ser trabalhoso, estava tentando mil coisas mas nada funcionava… obrigada mesmo!!

V

Pois é, esse assunto de datas é tão encardido que tem até uma API para isso, chamada JODA. O pessoal dessa API está até propondo uma JSR, pra ver se torna oficial classes mais digeríveis de calendário.

PS: Atualizei o código ali em cima. De diferente, só adicionei um método para zerar o horário e separei o cálculo do primeiro do último dia.

A

O problema é o seguinte, no Calendar os meses começam a ser contados do 0… e eu preciso que março seja 3 e não 2. Tentei muita coisa, mas quando você manda o calendar somar + 1 no mês, ele soma literalmente um mês e não uma unidade. Ai é uma melca…

Estou olhando este JODA, lá tem um método bonito chamado plusWeek(). mas eu não sei como eu acho o 1 dia da semana, porque ai é só usar este plusWeek() para achar o último…

V

O que você usa internamente no sistema não precisa ser o que o seu usuário vê… também acho estranha essa implementação para os meses, mas nada que um pouquinho de +1 e -1 na interface gráfica não resolva.

Para somar uma data no calendário, basicamente converta o tempo dele para millis e depois adicione o número de milisegundos dos dias que você quer calcular. Foi mais ou menos o que fiz no programa anterior…

Por exemplo:

public static void somaDias(Calendar cal, int dias) { final long millisPorDia = 1000 * 60 * 60 * 24; long time = cal.getTimeInMillis(); time += dias * millisPorDia; cal.setTimeInMillis(time); }

Aqui não usamos a JODA. Já haviamos criado nossa classe estática (argh) para manipular calendários antes de conhecer a framework. De coisas para manipular calendário usamos o JCalendar, para as GUIs em Swing.

A

mas eu estou mandando para o banco… eu tenho que tentar com o Joda mesmo, que parece mais plausível.

Criado 29 de março de 2007
Ultima resposta 30 de mar. de 2007
Respostas 6
Participantes 2