una pedir obtener número nombre mostrar mes ingresar formatos fecha año actual java android date gregorian-calendar

java - pedir - Obtener el año y mes actual resultando resultados extraños



obtener nombre mes java (6)

Estoy trabajando en un proyecto de aprendizaje relacionado con Android. Estoy tratando de obtener el año y el mes actuales utilizando el siguiente código, pero no funciona para mí.

GregorianCalendar gc = new GregorianCalendar(); gc.YEAR // returning 1 gc.MONTH // returning 2 Calendar c = Calendar.getInstance(); c.YEAR // returning 1 c.MONTH // returning 2

¿Alguien me puede ayudar? ¿Estoy haciendo algo mal? Por favor, perdóname, soy nuevo en el desarrollo de Java. Gracias.


tl; dr

YearMonth.now( ZoneId.of( "America/Montreal" ) )

Detalles

La respuesta de Jon Skeet es correcta. Estabas accediendo a constantes en lugar de interrogar tu propio objeto.

Aquí hay una alternativa completamente diferente, utilizando clases modernas de fecha y hora.

Evitar las clases de fecha y hora heredadas

Las antiguas clases de fecha y hora, tales como java.util.Date , java.util.Date y java.text.SimpleTextFormat ahora son legacy , suplantadas por las clases java.time .

YearMonth

Si está enfocado en el año y el mes sin una fecha, sin una hora del día y sin una zona horaria, use la clase YearMonth .

En lugar de pasar meros números enteros alrededor por año y por mes, pase objetos de esta clase. Al hacerlo, proporciona seguridad de tipos, garantiza valores válidos y hace que su código sea más autodocumentado.

Determinar el año y mes actual significa determinar la fecha actual. Y para eso es crucial una zona horaria. Para un momento dado, la fecha varía alrededor del mundo por zona.

ZoneId z = ZoneId.of( "America/Montreal" ); YearMonth ym = YearMonth.now( z );

Puedes interrogar por sus partes.

int year = ym.getYear(); int month = ym.getMonthValue();

Esta clase ofrece métodos prácticos como decirle si este es un año bisiesto. Puedes hacer matemáticas, como sumar / restar meses / años. Puede obtener una fecha para cualquier día de este año-mes. Y más.

Month

En lugar de perder el tiempo con un mero número entero por mes, le sugiero que use la enumeración del Month . Esta clase tiene una docena de instancias predefinidas, una para cada mes del año. Como se mencionó anteriormente, el uso de objetos le brinda seguridad de tipos, valores válidos y código de auto-documentación.

Month m = ym.getMonth();

La clase tiene métodos útiles, como generar una cadena localizada con el nombre del mes.

Acerca de java.time

El marco java.time está integrado en Java 8 y java.time posteriores. Estas clases sustituyen a las antiguas y problemáticas clases de fecha y hora como java.util.Date , Calendar , y SimpleDateFormat .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .

Para obtener más información, consulte el Tutorial de Oracle . Y busca para muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases java.time?

  • Java SE 8 y SE 9 y posteriores
    • Incorporado.
    • Parte de la API de Java estándar con una implementación en paquete.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y SE 7
    • Gran parte de la funcionalidad de java.time está respaldada a Java 6 y 7 en ThreeTen-Backport .
  • Android
    • El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) para Android específicamente.
    • Ver cómo usar ...

Cómo obtener el año y el mes actual.

Calendar calendar = Calendar.getInstance(); int month = calendar.get(Calendar.MONTH) + 1; int year = calendar.get(Calendar.YEAR);

Es muy importante agregar 1 para obtener el mes correcto, porque el valor del primer mes es 0:

int month = calendar.get(Calendar.MONTH) + 1;

MONTH : Número de campo para obtener y establecer que indica el mes. Este es un valor específico del calendario. El primer mes del año en los calendarios gregoriano y juliano es ENERO, que es 0; El último depende de la cantidad de meses en un año.


Sólo para dar un poco más de fondo:

Tanto el new GregorianCalendar() como el Calendar.getInstance() darán correctamente un calendario inicializado en la fecha y hora actual.

MONTH y YEAR son constantes dentro de la clase Calendar . No debe usarlos "a través" de una referencia que haga que parezca que son parte del estado de un objeto. Es una parte desafortunada del diseño de la clase Calendar que para acceder a los valores de diferentes campos, debe llamar a get con un número de campo, especificado como una de esas constantes, como se muestra en otras respuestas:

Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH);

Tenga en cuenta que los números del mes se basan en 0, por lo que en el momento de escribir esto (en abril), el número del mes será 3.

Es una parte desafortunada del diseño del lenguaje Java que puede hacer referencia a miembros estáticos (como constantes) mediante expresiones de ese tipo, en lugar de solo a través del nombre del tipo.

Mis recomendaciones:

  • Si su IDE lo permite (como lo hace Eclipse), haga expresiones como c.YEAR dar un error en tiempo de compilación: terminará con un código mucho más claro si siempre usa Calendar.YEAR .
  • Cuando sea posible, use Joda Time , una biblioteca de fecha / hora mucho mejor para Java. Es cierto que en Android es posible que tengas un poco espacio limitado, pero si tu aplicación hace mucha manipulación de fecha / hora, te ahorrará muchos dolores de cabeza.

Tenga en cuenta que los MESES comienzan desde 0. Si es necesario asignarlo a problemas prácticos, simplemente agregue +1

int month=c.get(Calendar.MONTH)+1;


int year=c.get(Calendar.YEAR); int month=c.get(Calendar.MONTH); System.out.println(year); System.out.println(month);


Calendar c= Calendar.getInstance() int cyear = c.get(Calendar.YEAR);//calender year starts from 1900 so you must add 1900 to the value recevie.i.e., 1990+112 = 2012 int cmonth = c.get(Calendar.MONTH);//this is april so you will receive 3 instead of 4. int cday = c.get(Calendar.DAY_OF_MONTH);

refiera este LINK