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.