Android Отримати поточну позначку часу?


248

Я хочу отримати поточну позначку часу таким чином: 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… .
Василь Бурк

Відповіді:


299

Рішення таке:

Long tsLong = System.currentTimeMillis()/1000;
String ts = tsLong.toString();

Це не враховує зміщення часового поясу пристрою.
kjdion84

1
@ kjdion84 вибачте мене, але чому ви вважаєте, що це було б важливо? Просто на основі запитання.
Cԃ ա ԃ

82

З блогу розробників:

System.currentTimeMillis()- це стандартний "настінний" годинник (час і дата), що виражає мілісекунди з епохи. Настінний годинник може бути встановлений користувачем або телефонною мережею (див. SetCurrentTimeMillis (довгий) ), тому час може непередбачувано стрибати назад або вперед. Цей годинник слід використовувати лише тоді, коли важливі кореспонденція з реальними датами та часом, наприклад у календарі чи програмі будильника. Для інтервальних або минулих вимірювань часу слід використовувати інший годинник. Якщо ви використовуєте System.currentTimeMillis(), розглянути слухаючи ACTION_TIME_TICK, ACTION_TIME_CHANGEDі ACTION_TIMEZONE_CHANGEDНамір мовлення , щоб дізнатися , коли змінюється час.


11
Від developer.android.com/reference/java/lang/… я виявив, що System.nanoTime()це альтернатива System.currentTimeMillis()і не має непередбачуваних коливань, і призначений для вимірювання різниці в тривалості.
Біанка Даніцюк

2
@ ana01 "нульове значення, як правило, кожного разу, коли пристрій востаннє завантажився" - тому його можна використовувати лише при порівнянні різниці тривалості на одному пристрої. Наприклад, не корисно для зберігання баз даних.
Michał K

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

29

Ви можете використовувати клас SimpleDateFormat :

SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss");
String format = s.format(new Date());

22
Це не часова марка (час з епохи)
Michał K

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
@Hits, це простий формат дати, а не часова марка. Ви просто використовуєте ім'я змінної як currentTimeStap.
ersks

12

Це просте використання:

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

якщо ви хочете його в конкретному форматі, тоді вам потрібен Форматтер, як показано нижче

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String millisInString  = dateFormat.format(new Date());

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

}

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 та (c) якщо використовується 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.


0

Я пропоную скористатися відповіддю хітів, але додавши формат локальної локації, ось що розробники 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;
    }

0

Цей код - версія Котліна. У мене є ще одна ідея додати ціле число випадкового перетасування в останню цифру, щоб дати час епохи варіації.

Версія Котліна

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

val deltaEpoch = oldEpoch - currentEpoch

Я думаю, що краще буде скористатися цим кодом, а потім залежати від андроїд версії 26 або більше

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.