Comment formater la date et l'heure sur Android?


321

Comment formater correctement en fonction de la date et de l'heure de configuration de l'appareil lorsque vous avez une année, un mois, un jour, une heure et une minute?

Réponses:


291

Utilisez la classe Java DateFormat standard.

Par exemple, pour afficher la date et l'heure actuelles, procédez comme suit:

Date date = new Date(location.getTime());
DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));

Vous pouvez initialiser un objet Date avec vos propres valeurs, mais vous devez savoir que les constructeurs sont obsolètes et que vous devez vraiment utiliser un objet Java Calendar.


42
Il s'agit du fichier android.text.format.DateFormat plutôt que de java.text.DateFormat.
jamesh

4
Il est assez typique d'Android IME d'avoir deux classes qui prétendent toutes deux vous donner un résultat défini sur les paramètres régionaux par défaut, mais pas l'autre. Alors oui, n'oubliez pas d'utiliser la version android.text.format de DateFormat (qui ne dérive même pas le Lava java.util).
mxcl

22
Veuillez noter cette ligne: DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());la dateFormat retournée est de type java.text.DateFormat(et NON android.text.format.DateFormat)
Arye Rosenstein

2
@Harsha - pour contourner ce problème, j'enchaîne mon utilisation de DateFormat, je n'ai donc qu'à référencer la classe Android et donc il n'y a pas de classes ambiguës. final String dateStr = DateFormat.getDateFormat (this) .format (d); Vous pouvez utiliser la méthode format () d'Android et avoir un code de nettoyage (IMHO) et un objet de moins à instancier.
Jerry Brady

23
Ce formateur ne comprend que la date, pas l'heure comme indiqué dans la question d'origine. Utilisez plutôt DateUtils du même package, voir stackoverflow.com/questions/2983920/…
Asmo Soinio

203

À mon avis, android.text.format.DateFormat.getDateFormat(context)cela me rend confus car cette méthode renvoie java.text.DateFormatplutôt que android.text.format.DateFormat- - ".

Donc, j'utilise le code de fragment comme ci-dessous pour obtenir la date / heure actuelle dans mon format.

android.text.format.DateFormat df = new android.text.format.DateFormat();
df.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());

or

android.text.format.DateFormat.format("yyyy-MM-dd hh:mm:ss a", new java.util.Date());

De plus, vous pouvez utiliser d'autres formats. Suivez DateFormat .


21
Utile, mais la question disait "selon la configuration de l'appareil". Pour moi, cela implique d'utiliser un format choisi en fonction de la langue / du pays de l'utilisateur, ou choisi directement par l'utilisateur, plutôt que de coder en dur le choix du format.
Chris Boyle

17
aussi, n'oubliez pas que hh:mm:sscela vous donnera 01:00:00pour 13 heures, vous devrez utiliser kk:mm:sspour obtenir13:00:00
dnet

2
@dnet kest une heure dans la journée (1-24), ne voulez-vous pas dire H, qui est une heure dans la journée (0-23), par exemple. HH: mm: ss? Voir: developer.android.com/reference/java/text/SimpleDateFormat.html
Joony

1
@Joony non, il y a une différence entre java.text.SimpleDateFormat(ce que vous avez lié et utilisé Hpendant des heures dans la plage 0-23) et android.text.format.DateFormat(ce que la réponse concerne et utilise kpendant des heures dans la plage 0-23)
dnet

@dnet Après le test, vous avez raison k, cependant, la documentation DateFormatindique clairement Pour la documentation canonique des chaînes de format, voir SimpleDateFormat. Très perturbant. Ou est-ce que je manque quelque chose?
Joony

145

Vous pouvez utiliser DateFormat. Le résultat dépend des paramètres régionaux par défaut du téléphone, mais vous pouvez également spécifier les paramètres régionaux:

https://developer.android.com/reference/java/text/DateFormat.html

Il s'agit de résultats sur un

DateFormat.getDateInstance().format(date)                                          

FR Locale: 3 nov. 2017

US / En Locale: 12 janv.1952


DateFormat.getDateInstance(DateFormat.SHORT).format(date)

FR Paramètres régionaux: 03/11/2017

US / En Locale: 12.13.52


DateFormat.getDateInstance(DateFormat.MEDIUM).format(date)

FR Locale: 3 nov. 2017

US / En Locale: 12 janv.1952


DateFormat.getDateInstance(DateFormat.LONG).format(date)

FR Paramètres régionaux: 3 novembre 2017

US / En Locale: 12 janvier 1952


DateFormat.getDateInstance(DateFormat.FULL).format(date)

FR Locale: vendredi 3 novembre 2017

US / En Locale: mardi 12 avril 1952


DateFormat.getDateTimeInstance().format(date)

FR Locale: 3 nov. 2017 16:04:58


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(date)

FR Paramètres régionaux: 03/11/2017 16:04


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM).format(date)

FR Paramètres régionaux: 03/11/2017 16:04:58


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG).format(date)

FR Paramètres régionaux: 03/11/2017 16:04:58 GMT + 01: 00


DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.FULL).format(date)

FR Locale: 03/11/2017 16:04:58 heure normale d'Europe centrale


DateFormat.getTimeInstance().format(date)

FR Paramètres régionaux: 16:04:58


DateFormat.getTimeInstance(DateFormat.SHORT).format(date)

FR Paramètres régionaux: 16:04


DateFormat.getTimeInstance(DateFormat.MEDIUM).format(date)

FR Paramètres régionaux: 16:04:58


DateFormat.getTimeInstance(DateFormat.LONG).format(date)

FR Paramètres régionaux: 16:04:58 GMT + 01: 00


DateFormat.getTimeInstance(DateFormat.FULL).format(date)

FR Locale: 16:04:58 heure normale d'Europe centrale



4
Merci d'avoir mis tous ces cas au même endroit. Si vous pouviez également ajouter des cas pour le temps, cela en ferait une référence complète.
zeeshan

41

Date à Locale chaîne de date:

Date date = new Date();
String stringDate = DateFormat.getDateTimeInstance().format(date);

Options:

   DateFormat.getDateInstance() 

-> 31 déc.1969

   DateFormat.getDateTimeInstance() 

-> 31 déc.1969 16:00:00

   DateFormat.getTimeInstance() 

-> 16 h 00


3
Comment supprimer l'année de DateFormat.getDateInstance ()?
Hardik Joshi

21

Cela le fera:

Date date = new Date();
java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));

Cela sera-t-il localisé lorsque l'utilisateur changera la langue sur un appareil Android?
Kannan_SJD

14

Utilisez SimpleDateFormat

Comme ça:

event.putExtra("starttime", "12/18/2012");

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
Date date = format.parse(bundle.getString("starttime"));

5
Oui, avec les paramètres régionaux par défaut pour éviter les problèmes de performances:new SimpleDateFormat("my-format", Locale.getDefault());
iutinvg

14

Suite à ceci: http://developer.android.com/reference/android/text/format/Time.html

Est préférable d'utiliser la classe Time native Android:

Time now = new Time();
now.setToNow();

Puis formatez:

Log.d("DEBUG", "Time "+now.format("%d.%m.%Y %H.%M.%S"));

1
@FireZenk: Selon le [lien] ( developer.android.com/reference/android/text/format/Time.html ) que vous avez fourni: Cette classe a un certain nombre de problèmes et il est recommandé d'utiliser GregorianCalendar à la place .
ccpizza

Oh ... cette question-info est plus récente que mon commentaire, c'est donc une réponse déconseillée
FireZenk

10

Utilisez ces deux comme variables de classe:

 public java.text.DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
 private Calendar mDate = null;

Et utilisez-le comme ceci:

 mDate = Calendar.getInstance();
 mDate.set(year,months,day);                   
 dateFormat.format(mDate.getTime());

9

Ceci est ma méthode, vous pouvez définir et formater le format d'entrée et de sortie.

public static String formattedDateFromString(String inputFormat, String outputFormat, String inputDate){
    if(inputFormat.equals("")){ // if inputFormat = "", set a default input format.
        inputFormat = "yyyy-MM-dd hh:mm:ss";
    }
    if(outputFormat.equals("")){
        outputFormat = "EEEE d 'de' MMMM 'del' yyyy"; // if inputFormat = "", set a default output format.
    }
    Date parsed = null;
    String outputDate = "";

    SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, java.util.Locale.getDefault());
    SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, java.util.Locale.getDefault());

    // You can set a different Locale, This example set a locale of Country Mexico.
    //SimpleDateFormat df_input = new SimpleDateFormat(inputFormat, new Locale("es", "MX"));
    //SimpleDateFormat df_output = new SimpleDateFormat(outputFormat, new Locale("es", "MX"));

    try {
        parsed = df_input.parse(inputDate);
        outputDate = df_output.format(parsed);
    } catch (Exception e) { 
        Log.e("formattedDateFromString", "Exception in formateDateFromstring(): " + e.getMessage());
    }
    return outputDate;

}

8

SimpleDateFormat

J'utilise SimpleDateFormat sans modèle personnalisé pour obtenir la date et l'heure réelles du système dans le format présélectionné de l'appareil :

public static String getFormattedDate() {
    //SimpleDateFormat called without pattern
    return new SimpleDateFormat().format(Calendar.getInstance().getTime());
}

renvoie :

  • 13.01.15 11:45
  • 13/01/15 10h45
  • ...


5

Les autres réponses sont généralement correctes. Je voudrais apporter la réponse moderne. Les classes Date, DateFormatet SimpleDateFormatutilisées dans la plupart des autres réponses, sont obsolètes depuis longtemps et ont causé des problèmes à de nombreux programmeurs pendant de nombreuses années. Aujourd'hui, nous avons tellement mieux dans java.time, AKA JSR-310, l'API Java date et heure moderne. Pouvez-vous encore l'utiliser sur Android? Certainement! Les classes modernes ont été rétroportées vers Android dans le projet ThreeTenABP. Voir cette question: Comment utiliser ThreeTenABP dans Android Project pour tous les détails.

Cet extrait devrait vous aider à démarrer:

    int year = 2017, month = 9, day = 28, hour = 22, minute = 45;
    LocalDateTime dateTime = LocalDateTime.of(year, month, day, hour, minute);
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    System.out.println(dateTime.format(formatter));

Lorsque je règle la langue préférée de mon ordinateur sur l'anglais américain ou l'anglais britannique, ceci s'imprime:

Sep 28, 2017 10:45:00 PM

Au lieu de cela, je le mets en danois,

28-09-2017 22:45:00

Il suit donc la configuration. Je ne sais pas exactement à quel détail il suit les paramètres de date et d'heure de votre appareil, et cela peut varier d'un téléphone à l'autre.


5

Ce code fonctionne pour moi!

Date d = new Date();
    CharSequence s = android.text.format.DateFormat.format("MM-dd-yy hh-mm-ss",d.getTime());
    Toast.makeText(this,s.toString(),Toast.LENGTH_SHORT).show();

5

La classe de format de date fonctionne avec un code de triche pour faire la date. Comme

  1. M -> 7, MM -> 07, MMM -> juil, MMMM -> juillet
  2. EEE -> mar, EEEE -> mardi
  3. z -> EST, zzz -> EST, zzzz -> Heure normale de l'Est

Vous pouvez vérifier plus de tricheurs ici .


4

Ce code retournerait la date et l'heure actuelles:

public String getCurrDate()
{
    String dt;
    Date cal = Calendar.getInstance().getTime();
    dt = cal.toLocaleString();
    return dt;
}

1
toLocaleString () est déconseillé
nspo

4

Lieu

Pour obtenir la date ou l'heure au format local à partir des millisecondes, j'ai utilisé ceci:

Date et l'heure

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.getDefault());
dateFormat.format(date);

Date

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault());
dateFormat.format(date);

Temps

Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT, Locale.getDefault());
dateFormat.format(date);

Vous pouvez utiliser d'autres styles de date et d'heure. Plus d'informations sur les styles ici .



2

Essayer:

event.putExtra("startTime", "10/05/2012");

Et lorsque vous accédez à des variables passées:

SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = formatter.parse(bundle.getString("startTime"));

2

Je l'utilise comme ceci:

public class DateUtils {
    static DateUtils instance;
    private final DateFormat dateFormat;
    private final DateFormat timeFormat;

    private DateUtils() {
        dateFormat = android.text.format.DateFormat.getDateFormat(MainApplication.context);
        timeFormat = android.text.format.DateFormat.getTimeFormat(MainApplication.context);
    }

    public static DateUtils getInstance() {
        if (instance == null) {
            instance = new DateUtils();
        }
        return instance;
    }

    public synchronized static String formatDateTime(long timestamp) {
        long milliseconds = timestamp * 1000;
        Date dateTime = new Date(milliseconds);
        String date = getInstance().dateFormat.format(dateTime);
        String time = getInstance().timeFormat.format(dateTime);
        return date + " " + time;
    }
}

1

Évitez juDate

Java.util.Date et .Calendar et SimpleDateFormat en Java (et Android) sont notoirement gênants. Évite-les. Ils sont si mauvais que Sun / Oracle les a abandonnés, les supplantant avec le nouveau package java.time en Java 8 (pas dans Android en 2014). Le nouveau java.times'inspire de la bibliothèque Joda-Time .

Joda-Time

Joda-Time fonctionne sur Android.

Recherchez StackOverflow pour "Joda" pour trouver de nombreux exemples et de nombreuses discussions.

Un petit morceau de code source utilisant Joda-Time 2.4.

Format standard.

String output = DateTime.now().toString(); 
// Current date-time in user's default time zone with a String representation formatted to the ISO 8601 standard.

Format localisé.

String output = DateTimeFormat.forStyle( "FF" ).print( DateTime.now() ); 
// Full (long) format localized for this user's language and culture.

1

Retour à 2016, lorsque je souhaite personnaliser le format (pas en fonction de la configuration de l'appareil, comme vous le demandez ...) j'utilise généralement le fichier de ressource de chaîne:

dans strings.xml:

<string name="myDateFormat"><xliff:g id="myDateFormat">%1$td/%1$tm/%1$tY</xliff:g></string>

En activité:

Log.d(TAG, "my custom date format: "+getString(R.string.myDateFormat, new Date()));

Cela est également utile avec la sortie de la nouvelle bibliothèque de liaison de dates .

Je peux donc avoir quelque chose comme ça dans le fichier de mise en page:

<TextView
    android:id="@+id/text_release_date"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:padding="2dp"
    android:text="@{@string/myDateFormat(vm.releaseDate)}"
    tools:text="0000"
    />

Et en classe java:

    MovieDetailViewModel vm = new MovieDetailViewModel();
    vm.setReleaseDate(new Date());

0

La classe de temps Android propose 3 méthodes de formatage http://developer.android.com/reference/android/text/format/Time.html

Voici comment je l'ai fait:

/**
* This method will format the data from the android Time class (eg. myTime.setToNow())   into the format
* Date: dd.mm.yy Time: hh.mm.ss
*/
private String formatTime(String time)
{
    String fullTime= "";
    String[] sa = new String[2];

    if(time.length()>1)
    {
        Time t = new Time(Time.getCurrentTimezone());
        t.parse(time);
        // or t.setToNow();
        String formattedTime = t.format("%d.%m.%Y %H.%M.%S");
        int x = 0;

        for(String s : formattedTime.split("\\s",2))
        {   
            System.out.println("Value = " + s);
            sa[x] = s;
            x++;
        }
        fullTime = "Date: " + sa[0] + " Time: " + sa[1];
    }
    else{
        fullTime = "No time data";
    }
    return fullTime;
}

J'espère que c'est utile :-)


0

C'est trop tard mais ça peut aider quelqu'un

DateFormat.format(format, timeInMillis);

voici le formatformat dont vous avez besoin

ex: "HH: mm" renvoie 15:30

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.