Saltar al contenido

Cómo obtener la primera fecha y la última fecha del trimestre actual en java.util.Date

Verificamos completamente cada escrito en nuestro sitio web con el objetivo de mostrarte siempre la información más veraz y actual.

Solución:

Solución Java-8+ pura:

LocalDate localDate = LocalDate.now();
LocalDate firstDayOfQuarter = localDate.with(localDate.getMonth().firstMonthOfQuarter())
    .with(TemporalAdjusters.firstDayOfMonth());

LocalDate lastDayOfQuarter = firstDayOfQuarter.plusMonths(2)
    .with(TemporalAdjusters.lastDayOfMonth());

private static Date getFirstDayOfQuarter(Date date) 
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.DAY_OF_MONTH, 1);
    cal.set(Calendar.MONTH, cal.get(Calendar.MONTH)/3 * 3);
    return cal.getTime();


private static Date getLastDayOfQuarter(Date date) 
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.DAY_OF_MONTH, 1);
    cal.set(Calendar.MONTH, cal.get(Calendar.MONTH)/3 * 3 + 2);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    return cal.getTime();

Esto debería funcionar, pero te sugiero que lo pruebes con más cuidado que yo. Nota: La división de valores int en Java devuelve el valor mínimo.

Como otros mencionaron, está utilizando clases obsoletas. Sun/Oracle decidió suplantar las antiguas clases de fecha y hora con el marco java.time, un vasto mejora.

Evite las antiguas clases de fecha y hora. Realmente están mal diseñados, son confusos y problemáticos.

java.tiempo

El marco java.time está integrado en Java 8. Para Java 6 y 7, use el back-port, ThreeTen-Backport. Para Android, la adaptación de ese back-port, ThreeTenABP.

El marco java.time está inspirado en la exitosa biblioteca Joda-Time, definida por JSR 310 y ampliada por el proyecto ThreeTen-Extra. Consulte Tutorial de Oracle.

LocalDate

Para un valor de solo fecha, sin hora del día y sin zona horaria, utilice LocalDate integrado como parte de java.time. Para obtener la fecha actual se requiere una zona horaria ya que la fecha varía en todo el mundo (un nuevo día amanece antes en el este).

ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );

Quarter & YearQuarter

El proyecto ThreeTen-Extra mencionado anteriormente sirve como campo de pruebas para posibles funciones futuras que se agregarán a java.time. Para usar esta biblioteca, agregue su archivo jar a su proyecto (o use Maven, etc.). Si realmente no desea agregar una biblioteca, vea una solución alternativa Respuesta de dheeran.

Esta biblioteca incluye actualmente la Quarter y YearQuarter clases que puede encontrar particularmente útiles. Es más seguro pasar objetos de este tipo en su código en lugar de usar cadenas y números para representar sus monedas.

YearQuarter currentQuarter = YearQuarter.now ( zoneId );

los YearQuarter tiene muchos métodos útiles, incluyendo pedir sus fechas.

LocalDate start = currentQuarter.atDay ( 1 );
LocalDate stop = currentQuarter.atEndOfQuarter ();

Volcar a la consola.

System.out.println ( "today: " + today + " currentQuarter: " + currentQuarter + " start: " + start + " stop: " + stop );

hoy: 2016-04-08 trimestre actual: 2016-T2 inicio: 2016-04-01 parada: 2016-06-30

Si realmente no desea agregar el ThreeTen-Extra biblioteca como recomendé, vea la Respuesta de Pavel para otra solución usando solo el incorporado java.tiempo clases Pero si está trabajando mucho con monedas de veinticinco centavos, estoy seguro de que encontrará ThreeTen-Extra vale la pena la molestia de agregar una biblioteca a su proyecto.

Conversión

Si debe usar java.util.Date para trabajar con código antiguo que aún no se actualizó a java.time, puede realizar conversiones de ida y vuelta. Encuentre nuevos métodos agregados a las clases antiguas para la conversión.

Desafortunadamente, las clases antiguas carecen de una forma clara de representar un valor de solo fecha. Por lo tanto, no existe una forma perfectamente limpia de ir hacia/desde un LocalDate.

java.sql.Date

los java.sql.Date La clase pretende ser solo de fecha, pero en realidad contiene una hora del día ajustada a 00:00:00.0. Esta clase hereda torpemente de java.util.Date pero el documento advierte claramente contra el uso de ese hecho; se supone que debes tratar a los dos como clases separadas no relacionadas.

java.sql.Date sqlDate_quarterStart = java.sql.Date.valueOf( start );

java.util.Date

A java.util.Date representa tanto una fecha como una hora del día, efectivamente en UTC. Primero podemos ajustar nuestro LocalDate en el primer momento del día para obtener una fecha con la hora del día, un ZonedDateTime. A partir de ahí podemos pedir un Instant que es un momento en la línea de tiempo en UTC. La antigua clase .Date tiene un static from( Instant ) método de conversión.

ZonedDateTime zdt = start.atStartOfDay( zoneId ); // First moment of the day on a certain date.
Instant instant = zdt.toInstant(); // Moment on the timeline in UTC.
java.util.Date utilDate = java.util.Date.from( instant );

Sobre java.tiempo

los java.tiempo framework está integrado en Java 8 y versiones posteriores. Estas clases reemplazan a las antiguas y problemáticas clases heredadas de fecha y hora, como java.util.Date, Calendar& SimpleDateFormat.

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

Para obtener más información, consulte la Tutorial de oráculo. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

puedes intercambiar java.tiempo objetos directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No hay necesidad de cuerdas, no hay necesidad de java.sql.* clases

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9, Java SE 10y después
    • Incorporado.
    • Parte de la API de Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time está adaptada a Java 6 y 7 en ThreeTen-Backport.
  • Androide
    • Versiones posteriores de implementaciones de paquetes de Android de las clases java.time.
    • Para Android anterior (<26), el TresDiezABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo usar ThreeTenABP….

los ThreeTen-Extra proyecto extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuartery más.

Puntuaciones y reseñas

Nos puedes animar nuestra investigación escribiendo un comentario y valorándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *