millis gregorian from java calendar milliseconds

gregorian - Java: milisegundos por mes/año(no solo la hora actual)



java millis (4)

Supongamos que tengo un algoritmo en Java en el que quiero hacer algo mensualmente en función del tiempo asociado a cada objeto.

Entonces, por ejemplo, si el Object a tiene Object a tiempo long t , t es en milisegundos desde la época, ¿cómo sabré que t es una hora en 03/2014?

Como una pregunta secundaria, ¿cómo puedo iterar durante meses atrás en el tiempo? Así que si estoy comenzando el 1 de mayo de 2014, ¿cómo puedo volver con precisión a abril, marzo, febrero, etc., sin preocuparme por todo el problema de tener 28 - 31 días en un mes? Estaba considerando usar la clase Calendar , pero no estaba seguro de si puedo actualizar la variable MONTH y hacer que me proporcione el valor correcto de milisegundos. ¿Qué pasa si es el 31 de marzo y actualizo el mes hasta febrero y de repente creo que es el 31 de febrero?


La forma más fácil de hacerlo es usar la clase java.util.Calendar como mencionas en tu pregunta. Puedes obtener una instancia fácilmente usando

//use whatever time zone your milliseconds originiate from //there is another getter that takes a Locale, which may be useful depending on your context Calander c = Calendar.getInstance(TimeZone.getDefault());

Luego puedes establecer el tiempo usando

c.setTimeInMillis(t);

Para saber cuándo fue esto, puede imprimir el resultado utilizando un objeto DateFormat

DateFormat df = DateFormat.getInstance(DateFormat.SHORT); System.out.println(df.format(c.getTime());

Para moverse a través de los meses (o cualquier otra unidad de tiempo), debe "agregar" al calendario usando el campo del mes:

c.add(Calendar.MONTH, -2);

La buena noticia es que puede usar el método add() para cualquier otra unidad de tiempo y la clase Calendar se encargará de ajustar adecuadamente la fecha según sea necesario, de la manera que espera (es decir, la forma culturalmente apropiada definida por la Locale de el Calendar ).

Por último, puede volver a convertir esto en milisegundos usando

long newTime = c.getTimeInMillis();


Usando la API de Java 8 en java.time podría hacer lo siguiente:

import java.time.Instant; import java.time.Month; import java.time.MonthDay; import java.time.OffsetDateTime; public static void main(String[] args) { long ms_since_epoch = 1_500_000_000_000L; Instant instant = Instant.ofEpochMilli(ms_since_epoch); // convert milliseconds in UTC to date OffsetDateTime dateUTC = OffsetDateTime.ofInstant(instant, ZoneOffset.UTC); // convert milliseconds in EST (UTC-0500) to date OffsetDateTime dateEST = OffsetDateTime.ofInstant(instant, ZoneOffset.ofHours(-5)); // note: this is 2017-07-14 at 2:40 // create a MonthDay from the date in EST MonthDay monthDay = MonthDay.of(dateEST.getMonth(), dateEST.getDayOfMonth()); // note: this is 2017-07-13 at 21:40 // loop over the next six months, after monthDay from dateEST MonthDay md = monthDay; for (int i = 0; i < 6; ++i) { md = md.with(md.getMonth().plus(1)); System.out.println(md); // prints 08-13 through 01-14 (August 2013 through January 2014) } // loop over the previous six months, including this month md = monthDay; for (int i = 0; i < 6; ++i) { System.out.println(md); md = md.with(md.getMonth().minus(1)); // prints 07-13 through 02-13 (July 2013 through February 2013) } }

Tenga en cuenta que MonthDay es inmutable, por lo que al llamar a md.with(otherMonth) devuelve una nueva instancia con el mes modificado, y solo representa un mes y un día, no una fecha completa con año, hora y zona horaria. Tenga en cuenta también cómo la conversión de la marca de tiempo genera una fecha y hora diferente según la zona horaria, lo que también se aplicará a Calendar .


¿Qué época? ¿Qué zona horaria?

Tu pregunta ignora cuestiones cruciales:

  • Milisegundos desde que época ? Hay muchas épocas . En las 3 bibliotecas comunes basadas en Java (java.util.Date/Calendar, Joda-Time, java.time), la época es el primer momento de 1970 en UTC (ignorando segundos intercalares).
  • ¿Qué zona horaria está representada por ese recuento de milisegundos? UTC o alguna zona horaria local?

Joda-Time

Aquí hay un código de ejemplo usando la biblioteca Joda-Time 2.3.

Genera algunos milisegundos. Observe el uso de long no int .

long millis = new DateTime( 2014, 1, 2, 3, 4, 5, DateTimeZone.UTC ).getMillis();

Crea una instancia de DateTime pasando los milisegundos al constructor. Especifique la zona horaria por la cual interprent esos milisegundos.

DateTime dateTime = new DateTime( millis, DateTimeZone.UTC );

Definir el comienzo y el final de un mes. La clase Interval representa un lapso de tiempo como este.

DateTime firstOfMarchInParis = new DateTime( 2014, 3, 1, 0, 0, 0 , DateTimeZone.forID( "Europe/Paris" ) ).withTimeAtStartOfDay(); Interval marchInParis = new Interval( firstOfMarchInParis, firstOfMarchInParis.plusMonths( 1) );

La comparación se realiza mejor en el trabajo de fecha y hora utilizando el enfoque "Medio abierto". "Half-Open" es un término matemático, lo que significa que el comienzo es inclusivo y el final es exclusivo. Por lo tanto, el intervalo anterior se define como "desde el primer momento del primero de marzo y hasta, pero sin incluir , el primer momento del primero del mes siguiente". Joda-Time usa este enfoque "medio abierto".

boolean isTargetInMarchInParis = marchInParis.contains( dateTime );

En cuanto a su pregunta secundaria sobre agregar / restar meses, observe que los métodos Joda-Time DateTime plusMonths y minusMonths dan el comportamiento que desea.


Creo que tu primera pregunta ha sido respondida aquí java convert miliseconds to time format

Solo necesita crear un nuevo objeto Date y pasar la marca de tiempo al constructor. Luego puede formatear la fecha como lo desee.