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?

Était-ce utile?

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?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top