Groupement de longue date UTC par jour
Question
Y at-il une manière sensible au groupe UTC de longue date par jour?
Je les mod par 86400, mais qui ne prend pas secondes bissextiles.
Quelqu'un at-il d'autres idées, j'utilise java pour que je puisse les analyser dans les objets de date, mais je suis un peu inquiet de la surcharge de la performance de l'utilisation de la classe date.
Aussi est-il un moyen plus efficace que de comparer les mois et l'année parties jour d'un objet Date?
La solution
Est-ce que vos données source définitivement comprennent secondes bissextiles pour commencer? Certaines API font, et certains ne le font pas - Joda Time (que je vous recommande sur les API de date / heure intégrée) ne pas utiliser secondes bissextiles , par exemple. Les API Java date et l'heure « parfois » font - ils soutiennent 60 et 61 en tant que valeurs de « deuxième minute », mais le soutien dépend du système d'exploitation (voir ci-dessous). Si vous avez des bonnes valeurs d'échantillons, je vérifier que d'abord si je vous étais. Il est évident que la division est juste un peu plus simple que toute autre chose.
Si vous faire ont besoin pour créer des objets Date
(ou en Joda DateTime
) Je référence avant de faire quoi que ce soit d'autre. Vous découvrirez peut-être que la performance est en réalité parfaitement adéquate. Il est inutile de perdre du temps à optimiser ce qui est correct pour vos données. Bien sûr, vous aurez besoin de décider la taille des données dont vous avez besoin pour soutenir, et la rapidité dont il a besoin d'être le premier:)
Même le soutien java.util.Date
secondes bissextiles est quelque peu indéterminée. De les docs :
Bien que la classe Date vise à refléter le temps universel coordonné (UTC), il ne peut pas le faire exactement, en fonction de l'environnement hôte la machine virtuelle Java. Presque tout les systèmes d'exploitation modernes supposent que 1 jour = 24 × 60 × 60 = 86400 secondes tous les cas. En UTC, cependant, environ une fois chaque année ou deux il y a un supplément D'autre part, appelé « saut de seconde. » le saut de seconde est toujours ajouté comme dernière seconde de la journée, et toujours 31 décembre ou 30. Juin Par exemple, la dernière minute de l'année 1995 a été 61 secondes de long, grâce à une ajoutée seconde intercalaire. La plupart des horloges des ordinateurs sont pas assez précis pour pouvoir refléter la distinction seconde bissextile.
Il y a un plutôt bon blog le désordre avec Java et secondes de saut que vous pouvez lire aussi.
Autres conseils
Je les mod par 86400, mais qui ne prend pas secondes bissextiles ....
Je suis assez sûr que ce sera bien. La documentation de l'API pour vraiment ne devrait pas Date
inclure quoi que ce soit au sujet de secondes de saut, parce que le fait est qu'il émule un symbole de temps Unix standard qui ne comprend pas les secondes sautées dans sa valeur.
Ce qu'il fait est plutôt d'avoir une seconde 59e qui dure deux secondes en réglant la valeur de symbole en arrière de 1 seconde au début d'un deuxième saut (comme le lien dans le post précédent décrit).
Par conséquent, vous pouvez supposer que la valeur que vous obtenez de Date.getTime()
est composé seulement de 86400 secondes jours. Si vous avez vraiment besoin de savoir si un particulier jour a eu un saut de seconde, il y a plusieurs tables disponibles sur Internet (il n'y a eu 23-24 depuis 1972, et les dates d'ordinateur avant que les rarement pris en compte de toute façon).
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.
Fuseau horaire
La classe représente un java.util.Date
moment sur la ligne de temps en UTC. Donc, pour lui demander une date obtient une date qui n'a de sens que dans UTC. Ce moment même peut être une date antérieure au Québec ou à une date ultérieure à Auckland, Nouvelle-Zélande.
Fuseau horaire est cruciale pour déterminer une date, et votre question ne tient pas compte de cette question.
Utilisation java.time
La classe fait partie 1970-01-01T00:00:00
des classes date de temps anciens gênants qui sont maintenant héritage, supplanté par les classes java.time.
En ce qui concerne les secondes sautées, comme les autres réponses proposées, la plupart des sources de comptage de-époque font pas count secondes bissextiles. Donc, vérifier votre source.
Si vous avez un nombre de secondes entières d'époque de Instant
, utilisez la méthode statique pour créer un objet continent/region
.
Instant instant = Instant.ofEpochSecond( 1_493_367_302L ) ;
instant.toString (): 2017-04-28T08: 15: 02Z
Attribuer une zone de temps pour créer le contexte dans lequel nous pouvons déterminer une date. Pour un moment donné, la date varie dans le monde par zone.
nom de fuseau horaire approprié dans le format de America/Montreal
, tels que < a href = "https://en.wikipedia.org/wiki/America/Montreal" rel = "nofollow noreferrer"> Africa/Casablanca
, Pacific/Auckland
ou EST
. Ne jamais utiliser l'abréviation 3-4 lettres tels que ou IST
comme ils sont ZonedDateDate
pas fuseaux horaires, véritables non standardisés, et même pas uniques (!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
zdt.toString (): 2017-04-28T01: 15: 02-07: 00 [Amérique / Los_Angeles]
Avec des tas de ces objets LocalDate
, vous pouvez comparer par date. Vous pouvez extraire un objet Map
. classe représente List
une date valeur -seulement sans temps de jour et sans fuseau horaire.
LocalDate ld = zdt.toLocalDate();
ld.toString (): 28/04/2017
Vous pouvez faire un avec Set
comme la clé ZonedDateTime
et un ou Calendar
de SimpleDateFormat
objets comme la Interval
valeur. Et avec la syntaxe lambda moderne, vous pouvez utiliser Streams pour faire la cartographie.
A propos de java.time
Le java.time cadre est construit en Java 8 et versions ultérieures. Ces classes supplantent les href="https://en.wikipedia.org/wiki/Legacy_system" gênants vieux les classes date-heure comme YearWeek
, YearQuarter
, & <=> .
Le Joda-Time projet , maintenant mode maintenance , conseille la migration vers la page classes de java.time.
Pour en savoir plus, consultez le Oracle Tutoriel . Et la recherche Stack Overflow pour de nombreux exemples et explications. Spécification est JSR 310 .
Où obtenir les classes java.time?
- Java SE 8 , Java SE 9 , et plus tard
- intégré.
- Une partie de l'API Java standard avec une implémentation fourni.
- Java 9 ajoute quelques fonctionnalités mineures et corrections.
- Java SE 6 et Java SE 7
- Une grande partie de la fonctionnalité de java.time est de retour à Java Ported 6 et 7 ThreeTen-Backport .
- Android
- Le projet ThreeTenABP adapte < em> ThreeTen-Backport (mentionné ci-dessus) pour les applications en particulier.
- Voir Comment utiliser ThreeTenABP ... .
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour les futurs ajouts possibles à java.time. Vous trouverez peut-être des classes utiles ici, comme <=> , <=> , <=> et plus .