Fechas de agrupación largo UTC por día
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?
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?
- Java SE 8 , Java SE 9 , y más tarde
- incorporado.
- Parte de la API estándar de Java con una aplicación incluida.
- Java 9 añade algunas características menores y correcciones.
- Java SE 6 y Java SE 7
- Gran parte de la funcionalidad de back-java.time está portado a Java 6 y 7 en ThreeTen-Backport .
- Android
- ThreeTenABP Proyecto adapta < em> ThreeTen-Backport (mencionado anteriormente) para Android específicamente.
- ¿Cómo utilizar ThreeTenABP ... .
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 .