FYI, хлопотно старые классы даты и времени , такие как java.util.Date, java.util.Calendarи Timestampтеперь наследие, вытесняется java.time классов. Большая часть функциональности java.time перенесена на Java 6 и Java 7 в проекте ThreeTen-Backport . Далее адаптирован для более ранней версии Android в проекте ThreeTenABP . Смотрите Как использовать ThreeTenABP… .
Василий Бурк
Ответы:
300
Решение:
Long tsLong =System.currentTimeMillis()/1000;String ts = tsLong.toString();
Это не учитывает смещение часового пояса устройства.
kjdion84
1
@ kjdion84 извините, но как вы думаете, это будет важно? Просто на основании вопроса.
Cԃ ա ԃ
82
Из блога разработчиков:
System.currentTimeMillis()это стандартные «настенные» часы (время и дата), выражающие миллисекунды начиная с эпохи. Настенные часы могут быть установлены пользователем или телефонной сетью (см. SetCurrentTimeMillis (long) ), поэтому время может прыгать назад или вперед непредсказуемо. Эти часы следует использовать только в тех случаях, когда важна переписка с реальными датами и временем, например, в приложении с календарем или будильником. Для измерения интервала или истекшего времени следует использовать разные часы. Если вы используете System.currentTimeMillis(), рассмотреть слушая ACTION_TIME_TICK, ACTION_TIME_CHANGEDи ACTION_TIMEZONE_CHANGEDНамерение вещание , чтобы узнать , когда меняется время.
На сайте developer.android.com/reference/java/lang/ я обнаружил, что System.nanoTime()он является альтернативой System.currentTimeMillis()и не имеет непредсказуемых колебаний и предназначен для измерения различий в продолжительности.
Бьянка Даничук
2
@ ana01 «нулевое значение обычно соответствует последней загрузке устройства», поэтому его можно использовать только при сравнении различий в продолжительности на одном устройстве. Не полезно для хранения базы данных, например.
Михал К
1
Просто примечание к комментарию @ ana01, System.nanoTime()которое не подходит для отображения времени на настенных часах. Для этого используйте System.currentTimeMillis()вместо этого.
Акаш Агарвал
33
1320917972 - это метка времени Unix, использующая количество секунд с 00:00:00 UTC 1 января 1970 года. Вы можете использовать TimeUnitкласс для преобразования единиц измерения - от System.currentTimeMillis()до секунд.
Вот удобочитаемая отметка времени, которая может использоваться в имени файла, на случай, если кому-то понадобится то же, что и мне:
package com.example.xyz;import android.text.format.Time;/**
* Clock utility.
*/publicclassClock{/**
* Get current time in human-readable form.
* @return current time as a string.
*/publicstaticString getNow(){Time now =newTime();
now.setToNow();String sTime = now.format("%Y_%m_%d %T");return sTime;}/**
* Get current time in human-readable form without spaces and special characters.
* The returned value may be used to compose a file name.
* @return current time as a string.
*/publicstaticString getTimeStamp(){Time now =newTime();
now.setToNow();String sTime = now.format("%Y_%m_%d_%H_%M_%S");return sTime;}}
В то время как деление на 1000 не станет неожиданностью для многих, выполнение ваших собственных преобразований времени может быть затруднено для довольно быстрого чтения, поэтому это плохая привычка, когда вы можете избежать этого.
InstantКласс , который я использую является частью java.time, современной даты Java и времени API. Он встроен в новые версии Android, API уровня 26 и выше. Если вы программируете для более старого Android, вы можете получить бэкпорт, см. Ниже. Если вы не хотите этого делать, понятно, что я бы все еще использовал встроенное преобразование:
Это так же, как ответ по sealskej. Выход такой же, как и раньше.
Вопрос: Могу ли я использовать java.time на Android?
Да, java.time прекрасно работает на старых и новых устройствах Android. Это просто требует как минимум Java 6 .
В Java 8 и более поздних версиях, а также на более новых устройствах Android (начиная с уровня API 26) встроен современный API.
В не-Android Java 6 и 7 получают ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. Ссылки внизу).
На (более старой) версии Android используется версия Android ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bpподпакетов.
Почти идеальный ответ (я проголосовал), но, по крайней мере, по моему честному мнению, вы должны удалить ссылку на ThreeTen Backport, так как это вопрос об Android, а не о Java в целом. И это может запутать новичков в Android.
Слободан Антониевич
1
@ SlobodanAntonijević Для программистов Android важно понимать, что (a) если они поддерживают Android 26 и более поздние версии , они имеют встроенную реализацию java.time , (b) если поддерживается ранняя версия Android до 26, они должны добавить библиотеку , то ThreeTenABP библиотека, и (в) при использовании ThreeTenABP , знайте , что эта библиотека на самом деле является адаптация ThreeTen-Backport заимствована из Java в Android. Библиотека ThreeTenABP - это просто специальная обертка для Android вокруг библиотеки ThreeTen-Backport . Посмотрите на эту таблицу, сравнивая 3 библиотеки.
Базилик Бурк
@BasilBourque вы совершенно правы. Но на самом деле вы можете импортировать ThreeTen-Backport и использовать его в приложении для Android, но это очень сильно сказывается на производительности, так как зависит от JAR. Вот почему я сказал, что пост должен быть более конкретным, чтобы разработчики Android никогда не использовали ThreeTen-Backport, а вместо этого использовали ThreeTenABP для поддержки API 25 и ниже. Я видел множество разработчиков на разных платах, которые запутались в том, какую из них использовать для Android, потому что они звучат одинаково по названию.
Слободан Антониевич
Хороший вопрос, @ SlobodanAntonijević. Я попытался сделать это немного яснее.
Оле В.В.
1
@ SlobodanAntonijević Эта таблица, показывающая, где получить java.time для Java и Android, может помочь прояснить ситуацию .
Базилик Бурк
3
Решение в Котлине:
val nowInEpoch =Instant.now().epochSecond
Убедитесь, что ваша минимальная версия SDK составляет 26.
Этот код является версией Kotlin. У меня есть еще одна идея добавить случайное целое число в последнюю цифру для определения времени эпохи дисперсии.
Котлин версия
val randomVariance =(0..100).shuffled().first()
val currentEpoch =(System.currentTimeMilis()/1000)+ randomVariance
val deltaEpoch = oldEpoch - currentEpoch
Я думаю, что будет лучше использовать этот код, чем зависит от версии Android 26 или более
java.util.Date
,java.util.Calendar
иTimestamp
теперь наследие, вытесняется java.time классов. Большая часть функциональности java.time перенесена на Java 6 и Java 7 в проекте ThreeTen-Backport . Далее адаптирован для более ранней версии Android в проекте ThreeTenABP . Смотрите Как использовать ThreeTenABP… .Ответы:
Решение:
источник
Из блога разработчиков:
System.currentTimeMillis()
это стандартные «настенные» часы (время и дата), выражающие миллисекунды начиная с эпохи. Настенные часы могут быть установлены пользователем или телефонной сетью (см. SetCurrentTimeMillis (long) ), поэтому время может прыгать назад или вперед непредсказуемо. Эти часы следует использовать только в тех случаях, когда важна переписка с реальными датами и временем, например, в приложении с календарем или будильником. Для измерения интервала или истекшего времени следует использовать разные часы. Если вы используетеSystem.currentTimeMillis()
, рассмотреть слушаяACTION_TIME_TICK
,ACTION_TIME_CHANGED
иACTION_TIMEZONE_CHANGED
Намерение вещание , чтобы узнать , когда меняется время.источник
System.nanoTime()
он является альтернативойSystem.currentTimeMillis()
и не имеет непредсказуемых колебаний и предназначен для измерения различий в продолжительности.System.nanoTime()
которое не подходит для отображения времени на настенных часах. Для этого используйтеSystem.currentTimeMillis()
вместо этого.1320917972 - это метка времени Unix, использующая количество секунд с 00:00:00 UTC 1 января 1970 года. Вы можете использовать
TimeUnit
класс для преобразования единиц измерения - отSystem.currentTimeMillis()
до секунд.источник
Вы можете использовать класс SimpleDateFormat :
источник
Используйте метод ниже, чтобы получить текущую отметку времени. Он отлично работает для меня.
источник
Это простое использование:
если вы хотите в определенном формате, то вам нужен Formatter, как показано ниже
источник
Вот удобочитаемая отметка времени, которая может использоваться в имени файла, на случай, если кому-то понадобится то же, что и мне:
источник
Попробуйте эти
и метка времени в формате времени
источник
java.time
Я хотел бы внести современный ответ.
Вывод при запуске только сейчас:
В то время как деление на 1000 не станет неожиданностью для многих, выполнение ваших собственных преобразований времени может быть затруднено для довольно быстрого чтения, поэтому это плохая привычка, когда вы можете избежать этого.
Instant
Класс , который я использую является частью java.time, современной даты Java и времени API. Он встроен в новые версии Android, API уровня 26 и выше. Если вы программируете для более старого Android, вы можете получить бэкпорт, см. Ниже. Если вы не хотите этого делать, понятно, что я бы все еще использовал встроенное преобразование:Это так же, как ответ по sealskej. Выход такой же, как и раньше.
Вопрос: Могу ли я использовать java.time на Android?
Да, java.time прекрасно работает на старых и новых устройствах Android. Это просто требует как минимум Java 6 .
org.threeten.bp
подпакетов.связи
java.time
.java.time
был впервые описан.java.time
в Java 6 и 7 (ThreeTen для JSR-310).источник
Решение в Котлине:
Убедитесь, что ваша минимальная версия SDK составляет 26.
источник
Я предлагаю использовать ответ Hits, но добавив формат Locale, разработчики Android рекомендуют следующее :
источник
Этот код является версией Kotlin. У меня есть еще одна идея добавить случайное целое число в последнюю цифру для определения времени эпохи дисперсии.
Котлин версия
Я думаю, что будет лучше использовать этот код, чем зависит от версии Android 26 или более
источник