Ответ 1
Вы имеете в виду?
long millis = System.currentTimeMillis() % 1000;
BTW Windows не позволяет использовать timetravel до 1969
C:\> date
Enter the new date: (dd-mm-yy) 2/8/1969
The system cannot accept the date entered.
Заметьте, я не хочу миллисов от эпохи. Я хочу, чтобы количество миллисекунд в настоящее время было на часах.
Так, например, у меня есть этот бит кода.
Date date2 = new Date();
Long time2 = (long) (((((date2.getHours() * 60) + date2.getMinutes())* 60 ) + date2.getSeconds()) * 1000);
Есть ли способ получить миллисекунды с датой? Есть ли другой способ сделать это?
Примечание: System.currentTimeMillis()
дает мне миллис от эпохи, чего я не ищу.
Вы имеете в виду?
long millis = System.currentTimeMillis() % 1000;
BTW Windows не позволяет использовать timetravel до 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);
На практике, хотя я думаю, что он почти всегда будет равен System.currentTimeMillis()% 1000; если у кого-то есть скачок-миллисекунды или какой-то календарь определен с эпохой, а не на второй границе.
Calendar.getInstance().get(Calendar.MILLISECOND);
Я попробовал несколько выше, но они выглядят как reset @1000
Этот человек определенно работает, а также должен учитывать год
long millisStart = Calendar.getInstance().getTimeInMillis();
а затем сделать то же самое для конечного времени, если это необходимо.
long timeNow = System.currentTimeMillis();
System.out.println(new Date(timeNow));
Пт Апр 04 14:27:05 PDT 2014
Я думаю, вы можете использовать Joda-Time для этого. Взгляните на класс DateTime
и его getMillisOfSecond
. Что-то вроде
int ms = new DateTime().getMillisOfSecond() ;
Вы запрашиваете долю секунды текущего времени как количество миллисекунд (не считая с эпохи).
long millis = ( Instant.now().getNano() / 1_000_000L ) ;
2017-04-25T03: 01:14.113Z →
113
Смотрите этот запуск кода на IdeOne.com.
Современный способ - это классы java.time.
Захват текущего момента в UTC.
Instant.now()
Скорее всего, вы просите об этом для определенного часового пояса. Доля секунды, вероятно, будет такой же, как с Instant
, но существует так много аномалий с часовыми поясами, я стесняюсь сделать это предположение.
ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ) ;
Опросить дробную секунду. Вопрос задал миллисекунды, но классы java.time используют более точное разрешение наносекунд. Это означает, что число наносекунд будет варьироваться от 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.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятный старый legacy классы даты-времени, такие как java.util.Date
, Calendar
и SimpleDateFormat
.
Проект Joda-Time, теперь режим обслуживания, советуем перейти к классам java.time.
Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval
, YearWeek
, YearQuarter
и больше.
В Java 8 вы можете просто сделать
ZonedDateTime.now().toInstant().toEpochMilli()
возвращает: число миллисекунд с эпохи 1970-01-01T00: 00: 00Z
Я проверил с помощью java 8 Это не имеет значения, когда строитель всегда занимает 0 миллисекунд, а concat - между 26 и 33 миллисекундами и итерацией 1000 конкатенаций
Надеюсь, что это поможет попробовать с идеей
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));
}