Android получить текущую метку времени?

249

Я хочу получить текущую временную метку вот так: 1320917972

int time = (int) (System.currentTimeMillis());
Timestamp tsTemp = new Timestamp(time);
String ts =  tsTemp.toString();
Ряйби Мейди
источник
2
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Намерение вещание , чтобы узнать , когда меняется время.

drooooooid
источник
11
На сайте 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()до секунд.

String timeStamp = String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));
sealskej
источник
29

Вы можете использовать класс SimpleDateFormat :

SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss");
String format = s.format(new Date());
Пратик Бутани
источник
22
Это не отметка времени (время с эпохи)
Михал К
1
Не временная метка и, более того, совсем не эффективная (создание SimpleDateFormat, создание даты, преобразование). Избегай это.
Сейнорт
Вы отвечаете на что-то еще, но это также верно.
Ersks
24

Используйте метод ниже, чтобы получить текущую отметку времени. Он отлично работает для меня.

/**
 * 
 * @return yyyy-MM-dd HH:mm:ss formate date as string
 */
public static String getCurrentTimeStamp(){
    try {

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String currentDateTime = dateFormat.format(new Date()); // Find todays date

        return currentDateTime;
    } catch (Exception e) {
        e.printStackTrace();

        return null;
    }
}
Хиты
источник
37
Это не отметка времени.
1
@ Хиты, это простой формат даты, а не отметка времени. Вы просто используете имя переменной в качестве currentTimeStap.
Ersks
12

Это простое использование:

long millis = new Date().getTime();

если вы хотите в определенном формате, то вам нужен Formatter, как показано ниже

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String millisInString  = dateFormat.format(new Date());
Pranav
источник
8

Вот удобочитаемая отметка времени, которая может использоваться в имени файла, на случай, если кому-то понадобится то же, что и мне:

package com.example.xyz;

import android.text.format.Time;

/**
 * Clock utility.
 */
public class Clock {

    /**
     * Get current time in human-readable form.
     * @return current time as a string.
     */
    public static String getNow() {
        Time now = new Time();
        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.
     */
    public static String getTimeStamp() {
        Time now = new Time();
        now.setToNow();
        String sTime = now.format("%Y_%m_%d_%H_%M_%S");
        return sTime;
    }

}
18446744073709551615
источник
1
Эй, а ты не мог бы рассказать, как лучше отсортировать список временных меток? Я думал о сортировке их сам, но думал, что может быть лучший способ.
Аббас
Для использования в будущем для тех, кто читает это, помните, что «android.text.format.Time» теперь устарело
jason.kaisersmith
5

Попробуйте эти

time.setText(String.valueOf(System.currentTimeMillis()));

и метка времени в формате времени

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
String dateString = formatter.format(new Date(Long.parseLong(time.getText().toString())));
time.setText(dateString);
Моджахед хан
источник
4

java.time

Я хотел бы внести современный ответ.

    String ts = String.valueOf(Instant.now().getEpochSecond());
    System.out.println(ts);

Вывод при запуске только сейчас:

1543320466

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

InstantКласс , который я использую является частью java.time, современной даты Java и времени API. Он встроен в новые версии Android, API уровня 26 и выше. Если вы программируете для более старого Android, вы можете получить бэкпорт, см. Ниже. Если вы не хотите этого делать, понятно, что я бы все еще использовал встроенное преобразование:

    String ts = String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));
    System.out.println(ts);

Это так же, как ответ по 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подпакетов.

связи

Оле В.В.
источник
1
Почти идеальный ответ (я проголосовал), но, по крайней мере, по моему честному мнению, вы должны удалить ссылку на 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.

DSavi
источник
0

Я предлагаю использовать ответ Hits, но добавив формат Locale, разработчики Android рекомендуют следующее :

try {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
        return dateFormat.format(new Date()); // Find todays date
    } catch (Exception e) {
        e.printStackTrace();

        return null;
    }
Faustino Gagneten
источник
0

Этот код является версией Kotlin. У меня есть еще одна идея добавить случайное целое число в последнюю цифру для определения времени эпохи дисперсии.

Котлин версия

val randomVariance = (0..100).shuffled().first()
val currentEpoch = (System.currentTimeMilis()/1000) + randomVariance

val deltaEpoch = oldEpoch - currentEpoch

Я думаю, что будет лучше использовать этот код, чем зависит от версии Android 26 или более

оборота Субханшуйя
источник