Come formattare la data e l'ora in Android?


321

Come formattare correttamente in base alla data e all'ora di configurazione del dispositivo quando si dispone di un anno, mese, giorno, ora e minuti?

Risposte:


291

Utilizzare la classe Java DateFormat standard.

Ad esempio, per visualizzare la data e l'ora correnti, procedi come segue:

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

È possibile inizializzare un oggetto Date con i propri valori, tuttavia è necessario tenere presente che i costruttori sono stati deprecati e si dovrebbe realmente utilizzare un oggetto Calendario Java.


42
Questo è android.text.format.DateFormat anziché java.text.DateFormat.
— James,

4
È abbastanza tipico di Android IME avere due classi che affermano entrambe di darti un risultato che è impostato sul Locale predefinito ma uno no. Quindi sì, non dimenticare di usare la versione android.text.format di DateFormat (che non deriva nemmeno il java.util un LOL).
— mxcl,

22
Nota questa riga: DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());la data di ritorno Formatta è di tipo java.text.DateFormat(e NON android.text.format.DateFormat)
— Arye Rosenstein,

2
@Harsha - per ovviare a questo problema, concedo il mio uso di DateFormat, quindi devo solo fare riferimento alla classe Android e quindi non ci sono classi ambigue. stringa finale dateStr = DateFormat.getDateFormat (this) .format (d); Puoi usare il metodo format () di Android e avere un codice più pulito (IMHO) e un oggetto in meno per istanziare.
— Jerry Brady,

23
Questo formattatore include solo la data, non l'ora indicata dalla domanda originale. Utilizzare DateUtils dello stesso pacchetto, invece, vedono stackoverflow.com/questions/2983920/...
— Asmo Soinio

203

Secondo me, android.text.format.DateFormat.getDateFormat(context)mi confonde perché questo metodo restituisce java.text.DateFormatpiuttosto che android.text.format.DateFormat- - ".

Quindi, uso il codice del frammento come di seguito per ottenere la data / ora corrente nel mio formato.

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

Inoltre, puoi utilizzare altri formati. Segui DateFormat .


21
Utile, ma la domanda diceva "in base alla configurazione del dispositivo". Per me ciò implica l'uso di un formato scelto in base alla lingua / al paese dell'utente, o scelto direttamente dall'utente, piuttosto che codificare la scelta del formato.
— Chris Boyle,

17
inoltre, non dimenticare che hh:mm:ssti darà 01:00:00per le 13:00, dovrai usare kk:mm:ssper ottenere13:00:00
— dnet il

2
@dnet kè ora del giorno (1-24), non intendi H, che è l'ora del giorno (0-23), ad es. HH: mm: ss? Vedi: developer.android.com/reference/java/text/SimpleDateFormat.html
— Joony

1
@Joony no, c'è differenza tra java.text.SimpleDateFormat(cosa hai collegato e usa Hper ore nell'intervallo 0-23) e android.text.format.DateFormat(di cosa tratta la risposta e usa kper ore nell'intervallo 0-23)
— dnet

@dnet Dopo aver eseguito il test, si ha ragione sulla kdocumentazione per DateFormatstati chiaramente Per la documentazione canonica delle stringhe di formato, vedere SimpleDateFormat. Molto confuso. Oppure mi sfugge qualcosa?
— Joony,

145

È possibile utilizzare DateFormat. Il risultato dipende dalle impostazioni internazionali predefinite del telefono, ma è possibile specificare anche le impostazioni internazionali:

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

Questo è i risultati su a

DateFormat.getDateInstance().format(date)                                          

FR Locale: 3 nov. 2017

US / En Locale: 12 gennaio 1952


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

Locale FR: 03/11/2017

Impostazioni locali US / En: 12.13.52


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

FR Locale: 3 nov. 2017

US / En Locale: 12 gennaio 1952


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

FR Locale: 3 novembre 2017

US / En Locale: 12 gennaio 1952


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

FR Locale: vendredi 3 novembre 2017

US / En Locale: martedì 12 aprile 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 Locale: 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)

Locale FR: 16:04:58


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

Locale FR: 16:04


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

Locale FR: 16:04:58


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

FR Impostazioni locali: 16:04:58 GMT + 01: 00


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

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



4
Grazie per aver messo tutti questi casi in un unico posto. Se anche tu potessi aggiungere casi solo per tempo, questo diventerà un riferimento completo.
— Zeeshan,

41

Stringa di data da data a locale:

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

Opzioni:

   DateFormat.getDateInstance() 

-> 31 dic 1969

   DateFormat.getDateTimeInstance() 

-> 31 dic 1969, 16:00

   DateFormat.getTimeInstance() 

-> 16:00:00


3
Come rimuovere year da DateFormat.getDateInstance ()?
— Hardik Joshi,

21

Questo lo farà:

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

Questo verrà localizzato quando l'utente cambia la lingua in un dispositivo Android?
— Kannan_SJD,

14

Usa SimpleDateFormat

Come questo:

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

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

5
Sì, con impostazioni internazionali predefinite per evitare problemi di prestazioni:new SimpleDateFormat("my-format", Locale.getDefault());
— iutinvg

14

Di seguito: http://developer.android.com/reference/android/text/format/Time.html

È meglio utilizzare la classe temporale nativa di Android:

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

Quindi formatta:

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

1
@FireZenk: secondo il [link] ( developer.android.com/reference/android/text/format/Time.html ) che hai fornito: questa classe ha una serie di problemi e si consiglia di utilizzare GregorianCalendar .
— ccpizza,

Oh ... questa informazione sul numero è più recente del mio commento, quindi questa è una risposta deprecata
— FireZenk

10

Usa questi due come variabili di classe:

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

E usalo in questo modo:

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

9

Questo è il mio metodo, è possibile definire e inserire e produrre il formato.

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

Uso SimpleDateFormat senza modello personalizzato per ottenere la data e l'ora effettive dal sistema nel formato preselezionato del dispositivo :

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

ritorna :

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


5

Le altre risposte sono generalmente corrette. Vorrei contribuire con la risposta moderna. Le classi Date, DateFormate SimpleDateFormatutilizzate nella maggior parte delle altre risposte, sono obsolete da tempo e hanno causato problemi a molti programmatori nel corso di molti anni. Oggi abbiamo molto meglio java.time, AKA JSR-310, la moderna API Java data e ora. Puoi usarlo ancora su Android? Più probabilmente! Le classi moderne sono state trasferite su Android nel progetto ThreeTenABP. Vedi questa domanda: Come usare ThreeTenABP in Progetto Android per tutti i dettagli.

Questo frammento dovrebbe iniziare:

    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));

Quando imposto la lingua preferita del mio computer su inglese americano o inglese britannico, questo stampa:

Sep 28, 2017 10:45:00 PM

Quando invece l'ho impostato su Danese, ottengo:

28-09-2017 22:45:00

Quindi segue la configurazione. Non sono sicuro di quale dettaglio segua le impostazioni di data e ora del tuo dispositivo, e questo può variare da telefono a telefono.


5

Questo codice funziona per me!

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 del formato della data funziona con il cheat code per creare la data. Piace

  1. M -> 7, MM -> 07, MMM -> lug, MMMM -> luglio
  2. EEE -> mar, EEEE -> martedì
  3. z -> EST, zzz -> EST, zzzz -> Ora solare orientale

Puoi controllare altri trucchi qui .


4

Questo codice restituisce la data e l'ora correnti:

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

1
toLocaleString () è obsoleto
— nspo

4

località

Per ottenere la data o l'ora in formato locale da millisecondi ho usato questo:

Data e ora

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

Data

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

Tempo

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

Puoi utilizzare altri stili di data e ora. Maggiori informazioni sugli stili qui .



2

Provare:

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

E quando accedi alle variabili passate:

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

2

Lo uso così:

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

Evita il juDate

Java.util.Date e .Calendar e SimpleDateFormat in Java (e Android) sono notoriamente problematici. Evitali. Sono così cattivi che Sun / Oracle hanno rinunciato a loro, soppiantandoli con il nuovo pacchetto java.time in Java 8 (non in Android dal 2014). Il nuovo è java.timestato ispirato dal Joda-Time biblioteca di .

Joda-Time

Joda-Time funziona su Android.

Cerca StackOverflow per "Joda" per trovare molti esempi e molte discussioni.

Un bocconcino di codice sorgente usando Joda-Time 2.4.

Formato 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.

Formato localizzato.

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

1

Torna al 2016, quando voglio personalizzare il formato (non in base alla configurazione del dispositivo, come mi chiedi ...) Di solito uso il file di risorse della stringa:

in strings.xml:

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

In attività:

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

Ciò è utile anche con il rilascio della nuova libreria di rilegatura della data .

Quindi posso avere qualcosa del genere nel file di layout:

<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"
    />

E in classe Java:

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

0

La classe Time di Android offre 3 metodi di formattazione http://developer.android.com/reference/android/text/format/Time.html

Ecco come l'ho fatto:

/**
* 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;
}

Spero sia utile :-)


0

È troppo tardi ma può aiutare qualcuno

DateFormat.format(format, timeInMillis);

ecco di formatche formato hai bisogno

es: "HH: mm" restituisce 15:30

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.