Android Dapatkan cap waktu saat ini?


247

Saya ingin mendapatkan cap waktu saat ini seperti itu: 1320917972

int time = (int) (System.currentTimeMillis());
Timestamp tsTemp = new Timestamp(time);
String ts =  tsTemp.toString();

2
FYI, merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan Timestampsekarang warisan, digantikan oleh java.time kelas. Sebagian besar fungsi java.time di - portingkan ke Java 6 & Java 7 di proyek ThreeTen-Backport . Lebih lanjut diadaptasi untuk Android sebelumnya dalam proyek ThreeTenABP . Lihat Cara menggunakan ThreeTenABP… .
Basil Bourque

Jawaban:


298

Solusinya adalah:

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

Ini tidak memperhitungkan offset zona waktu perangkat.
kjdion84

1
@ kjdion84 permisi, tapi kenapa menurutmu itu penting? Hanya berdasarkan pertanyaan.
Cԃ ա ԃ

82

Dari blog pengembang:

System.currentTimeMillis()adalah jam "dinding" standar (waktu dan tanggal) yang menyatakan milidetik sejak zaman. Jam dinding dapat diatur oleh pengguna atau jaringan telepon (lihat setCurrentTimeMillis (panjang) ), sehingga waktu dapat melompat mundur atau maju secara tak terduga. Jam ini hanya boleh digunakan ketika korespondensi dengan tanggal dan waktu di dunia nyata penting, seperti dalam aplikasi kalender atau jam alarm. Pengukuran waktu interval atau berlalu harus menggunakan jam yang berbeda. Jika Anda menggunakan System.currentTimeMillis(), pertimbangkan mendengarkan ACTION_TIME_TICK, ACTION_TIME_CHANGEDdan ACTION_TIMEZONE_CHANGEDsiaran Intent untuk mengetahui kapan waktu berubah.


11
Dari developer.android.com/reference/java/lang/… Saya menemukan itu System.nanoTime()adalah alternatif untuk System.currentTimeMillis()dan tidak memiliki fluktuasi yang tidak terduga, dan dirancang untuk mengukur perbedaan durasi.
Bianca Daniciuc

2
@ ana01 "nilai nol biasanya setiap kali perangkat terakhir kali dibooting" - sehingga hanya dapat digunakan saat Anda membandingkan perbedaan durasi pada perangkat yang sama. Tidak berguna untuk penyimpanan basis data misalnya.
Michał K

1
Hanya catatan untuk komentar @ ana01 yang System.nanoTime()tidak cocok untuk menampilkan waktu jam dinding. Untuk itu, gunakan System.currentTimeMillis()saja.
Akash Agarwal

33

1320917972 adalah cap waktu Unix menggunakan jumlah detik sejak 00:00:00 UTC pada 1 Januari 1970. Anda dapat menggunakan TimeUnitkelas untuk konversi satuan - dari System.currentTimeMillis()detik.

String timeStamp = String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));

29

Anda dapat menggunakan kelas SimpleDateFormat :

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

22
Ini bukan cap waktu (waktu sejak zaman)
Michał K

1
Bukan cap waktu, dan terlebih lagi, tidak efektif sama sekali (pembuatan SimpleDateFormat, pembuatan tanggal, konversi). Hindari itu.
Seynorth

Anda menjawab yang lain, tetapi juga valid.
ersks

24

Gunakan metode di bawah ini untuk mendapatkan cap waktu saat ini. Ini bekerja dengan baik untuk saya.

/**
 * 
 * @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
Itu bukan cap waktu.

1
@Hits, Ini Format Tanggal Sederhana, bukan cap waktu. Anda hanya menggunakan nama variabel sebagai currentTimeStap.
ersks

12

Ini penggunaan sederhana:

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

jika Anda menginginkannya dalam format tertentu maka Anda perlu Formatter seperti di bawah ini

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

8

Berikut ini adalah cap waktu yang dapat dibaca manusia yang dapat digunakan dalam nama file, untuk berjaga-jaga seandainya seseorang membutuhkan hal yang sama yang saya butuhkan:

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
Hei, bisakah kamu juga memberi tahu cara terbaik untuk mengurutkan daftar cap waktu? Saya berpikir untuk menyortirnya sendiri tetapi saya pikir mungkin ada cara yang lebih baik.
Abbas

Untuk referensi di masa mendatang bagi siapa pun yang membaca ini, ketahuilah bahwa "android.text.format.Time" sekarang tidak digunakan lagi
jason.kaisersmith

5

Coba ini

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

dan timeStamp ke format waktu

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
String dateString = formatter.format(new Date(Long.parseLong(time.getText().toString())));
time.setText(dateString);

4

waktu java

Saya ingin berkontribusi jawaban modern.

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

Output saat berjalan sekarang:

1543320466

Sementara pembagian oleh 1000 tidak akan mengejutkan banyak orang, melakukan konversi waktu Anda sendiri bisa menjadi sulit dibaca dengan cepat, jadi itu kebiasaan buruk untuk masuk ketika Anda bisa menghindarinya.

The Instantkelas yang saya gunakan adalah bagian dari java.time, tanggal Jawa modern dan waktu API. Ini bawaan pada versi Android baru, API level 26 dan lebih tinggi. Jika Anda memprogram untuk Android yang lebih lama, Anda mungkin mendapatkan backport, lihat di bawah. Jika Anda tidak ingin melakukan itu, dapat dimengerti, saya masih menggunakan konversi bawaan:

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

Ini sama dengan jawaban oleh sealskej. Outputnya sama seperti sebelumnya.

Pertanyaan: Bisakah saya menggunakan java.time di Android?

Ya, java.time bekerja dengan baik pada perangkat Android yang lebih lama dan lebih baru. Itu hanya membutuhkan setidaknya Java 6 .

  • Di Java 8 dan yang lebih baru dan pada perangkat Android yang lebih baru (dari API level 26), API modern hadir.
  • Dalam Java 6 dan 7 yang bukan Android, dapatkan ThreeTen Backport, backport dari kelas baru (ThreeTen untuk JSR 310; lihat tautan di bagian bawah).
  • Pada (yang lebih tua) Android menggunakan ThreeTen Backport edisi Android. Itu disebut ThreeTenABP. Dan pastikan Anda mengimpor kelas tanggal dan waktu dari org.threeten.bpdengan subpackages.

Tautan


Jawabannya hampir sempurna (saya tervvotasikan) tetapi, setidaknya menurut pendapat jujur ​​saya, Anda harus menghapus referensi ThreeTen Backport karena ini adalah pertanyaan tentang Android dan bukan Java secara umum. Dan itu mungkin membingungkan bagi pemula di Android.
Slobodan Antonijević

1
@ SlobodanAntonijević Penting bagi programmer Android untuk memahami bahwa (a) jika mereka mendukung Android 26 dan kemudian, mereka memiliki implementasi java.time built-in, (b) jika mendukung Android awal sebelum 26, mereka harus menambahkan perpustakaan , pustaka ThreeTenABP , dan (c) jika menggunakan ThreeTenABP , ketahuilah bahwa pustaka ini sebenarnya merupakan adaptasi dari ThreeTen-Backport yang diadaptasi dari Java ke Android. The ThreeTenABP perpustakaan hanya bungkus Android khusus sekitar ThreeTen-backport perpustakaan. Lihat grafik ini membandingkan 3 perpustakaan.
Basil Bourque

@ BasilBourque Anda sepenuhnya benar. Tapi, Anda sebenarnya bisa mengimpor ThreeTen-Backport dan menggunakannya di aplikasi Android, tetapi dengan dampak yang sangat besar terhadap kinerja menyebabkan ketergantungan JAR-nya. Inilah sebabnya saya mengatakan bahwa postingan itu harus lebih spesifik bahwa Android devs seharusnya tidak pernah menggunakan ThreeTen-Backport, dan alih-alih menggunakan ThreeTenABP untuk API 25 dan di bawah dukungan. Saya telah melihat banyak dev di berbagai papan yang bingung mana yang harus digunakan untuk Android, karena mereka terdengar mirip namanya.
Slobodan Antonijević

Poin bagus, @ SlobodanAntonijević. Saya telah mencoba membuatnya sedikit lebih jelas.
Ole VV

1
@ SlobodanAntonijević Tabel ini menunjukkan di mana mendapatkan java.time untuk Java dan Android mungkin membantu menjelaskannya.
Basil Bourque

3

Solusi di Kotlin:

val nowInEpoch = Instant.now().epochSecond

Pastikan versi SDK minimum Anda adalah 26.


0

Saya sarankan menggunakan jawaban Hits, tetapi menambahkan format Lokal, ini yang direkomendasikan oleh Pengembang 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

Kode ini adalah versi Kotlin. Saya punya ide lain untuk menambahkan integer acak acak dalam digit terakhir untuk memberikan waktu varians zaman.

Versi Kotlin

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

val deltaEpoch = oldEpoch - currentEpoch

Saya pikir akan lebih baik menggunakan kode ini kemudian tergantung pada versi android 26 atau lebih

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.