Android Obtenir l'horodatage actuel?

249

Je veux obtenir l'horodatage actuel comme ça: 1320917972

int time = (int) (System.currentTimeMillis());
Timestamp tsTemp = new Timestamp(time);
String ts =  tsTemp.toString();
Rjaibi Mejdi
la source
2
Pour votre information, les classes date de temps anciens gênants tels que java.util.Date, java.util.Calendaret Timestampsont maintenant héritage, supplanté par les java.time classes. La plupart des fonctionnalités java.time sont rétroportées vers Java 6 et Java 7 dans le projet ThreeTen-Backport . Adapté davantage pour les versions antérieures d'Android dans le projet ThreeTenABP . Voir Comment utiliser ThreeTenABP… .
Basil Bourque

Réponses:

300

La solution est:

Long tsLong = System.currentTimeMillis()/1000;
String ts = tsLong.toString();
Rjaibi Mejdi
la source
Cela ne tient pas compte du décalage de fuseau horaire de l'appareil.
kjdion84
1
@ kjdion84 excusez-moi, mais pourquoi pensez-vous que ce serait important? Juste basé sur la question.
Cԃ ա ԃ
82

Du blog des développeurs:

System.currentTimeMillis()est l'horloge "murale" standard (heure et date) exprimant les millisecondes depuis l'époque. L'horloge murale peut être réglée par l'utilisateur ou le réseau téléphonique (voir setCurrentTimeMillis (long) ), de sorte que l'heure peut reculer ou avancer de façon imprévisible. Cette horloge ne doit être utilisée que lorsque la correspondance avec des dates et des heures réelles est importante, comme dans un calendrier ou une application de réveil. Les mesures d'intervalle ou de temps écoulé doivent utiliser une horloge différente. Si vous utilisez System.currentTimeMillis(), envisagez l' écoute de la ACTION_TIME_TICK, ACTION_TIME_CHANGEDet les ACTION_TIMEZONE_CHANGEDémissions intention de savoir quand le temps change.

drooooooid
la source
11
De developer.android.com/reference/java/lang/… j'ai trouvé que System.nanoTime()c'est une alternative à System.currentTimeMillis()et il n'a pas de fluctuations imprévisibles, et est conçu pour mesurer les différences de durée.
Bianca Daniciuc
2
@ ana01 "la valeur zéro correspond généralement au dernier démarrage de l'appareil" - elle ne peut donc être utilisée que lorsque vous comparez les différences de durée sur le même appareil. Pas utile pour le stockage de base de données par exemple.
Michał K
1
Juste une note au commentaire de @ ana01 qui System.nanoTime()ne convient pas pour afficher l'heure de l'horloge murale. À cette fin, utilisez System.currentTimeMillis()plutôt.
Akash Agarwal
33

1320917972 est l'horodatage Unix utilisant le nombre de secondes depuis 00:00:00 UTC le 1er janvier 1970. Vous pouvez utiliser la TimeUnitclasse pour la conversion d'unité - de System.currentTimeMillis()à secondes.

String timeStamp = String.valueOf(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()));
sealskej
la source
29

Vous pouvez utiliser la classe SimpleDateFormat :

SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss");
String format = s.format(new Date());
Pratik Butani
la source
22
Ce n'est pas un horodatage (temps depuis l'époque)
Michał K
1
Pas un horodatage, et d'ailleurs, pas du tout efficace (création de SimpleDateFormat, création de date, conversion). L'éviter.
Seynorth
Vous répondez à autre chose, mais c'est également valable.
ersks
24

Utilisez la méthode ci-dessous pour obtenir l'horodatage actuel. Ça fonctionne bien pour moi.

/**
 * 
 * @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;
    }
}
Les coups
la source
37
Ce n'est pas un horodatage.
1
@Hits, c'est un format de date simple, pas un horodatage. Vous utilisez simplement le nom de variable comme currentTimeStap.
ersks
12

C'est une utilisation simple:

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

si vous le voulez dans un format particulier, vous avez besoin d'un formateur comme ci-dessous

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

Voici un horodatage lisible par l'homme qui peut être utilisé dans un nom de fichier, juste au cas où quelqu'un aurait besoin de la même chose que celle dont j'avais besoin:

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
la source
1
Hé, pourriez-vous également indiquer la meilleure façon de trier une liste d'horodatages? Je pensais à les trier moi-même mais j'ai pensé qu'il pourrait y avoir une meilleure façon.
Abbas
Pour référence future pour tous ceux qui liront ceci, sachez que "android.text.format.Time" est désormais obsolète
jason.kaisersmith
5

Essayez ces

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

et timeStamp au format de l'heure

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

java.time

Je voudrais apporter la réponse moderne.

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

Sortie lors de l'exécution tout à l'heure:

1543320466

Bien que la division par 1000 ne soit pas une surprise pour beaucoup, faire vos propres conversions de temps peut être difficile à lire assez rapidement, donc c'est une mauvaise habitude de prendre quand vous pouvez l'éviter.

La Instantclasse que j'utilise fait partie de java.time, l'API Java moderne de date et d'heure. Il est intégré aux nouvelles versions d'Android, API niveau 26 et plus. Si vous programmez pour un ancien Android, vous pouvez obtenir le backport, voir ci-dessous. Si vous ne voulez pas le faire, il est compréhensible que j'utilise toujours une conversion intégrée:

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

C'est la même chose que la réponse de sealskej. La sortie est la même qu'avant.

Question: Puis-je utiliser java.time sur Android?

Oui, java.time fonctionne bien sur les appareils Android plus anciens et plus récents. Il nécessite juste au moins Java 6 .

  • Dans Java 8 et versions ultérieures et sur les appareils Android plus récents (à partir du niveau 26 de l'API), l'API moderne est intégrée.
  • Dans les versions non Android de Java 6 et 7, obtenez le ThreeTen Backport, le backport des nouvelles classes (ThreeTen for JSR 310; voir les liens en bas).
  • Sur (plus ancien) Android, utilisez l'édition Android de ThreeTen Backport. Cela s'appelle ThreeTenABP. Et assurez-vous d'importer les classes de date et d'heure org.threeten.bpavec des sous-packages.

Liens

Ole VV
la source
1
Réponse presque parfaite (j'ai voté positivement) mais, au moins à mon avis, vous devriez supprimer la référence ThreeTen Backport car il s'agit d'une question sur Android et non sur Java en général. Et cela peut être déroutant pour les débutants sur Android.
Slobodan Antonijević
1
@ SlobodanAntonijević Il est important pour les programmeurs Android de comprendre que (a) s'ils prennent en charge Android 26 et versions ultérieures, ils ont une implémentation de java.time intégrée, (b) s'ils prennent en charge Android tôt avant 26, ils doivent ajouter une bibliothèque , la bibliothèque ThreeTenABP , et (c) si vous utilisez ThreeTenABP , sachez que cette bibliothèque est en fait une adaptation de ThreeTen-Backport adaptée de Java à Android. La bibliothèque ThreeTenABP est juste un wrapper spécifique à Android autour de la bibliothèque ThreeTen-Backport . Voir ce tableau graphique comparant les 3 bibliothèques.
Basil Bourque
@BasilBourque vous avez tout à fait raison. Mais, vous pouvez en fait importer ThreeTen-Backport et l'utiliser dans une application Android, mais avec un impact extrêmement énorme sur les performances en raison de sa dépendance JAR. C'est pourquoi j'ai dit que la publication devrait être plus précise que les développeurs Android ne devraient jamais utiliser ThreeTen-Backport, et utiliser à la place ThreeTenABP pour le support de l'API 25 et inférieur. J'ai vu de nombreux développeurs sur diverses cartes qui se confondent sur celui qui devrait être utilisé pour Android, car ils semblent similaires par leur nom.
Slobodan Antonijević
Bon point, @ SlobodanAntonijević. J'ai essayé de le rendre un peu plus clair.
Ole VV
1
@ SlobodanAntonijević Ce tableau indiquant où obtenir java.time pour Java et Android pourrait aider à le clarifier.
Basil Bourque
3

Solution dans Kotlin:

val nowInEpoch = Instant.now().epochSecond

Assurez-vous que votre version minimale du SDK est 26.

DSavi
la source
0

Je suggère d'utiliser la réponse de Hits, mais en ajoutant un format de paramètres régionaux, voici comment les développeurs Android recommandent :

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
la source
0

Ce code est la version Kotlin. J'ai une autre idée d'ajouter un entier aléatoire au dernier chiffre pour donner le temps de l'époque de la variance.

Version Kotlin

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

val deltaEpoch = oldEpoch - currentEpoch

Je pense qu'il vaudra mieux utiliser ce kode puis dépendre de la version Android 26 ou plus

Subhanshuja
la source