Как я могу получить количество миллисекунд, прошедших с полуночи текущего?


обратите внимание, я не хочу Миллис из эпохи. Я хочу, чтобы количество миллисекунд в настоящее время на часы.

Так, например, у меня есть этот бит кода.

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

есть ли способ получить миллисекунды с датой? Есть ли другой способ сделать это?

Примечание:System.currentTimeMillis() дает мне Миллис из эпохи, которая не то, что я ищу.

9 113

9 ответов:

Вы имеете в виду?

long millis = System.currentTimeMillis() % 1000;

кстати, Windows не позволит путешествие по 1969 годы

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

Календарь

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

или

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

на практике, хотя я думаю, что это будет почти всегда равная система.currentTimeMillis ()%1000; если у кого-то нет скачка-миллисекунд или какой-то календарь определен с эпохой не на второй границе.

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

я попробовал несколько выше, но они, кажется, сбросить @ 1000

этот определенно работает, и также должен учитывать год

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

и затем сделать то же самое для времени окончания, если это необходимо.

tl; dr

вы просите долю секунды текущего времени в виде числа миллисекунд (не отсчет от эпохи).

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

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

  1. получить долю секунды в наносекундах (миллиарды).
  2. разделить на тысячу, чтобы усечь до миллисекунд (тысяч).

посмотреть этот запустить код видео на IdeOne.com.

использование java.время

современный способ с java.время занятий.

захват текущего момента в UTC.

Instant.now()

использовать Instant.get метод для опроса значения a TemporalField. В нашем случае TemporalField мы хотим ChronoField.MILLI_OF_SECOND.

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

или сделать математику самостоятельно.

скорее всего, вы просите это для определенного часового пояса. Этот доля секунды, скорее всего, будет такой же, как и с Instant но есть так много аномалий с часовыми поясами, я не решаюсь сделать это предположение.

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

опросите за долю секунды. Вопрос, заданный для МС, но java.классы времени используют более тонкое разрешение наносекунд. Это означает, что количество наносекунд будет варьироваться от 0 до 999,999,999.

long nanosFractionOfSecond = zdt.getNano();

если вы действительно хотите, миллисекундах, обрезать более точные данные путем деления на миллион. Например, половина секунды составляет 500 000 000 наносекунд, а также 500 миллисекунд.

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

о java.время

The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют беспокойных старых наследие классы даты и времени, такие как java.util.Date,Calendar,& SimpleDateFormat.

в Joda-Time, теперь режим обслуживания, советует миграция в java.время классы.

чтобы узнать больше, смотрите Учебник Oracle. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.

где получить java.время занятий?

  • Java SE 8 и SE 9 и позже
    • встроенный.
    • часть стандартного Java API с комплектной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • большая часть java.функциональность время портированы с Java 6 и 7 в ThreeTen-Backport.
  • Android

в ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы, такие как Interval,YearWeek,YearQuarter и больше.

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

Пт апр 04 14: 27: 05 PDT 2014

Joda Времени

Я думаю, что вы можете использовать Joda Времени для этого. Взгляните на DateTime класса и его getMillisOfSecond метод. Что-то вроде

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

в Java 8, вы можете просто сделать

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

возвращает : количество миллисекунд с эпохи 1970-01-01T00:00: 00Z

Я сделал тест с помощью java 8 Это не имеет значения порядок строитель всегда занимает 0 миллисекунд и конкат между 26 и 33 миллисекундами под и итерации 1000 конкатенации

надеюсь, что это поможет попробовать его с вашей ide

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));
    }