Android Get Current zaman damgası?


248

Geçerli zaman damgasını şu şekilde almak istiyorum: 1320917972

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

2
Bilginize, gibi zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve Timestampsupplanted şimdi mirası, java.time sınıfları. Java.time işlevinin çoğu , ThreeTen-Backport projesinde Java 6 ve Java 7'ye geri yüklenmiştir . ThreeTenABP projesinde daha önceki Android için daha da uyarlandı . Bkz . ThreeTenABP nasıl kullanılır… .
Basil Bourque

Yanıtlar:


299

Çözüm şudur :

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

Bu, cihazın saat dilimi sapmasını etkilemez.
kjdion84

1
@ kjdion84 afedersiniz, ama bunun neden önemli olacağını düşünüyorsunuz? Sadece soruya dayanıyor.
Cԃ ա ԃ

82

Geliştiriciler blogundan:

System.currentTimeMillis()dönemden bu yana geçen milisaniyeyi ifade eden standart "duvar" saatidir (saat ve tarih). Duvar saati kullanıcı veya telefon şebekesi tarafından ayarlanabilir (bkz. SetCurrentTimeMillis (uzun) ), böylece zaman beklenmedik şekilde geriye veya ileriye doğru atlayabilir. Bu saat yalnızca takvim veya çalar saat uygulaması gibi gerçek dünyadaki tarih ve saatlerle yazışma önemli olduğunda kullanılmalıdır. Aralıklı veya geçen zaman ölçümleri farklı bir saat kullanmalıdır. Kullanıyorsanız , zamanın ne zaman değiştiğini öğrenmek System.currentTimeMillis()için ACTION_TIME_TICK, ACTION_TIME_CHANGEDve ACTION_TIMEZONE_CHANGEDniyet yayınlarını dinlemeyi düşünün .


11
Gönderen developer.android.com/reference/java/lang/... bunu buldum System.nanoTime()bir alternatiftir System.currentTimeMillis()ve hiçbir öngörülemeyen dalgalanmalar vardır ve süresi farklılıklarını ölçmek için tasarlanmıştır.
Bianca Daniciuc

2
@ ana01 "sıfır değeri genellikle aygıt her son başlatıldığındadır" - bu nedenle yalnızca aynı aygıttaki süre farklarını karşılaştırdığınızda kullanılabilir. Örneğin veritabanı depolaması için kullanışlı değildir.
Michał K

1
@ Ana01'in System.nanoTime()duvar saati zamanını göstermeye uygun olmayan yorumuna bir not . Bunun için System.currentTimeMillis()kullanın.
Akash Agarwal

33

1320917972 , 1 Ocak 1970 saat 00:00:00 UTC'den bu yana saniye sayısını kullanan Unix zaman damgasıdırTimeUnit . Birim dönüştürme için sınıfı kullanabilirsiniz - System.currentTimeMillis()saniye arasında.

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

29

SimpleDateFormat sınıfını kullanabilirsiniz :

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

22
Bu bir zaman damgası değil (çağdan beri geçen zaman)
Michał K

1
Bir zaman damgası değil ve dahası, hiç de etkili değil (SimpleDateFormat'ın oluşturulması, tarihin oluşturulması, dönüşüm). Bunu önlemek.
Seynorth

Başka bir şey cevaplıyorsunuz, ama aynı zamanda geçerli.
ersks

24

Geçerli zaman damgasını almak için aşağıdaki yöntemi kullanın. Benim için iyi çalışıyor.

/**
 * 
 * @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
Bu bir zaman damgası değil.

1
@Hits, Basit Tarih Formatı, zaman damgası değil. Değişken adını currentTimeStap olarak kullanıyorsunuz.
ersks

12

Basit kullanım:

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

belirli bir biçimde istiyorsanız, aşağıdaki gibi Formatter'a ihtiyacınız vardır

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

8

Burada, birinin ihtiyacım olanla aynı şeye ihtiyacı olması durumunda, dosya adında kullanılabilecek insan tarafından okunabilir bir zaman damgası verilmiştir:

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
Hey, ayrıca zaman damgalarının bir listesini sıralamanın en iyi yolunu söyleyebilir misiniz? Onları kendim sıralamayı düşünüyordum ama daha iyi bir yol olabileceğini düşündüm.
Abbas

Gelecekte bunu okuyan herkes için başvurmak üzere "android.text.format.Time" in artık kullanımdan kaldırıldığını unutmayın
jason.kaisersmith

5

Bunları dene

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

ve timeStampa zaman formatı

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

4

java.time

Modern cevaba katkıda bulunmak istiyorum.

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

Hemen şimdi çalışırken çıktı:

1543320466

1000'e bölünme birçok kişi için sürpriz olmayacak olsa da, kendi zaman dönüşümlerinizi yapmak oldukça hızlı okumak zor olabilir, bu yüzden kaçınabildiğinizde girmek kötü bir alışkanlıktır.

Kullandığım Instantsınıf, modern Java tarih ve saat API'sı java.time'ın bir parçasıdır. Yeni Android sürümleri, API seviye 26 ve üstü üzerinde yerleşiktir. Eski Android için programlıyorsanız, backport'u alabilirsiniz, aşağıya bakın. Bunu yapmak istemiyorsanız, anlaşılır bir şekilde, yine de yerleşik bir dönüşüm kullanacağım:

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

Bu sealskej'in cevabı ile aynı. Çıktı öncekiyle aynı.

Soru: Android'de java.time kullanabilir miyim?

Evet, java.time eski ve yeni Android cihazlarda güzel çalışıyor. Sadece en az Java 6 gerektirir .

  • Java 8 ve sonraki sürümlerde ve daha yeni Android cihazlarda (API düzey 26'dan) modern API yerleşik olarak gelir.
  • Android olmayan Java 6 ve 7'de, yeni sınıfların backport'u olan ThreeTen Backport'u edinin (JSR 310 için ThreeTen; alttaki bağlantılara bakın).
  • (Daha eski) Android cihazlarında ThreeTen Backport'un Android sürümünü kullanın. Buna ThreeTenABP deniyor. Ve tarih ve saat sınıflarını org.threeten.bpalt paketlerle aldığınızdan emin olun .

Bağlantılar


1
Neredeyse mükemmel cevap (kaldırdım) ama en azından dürüst düşüncemle, ThreeTen Backport referansını kaldırmalısınız, çünkü bu genel olarak Java değil Android hakkında bir soru. Ve Android'de yeni başlayanlar için kafa karıştırıcı olabilir.
Slobodan Antonijević

1
@ SlobodanAntonijević Android programcılarının (a) Android 26'yı destekliyorlarsa ve daha sonra, yerleşik java.time uygulaması varsa, (b) 26'dan önce Android'i destekliyorlarsa, bir kütüphane eklemeleri gerektiğini anlamak önemlidir. , ThreeTenABP kütüphanesi ve (c) ThreeTenABP kullanıyorsanız , bu kütüphanenin aslında Java'dan Android'e uyarlanan ThreeTen-Backport'un bir uyarlaması olduğunu bilin . ThreeTenABP kütüphane sadece etrafında Android'e özel sarıcı ThreeTen-backport kütüphanesine. 3 kütüphaneyi karşılaştıran bu tablo grafiğine bakınız .
Basil Bourque

@BasilBourque tamamen haklısın. Ancak, ThreeTen-Backport'u içe aktarabilir ve bir Android uygulamasında kullanabilirsiniz, ancak JAR bağımlılığının performans nedeni üzerinde son derece büyük bir etkisi vardır. Bu nedenle, yazının Android geliştiricilerin asla ThreeTen-Backport kullanmaması ve bunun yerine API 25 ve altı desteği için ThreeTenABP kullanmaması gerektiğinden daha spesifik olması gerektiğini söyledim. Çeşitli tahtalarda, Android için hangisinin kullanılması gerektiği konusunda şaşkın olan sayısız geliştirici gördüm, çünkü adlarına benzer geliyorlar.
Slobodan Antonijević

İyi nokta, @ SlobodanAntonijević. Bunu biraz daha açıklığa kavuşturmaya çalıştım.
Ole VV

1
@ SlobodanAntonijević Java ve Android için java.time öğesinin nereden alınacağını gösteren bu tablo , bunu netleştirmeye yardımcı olabilir.
Basil Bourque

3

Kotlin'de Çözüm:

val nowInEpoch = Instant.now().epochSecond

Minimum SDK sürümünüzün 26 olduğundan emin olun.


0

Hits'in cevabını kullanmanızı öneririm, ancak bir Yerel Ayar biçimi ekleyerek, Android Geliştiricileri şu şekilde önerir :

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

Bu kod Kotlin sürümüdür. Varyans dönemi vermek için son basamakta rastgele shuffle tamsayısı eklemek için başka bir fikrim var.

Kotlin versiyonu

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

val deltaEpoch = oldEpoch - currentEpoch

Bu kode kullanarak daha iyi olacağını düşünüyorum sonra android sürüm 26 veya daha fazla bağlıdır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.