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.