Pregunta

¿Hay una forma sensata de grupo de larga data UTC por día?

Me Mod ellos por 86400 pero que no toma en cuenta los segundos intercalares.

¿Alguien tiene alguna otra idea, que estoy usando java para que pudiera analizarlos en objetos de fecha, pero estoy un poco preocupado de la sobrecarga de rendimiento de la utilización de la clase fecha.

También hay una manera más eficiente que comparando el mes y día del año partes de un objeto Date?

¿Fue útil?

Solución

¿Su fuente de datos definitivamente incluyen segundos intercalares para empezar? Algunas API hacen, y algunos no lo hacen - Joda Time (que recomiendo sobre la fecha / hora integrada API) no utiliza segundos intercalares , por ejemplo. La fecha y hora API de Java "a veces" hacen - que apoyan 60 y 61 como valores de "segundo en minutos", pero el apoyo depende del sistema operativo (véase más adelante). Si usted tiene algunos valores de muestra buenas, me gustaría comprobar que en primer lugar si fuera tú. Obviamente simplemente dividiendo es bastante más simple que cualquier otra cosa.

Si lo debe crear Date objetos (o DateTime en Joda) lo haría referencia antes de hacer cualquier otra cosa. Usted también puede encontrar que el rendimiento es en realidad perfectamente adecuado. No tiene sentido perder el tiempo en la optimización de algo que está bien para sus datos. Por supuesto, usted tendrá que decidir el tamaño de los datos que necesita para apoyar, y lo rápido que tiene que ser en primer lugar:)

A pesar de la java.util.Date soporte para los segundos intercalares es algo indeterminado. De los documentos :

  

A pesar de que la clase Date pretende   reflejar hora universal coordinada   (UTC), no puede hacerlo con exactitud,   dependiendo del entorno de acogida de   la Máquina Virtual de Java. Casi todo   Los sistemas operativos modernos suponen que 1   día = 24 × 60 × 60 = 86400 segundos en   todos los casos. En UTC, sin embargo, una vez   cada año o dos no es un extra   segundo, llamado "segundo bisiesto". los   segundo salto se añade siempre como el   último segundo del día, y siempre en   31 de diciembre o el 30 de junio Por ejemplo,   el último minuto del año 1995 fue de   61 segundos de duración, gracias a un añadido   segundo salto. La mayoría de los relojes de los equipos son   no lo suficientemente precisa para poder   reflejar el segundo intercalar distinción.

Hay una bastante buena entrada en el blog por el desorden con Java y los segundos intercalares, que es posible que desee leer también.

Otros consejos

  

Me Mod ellos por 86400 pero que no toma en cuenta los segundos intercalares ....

Estoy bastante seguro de que eso va a estar bien. La documentación de la API para Date realmente no debe incluir nada sobre los segundos intercalares, porque el hecho es que emula un teletipo estándar de tiempo Unix que no incluye los segundos intercalares en su valor. Lo que hace en cambio es tener una segunda 59a que tiene una duración de dos segundos estableciendo el valor de cotización de vuelta en 1 segundo al inicio de un segundo intercalar (como el enlace en el post anterior describe).

Por lo tanto, se puede suponer que el valor que se obtiene de Date.getTime() se compone solamente de 86.400 segundos días. Si realmente necesita saber si un especialmente el día de un salto en segundo lugar, hay varias mesas disponibles en Internet (sólo ha habido 23-24 desde 1972, y las fechas de ordenador antes de que rara vez las tuvo en dar cuenta de todos modos).

HIH

Winston

tl; dr

Instant.ofEpochSecond( 1_493_367_302L )            // Convert a count of whole seconds from epoch of 1970 into a date-time value in UTC.
       .atZone( ZoneId.of( "Pacific/Auckland" ) )  // Adjust into the time zone as a context for determining a date.
       .toLocalDate()                              // Extract a date-only value by which we can sort/collect/organize our date-time values.

Zona horaria

El java.util.Date clase representa un momento en la línea de tiempo en UTC. Por lo que pide que la fecha y le consigue una fecha que sólo tiene sentido en UTC. Ese mismo momento puede ser una fecha anterior en Québec o una fecha posterior en Auckland, Nueva Zelanda.

Zona horaria es crucial en la determinación de una fecha, y su pregunta ignora este problema.

Uso java.time

El 1970-01-01T00:00:00 clase es parte de las clases de fecha y hora viejas problemáticas que ahora son legado, suplantado por las clases java.time.

En cuanto a los segundos intercalares, como sugirieron las otras respuestas, la mayoría de las fuentes de claqueta de época-do no segundo recuento bisiestos. Así verificar su origen.

Si usted tiene un conteo de segundos enteros de época de Instant, a continuación, utilizar el método estático para crear un objeto continent/region.

Instant instant = Instant.ofEpochSecond( 1_493_367_302L ) ;
  

instant.toString (): 2017-04-28T08: 15: 02Z

Asignar una zona horaria para crear el contexto en el que se puede determinar una fecha. Por un momento dado, la fecha varía en todo el mundo por zona.

tiempo apropiado nombre de zona en el formato de America/Montreal, como < a href = "https://en.wikipedia.org/wiki/America/Montreal" rel = "nofollow noreferrer"> Africa/Casablanca , Pacific/Auckland o EST. Nunca use el 3-4 abreviatura de letras tales como IST o ZonedDateDate ya que son no verdaderas zonas de tiempo, no estandarizados, y ni siquiera únicas (!).

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

zdt.toString (): 2017-04-28T01: 15: 02-07: 00 [América / Los_Angeles]

Con del montón de estos LocalDate objetos, se puede comparar por fecha. Puede extraer un Map objeto. El List clase representa una fecha valor -sólo sin tiempo de día y sin zona horaria.

LocalDate ld = zdt.toLocalDate();
  

ld.toString (): 04/28/2017

Por lo que podría hacer una Set con ZonedDateTime como la clave y un Calendar o SimpleDateFormat de Interval objetos como el valor. Y con la sintaxis lambda moderna, se puede usar Streams hacer que la cartografía.


Acerca de java.time

El java.time marco está construido en Java 8 y versiones posteriores. Estas clases sustituyen a los viejos molestos href="https://en.wikipedia.org/wiki/Legacy_system" como YearWeek , YearQuarter , y <=> .

El href="http://www.joda.org/joda-time/" rel="nofollow noreferrer"> Joda-Time proyecto , ahora en el modo de mantenimiento , aconseja migración a la clases java.time .

Para obtener más información, consulte la Oracle Tutorial . Y la búsqueda de desbordamiento de pila durante muchos ejemplos y explicaciones. Especificación es JSR 310 .

¿Dónde obtener las clases java.time?

El ThreeTen-Extra Proyecto extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles futuras adiciones a java.time. Usted puede encontrar algunas clases útiles aquí, como <=> , <=> , <=> , y más .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top