patterns now example current and actual java date time milliseconds

now - simpledateformat java



¿Cómo puedo obtener los milisegundos actuales de la hora actual? (9)

Tenga en cuenta que NO quiero millis de época. Quiero la cantidad de milisegundos actualmente en el reloj.

Entonces, por ejemplo, tengo este código.

Date date2 = new Date(); Long time2 = (long) (((((date2.getHours() * 60) + date2.getMinutes())* 60 ) + date2.getSeconds()) * 1000);

¿Hay alguna forma de obtener milisegundos con la fecha? Hay otra manera de hacer esto?

Nota: System.currentTimeMillis() me da milis de época que no es lo que estoy buscando.


Joda-Time

Creo que puedes usar Joda-Time para hacer esto. Eche un vistazo a la clase DateTime y su método getMillisOfSecond . Algo como

int ms = new DateTime().getMillisOfSecond() ;


tl; dr

Usted solicita la fracción de un segundo del tiempo actual como una cantidad de milisegundos ( sin contar desde época).

Instant.now() // Get current moment in UTC, then… .get( ChronoField.MILLI_OF_SECOND ) // interrogate a `TemporalField`.

2017-04-25T03: 01: 14.113Z → 113

  1. Obtenga el segundo fraccionario en nanosegundos (miles de millones).
  2. Divida entre mil para truncar a milisegundos (miles).

Vea este código ejecutado en vivo en IdeOne.com .

Usando java.time

La forma moderna es con las clases java.time.

Capture el momento actual en UTC.

Instant.now()

Use el método Instant.get para interrogar el valor de un TemporalField . En nuestro caso, el TemporalField que queremos es ChronoField.MILLI_OF_SECOND .

int millis = Instant.now().get( ChronoField.MILLI_OF_SECOND ) ; // Get current moment in UTC, then interrogate a `TemporalField`.

O haz las matemáticas tú mismo.

Es más probable que esté pidiendo esto para un huso horario específico. Es probable que la fracción de segundo sea la misma que con Instant pero hay tantas anomalías con las zonas horarias, que dudo en hacer esa suposición.

ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ) ;

Interrogar por el segundo fraccionario. La Pregunta pidió milliseconds , pero las clases java.time usan una resolución más fina de nanoseconds . Eso significa que la cantidad de nanosegundos oscilará entre 0 y 999.999.999.

long nanosFractionOfSecond = zdt.getNano();

Si realmente quieres milisegundos, trunca los datos más finos dividiéndolos por un millón. Por ejemplo, medio segundo es 500,000,000 nanosegundos y también es 500 milisegundos.

long millis = ( nanosFractionOfSecond / 1_000_000L ) ; // Truncate nanoseconds to milliseconds, by a factor of one million.

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 las clases 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.
    • Consulte Cómo utilizar ThreeTenABP ....

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 .


  1. long timeNow = System.currentTimeMillis();
  2. System.out.println(new Date(timeNow));

Vie abr 04 14:27:05 PDT 2014


¿Quieres decir?

long millis = System.currentTimeMillis() % 1000;

BTW Windows no permite timetravel hasta 1969

C:/> date Enter the new date: (dd-mm-yy) 2/8/1969 The system cannot accept the date entered.


En Java 8 puedes simplemente hacer

ZonedDateTime.now().toInstant().toEpochMilli()

devoluciones: el número de milisegundos desde la época de 1970-01-01T00: 00: 00Z


Hice la prueba usando java 8 No importa el orden en que el constructor siempre toma 0 milisegundos y el concat entre 26 y 33 milisegundos debajo y la iteración de una concatenación de 1000

Espero que te ayude a probarlo con tu ide

public void count() { String result = ""; StringBuilder builder = new StringBuilder(); long millis1 = System.currentTimeMillis(), millis2; for (int i = 0; i < 1000; i++) { builder.append("hello world this is the concat vs builder test enjoy"); } millis2 = System.currentTimeMillis(); System.out.println("Diff: " + (millis2 - millis1)); millis1 = System.currentTimeMillis(); for (int i = 0; i < 1000; i++) { result += "hello world this is the concat vs builder test enjoy"; } millis2 = System.currentTimeMillis(); System.out.println("Diff: " + (millis2 - millis1)); }


Intenté algunos más arriba, pero parecen restablecer @ 1000

Esto definitivamente funciona, y también debe tomarse en cuenta el año

long millisStart = Calendar.getInstance().getTimeInMillis();

y luego haga lo mismo para la hora de finalización si es necesario.


Use el calendario

Calendar.getInstance().get(Calendar.MILLISECOND);

o

Calendar c=Calendar.getInstance(); c.setTime(new Date()); /* whatever*/ //c.setTimeZone(...); if necessary c.get(Calendar.MILLISECOND);

En la práctica, creo que casi siempre será igual a System.currentTimeMillis ()% 1000; a menos que alguien tenga milisegundos bis o algún calendario definido con una época que no esté en un segundo límite.


Calendar.getInstance().get(Calendar.MILLISECOND);