seleccionar restar para manejo instalar ingresar fechas fecha calendario agenda java date calendar

para - restar fechas en java



Fecha objeto a Calendario (6)

Tengo una Película de clase en la que tengo una Fecha de inicio, una duración y una Fecha de finalización. Start and stop Date son Date Objects (Fecha privada startDate ...) (Es una tarea, así que no puedo cambiar eso) ahora quiero calcular automáticamente el stopDate agregando la duración (en min) al startDate.

Por mi conocimiento, trabajar con las funciones de manipulación de tiempo de Date está obsoleto, por lo tanto, no es una buena práctica, pero por otro lado no veo forma de convertir el objeto Date en un objeto de calendario para manipular el tiempo y reconvertirlo en un objeto Date. ¿Hay alguna manera? Y si hay lo que sería la mejor práctica


tl; dr

Instant stop = myUtilDateStart.toInstant() .plus( Duration.ofMinutes( x ) ) ;

java.time

Otras respuestas son correctas, especialmente la Respuesta de Borgwardt . Pero esas respuestas usan clases heredadas obsoletas.

Las clases de fecha y hora originales incluidas con Java han sido suplantadas con clases java.time. Realice su lógica comercial en tipos java.time. Convierta a los tipos anteriores solo donde sea necesario para trabajar con código antiguo que aún no se haya actualizado para manejar los tipos de java.time.

Si su Calendar es en realidad un GregorianCalendar , puede convertirlo a un ZonedDateTime . Encuentre métodos nuevos agregados a las clases antiguas para facilitar la conversión a / de los tipos de java.time.

if( myUtilCalendar instanceof GregorianCalendar ) { GregorianCalendar gregCal = (GregorianCalendar) myUtilCalendar; // Downcasting from the interface to the concrete class. ZonedDateTime zdt = gregCal.toZonedDateTime(); // Create `ZonedDateTime` with same time zone info found in the `GregorianCalendar` end if

Si su Calendar no es Gregorian , llame a toInstant para obtener un objeto Instant . La clase Instant representa un momento en la línea de tiempo en UTC con una resolución de nanoseconds .

Instant instant = myCal.toInstant();

Del mismo modo, si comienza con un objeto java.util.Date , conviértalo en un Instant . La clase Instant representa un momento en la línea de tiempo en UTC con una resolución de nanoseconds (hasta nueve (9) dígitos de una fracción decimal).

Instant instant = myUtilDate.toInstant();

Aplique una zona horaria para obtener un ZonedDateTime .

ZoneId z = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = instant.atZone( z );

Para obtener un objeto java.util.Date , pase por Instant .

java.util.Date utilDate = java.util.Date.from( zdt.toInstant() );

Para obtener más información sobre la conversión entre los tipos heredados de fecha y hora y java.time, y un diagrama ingenioso, consulte mi respuesta a otra pregunta.

Duration

Representa el lapso de tiempo como un objeto de Duration . Su entrada para la duración es una cantidad de minutos como se menciona en la Pregunta.

Duration d = Duration.ofMinutes( yourMinutesGoHere );

Puede agregar eso al inicio para determinar la parada.

Instant stop = startInstant.plus( d );

Acerca de java.time

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

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

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

¿Dónde obtener las clases de java.time?

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

El proyecto ThreeTen-Extra amplía java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval , YearWeek , YearQuarter y more .


No necesita convertirlo en Calendar para esto, solo puede usar getTime() / setTime() lugar.

getTime() : devuelve el número de milisegundos desde el 1 de enero de 1970, 00:00:00 GMT representado por este objeto Date.

setTime(long time) : Establece este objeto Date para representar un punto en el tiempo que es el tiempo milisegundos después del 1 de enero de 1970 00:00:00 GMT. )

Hay 1000 milisegundos en un segundo y 60 segundos en un minuto. Solo haz los cálculos.

Date now = new Date(); Date oneMinuteInFuture = new Date(now.getTime() + 1000L * 60); System.out.println(now); System.out.println(oneMinuteInFuture);

El sufijo L en 1000 significa que es un literal long ; estos cálculos generalmente se desbordan int fácilmente.


algo como

movie.setStopDate(movie.getStartDate() + movie.getDurationInMinutes()* 60000);


Calendar.setTime()

A menudo es útil observar la firma y la descripción de los métodos API, no solo su nombre :): incluso en la API estándar de Java, los nombres a veces pueden ser engañosos.


Lo que podría hacer es crear una instancia de GregorianCalendar y luego establecer la Date como hora de inicio:

Date date; Calendar myCal = new GregorianCalendar(); myCal.setTime(date);

Sin embargo, otro enfoque es no usar ninguna Date . Podría usar un enfoque como este:

private Calendar startTime; private long duration; private long startNanos; //Nano-second precision, could be less precise ... this.startTime = Calendar.getInstance(); this.duration = 0; this.startNanos = System.nanoTime(); public void setEndTime() { this.duration = System.nanoTime() - this.startNanos; } public Calendar getStartTime() { return this.startTime; } public long getDuration() { return this.duration; }

De esta forma, puede acceder tanto a la hora de inicio como a la duración del inicio al fin. La precisión depende de usted, por supuesto.


Calendar tCalendar = Calendar.getInstance(); tCalendar.setTime(date);

date es un objeto java.util.Date. También puede usar Calendar.getInstance () para obtener la instancia de Calendar (mucho más eficiente).