Problema sério com datas

4 respostas
M

seguinte estou com um problema... escrevi um código simples que recebe o dia da semana (1 - domingo, 2 - segunda, 3 - terça, ....), a semana do ano (1 à 52) e o ano, e com isso deve me retornar a data do dia (DD/MM/AAAA), porém para alguns dias funciona para outros não:
dia - semana - ano - resultado
1 - 1 - 2005 ==> 02/01/2005 ==> OK
2 - 1 - 2005 ==> 27/12/2004 ==> o correto é 03/01/2005
3 - 1 - 2005 ==> 28/12/2004 ==> o correto é 04/01/2005
4 - 1 - 2005 ==> 29/12/2004 ==> o correto é 05/01/2005
5 - 1 - 2005 ==> 30/12/2004 ==> o correto é 06/01/2005
6 - 1 - 2005 ==> 31/12/2004 ==> o correto é 07/01/2005
7 - 1 - 2005 ==> 01/01/2005 ==> o correto é 08/01/2005
1 - 2 - 2005 ==> 09/01/2005 ==> OK

ou seja, so funciona os domingo... alguém já enfrentou este problema ??

[code]
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.SimpleTimeZone;

public class Informa_Data {

public static int temp_semana;

public static int temp_ano;

public static int temp_diaSemana;

public static void main(String args[]) {

// Cria uma TIME ZONE correspondente ao horário de Brasília
SimpleTimeZone pdt = new SimpleTimeZone(-3 * 60 * 60 * 1000, "GMT-3:00");

// Seta as regras para o horário de verão Brasileiro
// Começando no primeiro domingo após o dia primeiro
pdt.setStartRule(Calendar.NOVEMBER, 1, Calendar.SUNDAY, 0);

// Terminando no último domingo do mês de Fevereiro
pdt.setEndRule(Calendar.FEBRUARY, -1, Calendar.SUNDAY, 0);

// create a GregorianCalendar with the Pacific Daylight time zone
// and the current date and time
Calendar calendar = new GregorianCalendar(pdt);

temp_diaSemana = Console.readInt("Insira o dia da semana: ");
temp_semana = Console.readInt("Informe a semana: ");
temp_ano = Console.readInt("Informe o ano: ");

calendar.set(Calendar.YEAR, temp_ano);

calendar.set(Calendar.WEEK_OF_YEAR, temp_semana);

calendar.set(Calendar.DAY_OF_WEEK, temp_diaSemana);

String ret = "Data: " + calendar.get(Calendar.DAY_OF_MONTH) + "/"
+ (calendar.get(Calendar.MONTH) + 1) + "/"
+ calendar.get(Calendar.YEAR) + " - Semana: "
+ calendar.get(Calendar.WEEK_OF_YEAR) + " - Dia Semana: "
+ calendar.get(Calendar.DAY_OF_WEEK) + " - Ano: "
+ calendar.get(Calendar.YEAR);

System.out.println(ret);

String formato = "dd/MM/yyyy";
SimpleDateFormat formatter = new SimpleDateFormat(formato);
System.out.println("A data formatada é: "
+ formatter.format(calendar.getTime()));

}
}

4 Respostas

D

Retirado da documentação de Gregorian Calendar:

Values calculated for the WEEK_OF_YEAR field range from 1 to 53. Week 1 for a year is the earliest seven day period starting on getFirstDayOfWeek() that contains at least getMinimalDaysInFirstWeek() days from that year. It thus depends on the values of getMinimalDaysInFirstWeek(), getFirstDayOfWeek(), and the day of the week of January 1. Weeks between week 1 of one year and week 1 of the following year are numbered sequentially from 2 to 52 or 53 (as needed).

For example, January 1, 1998 was a Thursday. If getFirstDayOfWeek() is MONDAY and getMinimalDaysInFirstWeek() is 4 (these are the values reflecting ISO 8601 and many national standards), then week 1 of 1998 starts on December 29, 1997, and ends on January 4, 1998. If, however, getFirstDayOfWeek() is SUNDAY, then week 1 of 1998 starts on January 4, 1998, and ends on January 10, 1998; the first three days of 1998 then are part of week 53 of 1997.

Isso que você está dizendo como incorreto, parece ser o output correto olhando essa documentação. A 1a semana do ano é a 1a semana que contem 7 dias do ano, ou a semana que contem o primeiro dia do ano? Tem que olhar direito a documentação pra você obter êxito.

M

Tudo bem !! agora como posso retornar a data correta como um calendário normal ?? ou seja, quando eu entrar com os dados do dia da semana, da semana e o ano e o resultado ser igual ao da ‘folhinha’, começando a primeira semana sempre em janeiro e não em dezembro do ano anterior como ocorre…

D

Bom você pode acrescentar ao seu código.

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.SimpleTimeZone;

public class Informa_Data {

public static int temp_semana;

public static int temp_ano;

public static int temp_diaSemana;

public static void main(String args[]) {

// Cria uma TIME ZONE correspondente ao horário de Brasília
SimpleTimeZone pdt = new SimpleTimeZone(-3 * 60 * 60 * 1000, "GMT-3:00");

// Seta as regras para o horário de verão Brasileiro
// Começando no primeiro domingo após o dia primeiro
pdt.setStartRule(Calendar.NOVEMBER, 1, Calendar.SUNDAY, 0);

// Terminando no último domingo do mês de Fevereiro
pdt.setEndRule(Calendar.FEBRUARY, -1, Calendar.SUNDAY, 0);

// create a GregorianCalendar with the Pacific Daylight time zone
// and the current date and time
Calendar calendar = new GregorianCalendar(pdt);


//Chamada nova ao metodo para setar o padrao da primeira semana como uma semana completa com 7 dias.
calendar.setMinimalDaysInFirstWeek(7)


temp_diaSemana = Console.readInt("Insira o dia da semana: ");
temp_semana = Console.readInt("Informe a semana: ");
temp_ano = Console.readInt("Informe o ano: ");
M

Valeu pela dica, obrigado.

Criado 19 de março de 2007
Ultima resposta 20 de mar. de 2007
Respostas 4
Participantes 2