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?

pupeno
la source

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.

JamieH
la source
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 .

Fuangwith S.
la source
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


Dany Pop
la source
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

Ivo Stoyanov
la source
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));
tronman
la source
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"));
neknek mouh
la source
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"));
FireZenk
la source
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());
Peter Mortensen
la source
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;

}
Jorgesys
la source
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
  • ...
Tomas
la source
7

Utilisez la construction dans la classe Time!

Time time = new Time();
time.set(0, 0, 17, 4, 5, 1999);
Log.i("DateTime", time.format("%d.%m.%Y %H:%M:%S"));
Igor Krumpak
la source
Il s'agit de la solution optimale car elle utilise l'objet Time léger du framework Android: developer.android.com/reference/android/text/format/Time.html
Dean Wild
13
Ce n'est pas la solution optimale: elle ne respecte pas le format de date des paramètres régionaux de l'utilisateur.
Dan Hulme
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.

Ole VV
la source
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();
Shahzad Afridi
la source
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 .

Sunil
la source
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;
}
chétan
la source
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 .

Wojtek
la source
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"));
Abhishek Singh Rathaur
la source
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;
    }
}
ViliusK
la source
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.
Basil Bourque
la source
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());
alexpfx
la source
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 :-)

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

subrahmanyam boyapati
la source