A título de curiosidade,
Alguém sabe dizer porque a representação dos meses na classe java.util.Date começa com 0 (zero) e vai até 11 (onze)?
Sendo que a representação dos dias vai de 1 (um) a 31 (trinta e um).
Muito estranho.
A título de curiosidade,
Alguém sabe dizer porque a representação dos meses na classe java.util.Date começa com 0 (zero) e vai até 11 (onze)?
Sendo que a representação dos dias vai de 1 (um) a 31 (trinta e um).
Muito estranho.
pois é…semana passada eu usei isso e percebi a mesma coisa.
Acredito que única explicação é descuido/falta de revisão/falta de padrão.
No livro Head First Jsp & Servlets, eles comentam sobre outros desvios de padroes na nomenclatura em Java.
é uma pena.
O engraçado é que eles forçam isso meio que ‘hardcoded’ na API.
[code]
//dentro do getMonth()
getMonth() - 1; // adjust 1-based to 0-based
//dentro do setMonth
setMonth(month + 1); // adjust 0-based to 1-based month numbering[/code]
Internamente parece que tratam de 1 - 12, mas a representação é 0 - 11.
Seria uma explicação o fato de o esperado ser a gente usar as propriedades constantes e estática GregorianCalendar.JANUARY ao invez de 0 de fato?
Pra não me complicar eu sempre uso as constantes…
nao tinha algum negocio que era para se manter parecido com os calendarios que tem mais de 12 meses?
O James Gosling me disse pessoalmente, em 2003, que ele simplesmente copiou uma API existente em C. Agora, qual era, eu não sei…
Acho que hoje ele se arrepende… hehehheeheheheh
Todo mundo na Sun se arrepende de Date, Calendar e afins, pode ter certeza. Inclusive, essa foi uma das maiores razões pra eles mesmos nunca tentarem consertar: o fato de já terem errado duas vezes e o medo de conseguir gerar o terceiro fracasso.
Na mesma linha, pq o getYear dessa classe substrai de 1900 o resultado?
Date date = new Date();
System.out.println(date.getYear()); // print 108
System.out.println(date.getYear() + 1900); // agora sim, 2008
Até onde eu vi não tem motivo pra isso.
[quote=fabiofalci]Na mesma linha, pq o getYear dessa classe substrai de 1900 o resultado?
Date date = new Date();
System.out.println(date.getYear()); // print 108
System.out.println(date.getYear() + 1900); // agora sim, 2008
[/quote]
Vai ver a data do seu micro está 25/03/108… heeeheee
Hehehe… a primeira vez que retornou isso ate pensei, mas nao, olha a implementacao do getYear
public int getYear() {
return normalize().getYear() - 1900;
}
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Date.html
[quote] In all methods of class Date that accept or return year, month, date, hours, minutes, and seconds values, the following representations are used:
* A year y is represented by the integer y - 1900.
* A month is represented by an integer from 0 to 11; 0 is January, 1 is February, and so forth; thus 11 is December.
* A date (day of month) is represented by an integer from 1 to 31 in the usual manner.
* An hour is represented by an integer from 0 to 23. Thus, the hour from midnight to 1 a.m. is hour 0, and the hour from noon to 1 p.m. is hour 12.
* A minute is represented by an integer from 0 to 59 in the usual manner.
* A second is represented by an integer from 0 to 61; the values 60 and 61 occur only for leap seconds and even then only in Java implementations that actually track leap seconds correctly. Because of the manner in which leap seconds are currently introduced, it is extremely unlikely that two leap seconds will occur in the same minute, but this specification follows the date and time conventions for ISO C. [/quote]
MAS…
data nunca foi algo simples de manipular em programação.
Em C o mês "janeiro" é zero (argh) na estrutura tm.
O motivo provavelmente é algo parecido com isto:
#include <stdio.h>
#include <time.h>
char *meses[] = {
"janeiro",
"fevereiro", "marco", "abril", "maio", "junho",
"julho", "agosto", "setembro", "outubro", "novembro", "dezembro"
};
main () {
struct tm *tm;
time_t now;
time (&now);
tm = localtime (&now);
printf ("Hoje é %d de %s de %d\n", tm->tm_mday, meses[tm->tm_mon], tm->tm_year);
}
O código acima funcionava como esperado até 1999 (imprimia algo como "Hoje é 12 de janeiro de 99".)
No ano 2000 ele começou a imprimir:
"Hoje é 12 de janeiro de 100".
E é por essas coisas que houve todo aquele escândalo sobre o tal do "Y2K" - se em programas
C ocorre esse tipo de anomalia, imagine naqueles programas Cobol de 40 anos atrás.