Frage

Gibt es eine vernünftige Art und Weise zu einer Gruppe Lang UTC Termine bis zum Tag?

Ich würde sie von 86400 Mod aber das dauert nicht Schaltsekunden berücksichtigt werden.

Hat jemand noch andere Ideen, ich bin mit Java, damit ich sie in Date-Objekte analysieren könnte, aber ich bin ein wenig besorgt, der Performance-Overhead der Datumsklasse verwendet wird.

Auch ist es eine effizientere Art und Weise, das Jahr Monat und Tag Teile eines Date-Objekts als Vergleich?

War es hilfreich?

Lösung

Gibt es in Ihre Quelldaten auf jeden Fall gehören Schaltsekunden mit zu beginnen? Einige APIs tun, und manche nicht - Joda Time (die ich würde empfehlen, über den Einbau-Datum / Zeit-APIs) nicht Schaltsekunden verwenden, zum Beispiel. Das Java-Datum und Zeit APIs „manchmal“ zu tun - sie unterstützen 60 und 61 als Wert von „zweiten in Minute“, aber Unterstützung ist abhängig vom Betriebssystem (siehe unten). Wenn Sie ein paar gute Beispielwerte haben, würde ich das zuerst prüfen, wenn ich du wäre. Offensichtlich nur Dividieren ist eher einfacher als alles andere.

Wenn Sie Sie müssen Date Objekte (oder DateTime in Joda) erstellen, würde ich Benchmark, bevor irgendetwas anderes zu tun. Sie können auch feststellen, dass die Leistung tatsächlich vollkommen ausreichend ist. Es gibt keinen Punkt in verschwenden Zeit, etwas zu optimieren, die für Ihre Daten in Ordnung ist. Natürlich müssen Sie Datengröße Sie unterstützen müssen, um entscheiden, und wie schnell muss es zuerst sein:)

Auch die java.util.Date Unterstützung für Schaltsekunden ist etwas unbestimmt. Aus die docs :

  

Auch wenn die Date-Klasse soll   reflektieren Coordinated Universal Time   (UTC), kann es nicht so genau tun,   abhängig von der Host-Umgebung von   die Java Virtual Machine. Fast alle   moderne Betriebssysteme gehen davon aus, dass 1   Tag = 24 × 60 × 60 = 86.400 Sekunden in   alle Fälle. In UTC jedoch etwa einmal   jedes Jahr oder zwei gibt es eine extra   zweite genannt, ein „zweiten Sprung.“ Das   Schaltsekunde wird immer als die addierte   letzte Sekunde des Tages, und immer auf   31. Dezember oder 30. Juni zum Beispiel   die letzte Minute des Jahres 1995   61 Sekunden lang, dank eines zusätzlichen   Schaltsekunde. Die meisten Computer-Uhren sind   nicht genau genug, um der Lage sein,   spiegelt die Sprung-Sekunden-Unterscheidung.

Es gibt einen ziemlich gut Blogeintrag über das Chaos mit Java und Schaltsekunden, die Sie vielleicht auch zu lesen.

Andere Tipps

  

Ich würde sie von 86400 Mod aber das dauert nicht Schaltsekunden zu berücksichtigen ....

Ich bin mir ziemlich sicher, dass das in Ordnung sein wird. Die API-Dokumentation für Date sollte wirklich nichts über Schaltsekunden ist, weil die Tatsache ist, dass es einen Standard-Unix-Zeit Ticker emuliert, die keine Schaltsekunde in seinem Wert enthalten. Was sie tut, ist stattdessen eine zweite 59th zu haben, die durch Einstellen der Ticker-Wert zurück um 1 Sekunde zu Beginn einer Schaltsekunde für zwei Sekunden dauert (wie der Link in der früheren Post beschreibt).

Daher kann man davon ausgehen, dass der Wert, den Sie von Date.getTime() erhalten, ist nur von 86.400 Sekunden Tagen aus. Wenn Sie wirklich wissen müssen, ob ein insbesondere Tag hatte eine Schaltsekunde, gibt es mehrere Tabellen im Internet zur Verfügung (es wurde nur 23-24 seit 1972 und Computerdaten vor, dass nur selten nahmen sie in Konto sowieso).

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.

Zeitzone

Die java.util.Date Klasse repräsentiert einen Moment auf der Timeline in UTC. So fragen sie für ein Datum bekommt man ein Datum, das nur Sinn in UTC macht. Am selben Moment kann später in Auckland, Neuseeland ein Datum früher in Québec oder ein Datum sein.

Zeitzone ist von entscheidender Bedeutung in ein Datum zu bestimmen und Ihre Frage ignoriert dieses Problem.

Mit java.time

Die java.util.Date Klasse ist Teil der störenden alten Datum-Zeit-Klassen, die jetzt Vermächtnis sind, die von den java.time Klassen verdrängten.

Wie bei Schaltsekunden, wie die anderen Antworten vorgeschlagen, die meisten Quellen von count-von-Epoche zu tun nicht count Schaltsekunden. So Ihre Quelle überprüfen.

Wenn Sie eine Anzahl von ganzen Sekunden von Epoche der 1970-01-01T00:00:00 haben, dann die statische Methode verwenden, um ein Instant Objekt zu erstellen.

Instant instant = Instant.ofEpochSecond( 1_493_367_302L ) ;
  

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

Weisen Sie eine Zeitzone, den Kontext zu schaffen, in dem wir ein Datum bestimmen können. Für jeden gegebenen Moment ändert sich das Datum auf der ganzen Welt durch Zone.

Geben Sie eine rel="nofollow richtige Zeitzone Namen im Format continent/region wie America/Montreal , Africa/Casablanca oder Pacific/Auckland. Verwenden Sie niemals die 3-4 Buchstaben-Abkürzung wie EST oder IST, wie sie sind nicht true Zeitzonen, nicht standardisiert, und nicht einmal eindeutig (!).

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

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

Mit dem Bündel dieser ZonedDateDate Objekte können Sie nach Datum vergleichen. Sie können ein LocalDate Objekt extrahieren. Die LocalDate Klasse repräsentiert ein Datum-only Wert ohne Zeit-of-Tag und ohne Zeitzone.

LocalDate ld = zdt.toLocalDate();
  

ld.toString (): 2017.04.28

So haben Sie eine Map mit LocalDate als Schlüssel und einem List oder Set von ZonedDateTime Objekten als Wert machen könnten. Und mit der modernen Lambda-Syntax, man konnte Streams verwenden, um diese Zuordnung zu tun.


Über java.time

Die java.time Rahmen in Java 8 und später gebaut. Diese Klassen verdrängen die störenden alten Vermächtnis Datum Zeitklassen rel="nofollow wie java.util.Date , Calendar & SimpleDateFormat .

Das Joda-Time Projekt nun in Wartungsmodus , rät Migration auf die java.time Klassen.

Um mehr zu erfahren, finden Sie in der Oracle Tutorial . Und Stack-Überlauf suchen viele Beispiele und Erklärungen. Spezifikation JSR 310 .

Wo die java.time Klassen erhalten?

Das ThreeTen-Extra Projekt erstreckt java.time mit zusätzlichen Klassen. Dieses Projekt ist eine Bewährungsprobe für eine mögliche zukünftige Ergänzungen java.time. Sie können einige nützliche Klassen hier wie Interval YearWeek , YearQuarter und mehr .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top