web-dev-qa-db-fra.com

Comment formater la date et l'heure sous Android?

Comment formater correctement, en fonction de la configuration de l'appareil, une date et une heure avec l'année, le mois, le jour, l'heure et les minutes?

270
pupeno

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. Cependant, vous devez savoir que les constructeurs sont obsolètes et utiliser un objet Calendrier Java.

265
JamieH

À mon avis, Android.text.format.DateFormat.getDateFormat(context) me rend confus, car cette méthode renvoie Java.text.DateFormat plutô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.

186
Fuangwith S.

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

Ceci est des résultats sur 

DateFormat.getDateInstance().format(date)                                          

FR Locale: 3 nov. 2017

US/En langue: 12 janvier 1952


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

FR Langue: 03/11/2017

Langue US/En: 12.13.52


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

FR Locale: 3 nov. 2017

US/En langue: 12 janvier 1952


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

FR Locale: 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 Locale: 03/11/2017 16:04


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

FR Locale: 03/11/2017 16:04:58


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

FR Langue: 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 Locale: 16:04:58


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

FR Locale: 16:04


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

FR Locale: 16:04:58


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

Langue locale: 16:04:58 GMT + 01: 00


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

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


79
Dany Poplawec

Date to Locale date string:

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

Options:

   DateFormat.getDateInstance() 

-> 31 décembre 1969

   DateFormat.getDateTimeInstance() 

-> 31 décembre 1969 à 16h00

   DateFormat.getTimeInstance() 

-> 16h00

35
Ivo Stoyanov

Cela va le faire: 

Date date = new Date();
Java.text.DateFormat dateFormat = Android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));
19
tronman

Après 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"));
14
FireZenk

Utilisez SimpleDateFormat

Comme ça:

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

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

SimpleDateFormat

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

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

résultats :

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

Ceci est ma méthode, vous pouvez définir et 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
Elenasys

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());
8
user1367623

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"));
7
Igor Krumpak

Ce code renverrait la date et l'heure actuelles:

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

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();
4
Opriday

Les autres réponses sont généralement correctes. Je voudrais apporter la réponse moderne. Les classes Date, DateFormat et SimpleDateFormat utilisées dans la plupart des autres réponses sont périmées depuis longtemps et ont causé des problèmes à de nombreux programmeurs pendant de nombreuses années. Aujourd'hui, nous avons tellement mieux avec Java.time, AKA JSR-310, l'API Java moderne pour la date et l'heure. Pouvez-vous utiliser cela sur Android encore? Certainement! Les classes modernes ont été rétroportées sur Android dans le projet ThreeTenABP. Voir cette question: Comment utiliser ThreeTenABP dans un projet Android 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 en anglais américain ou anglais britannique, les informations suivantes sont imprimées:

Sep 28, 2017 10:45:00 PM

Quand au lieu de cela je le configure en danois, je reçois:

28-09-2017 22:45:00

Donc, il suit la configuration. Je ne sais pas exactement à quel niveau de détail il suit les paramètres de date et d’heure de votre appareil, ce qui peut varier d’un téléphone à l’autre.

4
Ole V.V.

Je l'utilise comme ça:

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;
    }
}
2
ViliusK

Essayer:

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

Et quand vous accédez aux variables passées:

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

Retour à 2016, lorsque je veux personnaliser le format (pas en fonction de la configuration de l'appareil, comme vous le demandez ...), j'utilise généralement le fichier de ressources 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()));

Ceci est également utile lors de la publication de la nouvelle bibliothèque Date Binding Library .

Donc, je peux 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());
1
alexpfx

Chemin le plus court:

// 2019-03-29 16:11
String.format("%1$tY-%<tm-%<td %<tR", Calendar.getInstance())

%tR est l'abréviation de %tH:%tM, < signifie réutiliser le dernier paramètre (1$).

C'est équivalent à String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM", Calendar.getInstance())

https://developer.Android.com/reference/Java/util/Formatter.html

1
Khoa Chu Anh

Évitez j.u.Date

Java.util.Date et .Calendar et SimpleDateFormat en Java (et Android) sont notoirement gênants. Évite-les. Ils sont tellement mauvais que Sun/Oracle les ont abandonnés, les supplantant avec le nouveau package Java.time dans Java 8 (pas dans Android depuis 2014). Le nouveau Java.time a été inspiré par la bibliothèque Joda-Time .

Joda-Time

Joda-Time fonctionne sous Android.

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

Un fragment 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
Basil Bourque

La classe Android Time fournit 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
Broo

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

DateFormat.format(format, timeInMillis);

ici format est le format dont vous avez besoin

ex: "HH: mm" retourne à 15h30

0

Lieu

Pour obtenir la date ou l'heure au format local de 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);

Rendez-vous amoureux

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 de temps. Plus d'infos sur les styles ici .

0
Wojtek