it-swarm.com.de

Wie kann ich die Anzahl der Millisekunden seit Mitternacht für den Strom ermitteln?

Beachten Sie, ich möchte NICHT Millis aus der Epoche. Ich möchte die Anzahl der Millisekunden aktuell auf der Uhr anzeigen.

Ich habe zum Beispiel dieses bisschen Code.

Date date2 = new Date(); 
Long time2 = (long) (((((date2.getHours() * 60) + date2.getMinutes())* 60 ) + date2.getSeconds()) * 1000);

Gibt es eine Möglichkeit, Millisekunden mit Datum abzurufen? Gibt es eine andere Möglichkeit, dies zu tun?

Hinweis: System.currentTimeMillis() gibt mir Millis aus der Epoche, was ich nicht suche.

118
Lemonio

Meinst du?

long millis = System.currentTimeMillis() % 1000;

BTW Windows erlaubt keine Zeitreise bis 1969

C:\> date
Enter the new date: (dd-mm-yy) 2/8/1969
The system cannot accept the date entered.
190
Peter Lawrey

Verwenden Sie den Kalender

Calendar.getInstance().get(Calendar.MILLISECOND);

oder 

Calendar c=Calendar.getInstance();
c.setTime(new Date()); /* whatever*/
//c.setTimeZone(...); if necessary
c.get(Calendar.MILLISECOND);

In der Praxis denke ich, dass es fast immer gleich System.currentTimeMillis ()% 1000 ist; Es sei denn, jemand hat Sprung-Millisekunden oder einen Kalender, dessen Epoche nicht an einer zweiten Grenze liegt. 

24
Calendar.getInstance().get(Calendar.MILLISECOND);
16
kgautron

Ich habe oben ein paar probiert, aber sie scheinen @ 1000 zurückzusetzen

Dies funktioniert definitiv und sollte auch ein Jahr berücksichtigen

long millisStart = Calendar.getInstance().getTimeInMillis();

und machen Sie dasselbe für die Endzeit, falls erforderlich.

11

tl; dr

Sie fragen nach dem Bruchteil einer Sekunde der aktuellen Zeit in Millisekunden (not count from Epoch).

Instant.now()                               // Get current moment in UTC, then…
       .get( ChronoField.MILLI_OF_SECOND )  // interrogate a `TemporalField`.

2017-04-25T03: 01: 14.113Z → 113

  1. Holen Sie sich die Sekundenbruchteile in Nanosekunden (Milliarden).
  2. Durch Tausend teilen, um Millisekunden (Tausend) zu verkürzen.

Sehen Sie diesen Code live auf IdeOne.com .

Java.time verwenden

Der moderne Weg ist mit den Java.time-Klassen.

Erfassen Sie den aktuellen Moment in UTC.

Instant.now()

Verwenden Sie die Methode Instant.get, um den Wert einer TemporalField abzufragen. In unserem Fall ist die TemporalField, die wir wollen, ChronoField.MILLI_OF_SECOND .

int millis = Instant.now().get( ChronoField.MILLI_OF_SECOND ) ;  // Get current moment in UTC, then interrogate a `TemporalField`.

Oder rechnen Sie selbst.

Es ist wahrscheinlicher, dass Sie dies für eine bestimmte Zeitzone verlangen. Der Bruchteil einer Sekunde ist wahrscheinlich derselbe wie bei Instant, aber es gibt so viele Anomalien mit Zeitzonen, dass ich diese Annahme vermute.

ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ) ;

Befragen Sie die Sekundenbruchteile. Die Frage verlangte nach Millisekunden , aber Java.time-Klassen verwenden eine feinere Auflösung von Nanosekunden . Das heißt, die Anzahl der Nanosekunden reicht von 0 bis 999.999.999. 

long nanosFractionOfSecond = zdt.getNano();

Wenn Sie wirklich Millisekunden wollen, schneiden Sie die feineren Daten ab, indem Sie sie durch eine Million teilen. Beispielsweise ist eine halbe Sekunde 500.000.000 Nanosekunden und ebenfalls 500 Millisekunden.

long millis = ( nanosFractionOfSecond / 1_000_000L ) ;  // Truncate nanoseconds to milliseconds, by a factor of one million.

Über Java.time

Das Java.time -Framework ist in Java 8 und höher integriert. Diese Klassen ersetzen die lästigen alten Legacy Date-Time-Klassen wie Java.util.Date , Calendar , & SimpleDateFormat .

Das Joda-Time - Projekt, jetzt im Wartungsmodus , empfiehlt die Migration zu den Java.time -Klassen.

Weitere Informationen finden Sie im Oracle Tutorial . In Stack Overflow finden Sie viele Beispiele und Erklärungen. Spezifikation ist JSR 310 .

Wo erhalten Sie die Java.time-Klassen? 

Das ThreeTen-Extra -Projekt erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Erweiterungen von Java.time. Hier finden Sie einige nützliche Klassen, wie zum Beispiel Interval , YearWeek , YearQuarter und more .

8
Basil Bourque
  1. long timeNow = System.currentTimeMillis();
  2. System.out.println(new Date(timeNow));

Fri Apr 04 14:27:05 PDT 2014

4
omarflorez

Joda-Zeit

Ich denke, Sie können Joda-Time verwenden, um dies zu tun. Schauen Sie sich die DateTime class und ihre getMillisOfSecond -Methode an. So etwas wie

int ms = new DateTime().getMillisOfSecond() ;
2
RNJ

In Java 8 können Sie das einfach tun

ZonedDateTime.now().toInstant().toEpochMilli()

kehrt zurück : die Anzahl der Millisekunden seit der Epoche 1970-01-01T00: 00: 00Z

0
Aniket Thakur

Ich habe den Test mit Java 8 durchgeführt. Es ist egal, in welcher Reihenfolge der Builder immer 0 Millisekunden benötigt, und das Concat zwischen 26 und 33 Millisekunden und die Iteration einer 1000-Verkettung

Hoffe, es hilft, es mit deiner Idee zu versuchen

public void count() {

        String result = "";

        StringBuilder builder = new StringBuilder();

        long millis1 = System.currentTimeMillis(),
            millis2;

        for (int i = 0; i < 1000; i++) {
            builder.append("hello world this is the concat vs builder test enjoy");
        }

        millis2 = System.currentTimeMillis();

        System.out.println("Diff: " + (millis2 - millis1));

        millis1 = System.currentTimeMillis();

        for (int i = 0; i < 1000; i++) {
            result += "hello world this is the concat vs builder test enjoy";
        }

        millis2 = System.currentTimeMillis();

        System.out.println("Diff: " + (millis2 - millis1));
    }
0
Aldo Infanzon