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

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!

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

Vai ter que fazer continha:

[code]
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));
}

}[/code]

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

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.

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…

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.

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