Wie formatiere ich Datum und Uhrzeit in Android?

321

Wie kann ich ein Jahr, einen Monat, einen Tag, eine Stunde und eine Minute entsprechend dem Datum und der Uhrzeit der Gerätekonfiguration richtig formatieren?

pupeno
quelle

Antworten:

291

Verwenden Sie die Standard-Java-DateFormat-Klasse.

Gehen Sie beispielsweise folgendermaßen vor, um das aktuelle Datum und die aktuelle Uhrzeit anzuzeigen:

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

Sie können ein Date-Objekt mit Ihren eigenen Werten initialisieren. Beachten Sie jedoch, dass die Konstruktoren veraltet sind und Sie wirklich ein Java-Kalenderobjekt verwenden sollten.

JamieH
quelle
42
Dies ist das android.text.format.DateFormat anstelle von java.text.DateFormat.
Jamesh
4
Es ist ziemlich typisch für Android IME, zwei Klassen zu haben, die beide behaupten, Ihnen ein Ergebnis zu liefern, das auf das Standardgebietsschema festgelegt ist, eine jedoch nicht. Also ja, vergessen Sie nicht, die android.text.format-Version von DateFormat zu verwenden (die nicht einmal die java.util one LOL ableitet).
mxcl
22
Bitte beachten Sie diese Zeile: DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());Das zurückgegebene DatumFormat ist vom Typ java.text.DateFormat(und NICHT android.text.format.DateFormat)
Arye Rosenstein
2
@Harsha - Um dieses Problem zu umgehen, verkette ich DateFormat, sodass ich nur auf die Android-Klasse verweisen muss und daher keine mehrdeutigen Klassen vorhanden sind. final String dateStr = DateFormat.getDateFormat (this) .format (d); Sie können die format () -Methode von Android verwenden und (IMHO) saubereren Code und ein Objekt weniger zum Instanziieren haben.
Jerry Brady
22
Dieser Formatierer enthält nur das Datum und nicht die Uhrzeit, wie in der ursprünglichen Frage angegeben. Verwenden Sie stattdessen DateUtils aus demselben Paket, siehe stackoverflow.com/questions/2983920/…
Asmo Soinio
202

Meiner Meinung nach android.text.format.DateFormat.getDateFormat(context)verwirrt mich das, weil diese Methode java.text.DateFormateher zurückgibt als android.text.format.DateFormat- - ".

Daher verwende ich den folgenden Fragmentcode, um das aktuelle Datum und die aktuelle Uhrzeit in meinem Format abzurufen.

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

Darüber hinaus können Sie andere Formate verwenden. Folgen Sie DateFormat .

Fuangwith S.
quelle
21
Nützlich, aber die Frage lautete "je nach Gerätekonfiguration". Für mich bedeutet dies, dass ein Format verwendet wird, das auf der Sprache / dem Land des Benutzers basiert oder direkt vom Benutzer ausgewählt wird, anstatt die Wahl des Formats fest zu codieren.
Chris Boyle
17
Vergessen hh:mm:ssSie auch nicht, dass Sie 01:00:00für 1 PM erhalten, müssen Sie verwenden kk:mm:ss, um13:00:00
dnet
2
@dnet kist Stunde am Tag (1-24), meinst du nicht H, das ist Stunde am Tag (0-23), z. HH: mm: ss? Siehe: developer.android.com/reference/java/text/SimpleDateFormat.html
Joony
1
@Joony nein, es gibt einen Unterschied zwischen java.text.SimpleDateFormat(was Sie verlinkt und Hfür Stunden im Bereich von 0-23 verwendet) und android.text.format.DateFormat(was die Antwort ist und kfür Stunden im Bereich von 0-23 verwendet)
dnet
@dnet Nach dem Testen haben Sie jedoch Recht kmit der Dokumentation für DateFormateindeutige Zustände . Die kanonische Dokumentation von Formatzeichenfolgen finden Sie unter SimpleDateFormat. Sehr verwirrend. Oder fehlt mir etwas?
Joony
144

Sie können verwenden DateFormat. Das Ergebnis hängt vom Standardgebietsschema des Telefons ab. Sie können jedoch auch das Gebietsschema angeben:

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

Dies ist Ergebnisse auf einem

DateFormat.getDateInstance().format(date)                                          

FR Gebietsschema: 3. November 2017

US / En Locale: 12. Januar 1952


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

FR Gebietsschema: 03/11/2017

US / En Gebietsschema: 12.13.52


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

FR Gebietsschema: 3. November 2017

US / En Locale: 12. Januar 1952


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

FR Gebietsschema: 3. November 2017

US / En Locale: 12. Januar 1952


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

FR Gebietsschema: vendredi 3 novembre 2017

US / En Locale: Dienstag, 12. April 1952


DateFormat.getDateTimeInstance().format(date)

FR Gebietsschema: 3. November 2017 16:04:58


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

FR Gebietsschema: 03/11/2017 16:04


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

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


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

FR Gebietsschema: 03/11/2017 16:04:58 GMT + 01: 00


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

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


DateFormat.getTimeInstance().format(date)

FR Gebietsschema: 16:04:58


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

FR Gebietsschema: 16:04


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

FR Gebietsschema: 16:04:58


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

FR Gebietsschema: 16:04:58 GMT + 01: 00


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

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


Dany Pop
quelle
4
Vielen Dank, dass Sie all diese Fälle an einem Ort zusammengefasst haben. Wenn Sie Fälle auch nur für die Zeit hinzufügen können, ist dies eine vollständige Referenz.
Zeeshan
41

Datumszeichenfolge von Datum zu Gebietsschema:

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

Optionen:

   DateFormat.getDateInstance() 

-> 31. Dezember 1969

   DateFormat.getDateTimeInstance() 

-> 31. Dezember 1969, 16:00:00 Uhr

   DateFormat.getTimeInstance() 

-> 16:00:00 Uhr

Ivo Stoyanov
quelle
3
Wie entferne ich das Jahr aus DateFormat.getDateInstance ()?
Hardik Joshi
21

Dies wird es tun:

Date date = new Date();
java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));
Tronman
quelle
Wird dies lokalisiert, wenn der Benutzer die Sprache in einem Android-Gerät ändert?
Kannan_SJD
14

Verwenden Sie SimpleDateFormat

So was:

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

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
Date date = format.parse(bundle.getString("starttime"));
neknek mouh
quelle
5
Ja, mit Standardgebietsschema , um Leistungsprobleme zu vermeiden:new SimpleDateFormat("my-format", Locale.getDefault());
iutinvg
14

Im Anschluss daran: http://developer.android.com/reference/android/text/format/Time.html

Ist es besser, die native Android-Zeitklasse zu verwenden:

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

Dann formatieren:

Log.d("DEBUG", "Time "+now.format("%d.%m.%Y %H.%M.%S"));
FireZenk
quelle
1
@FireZenk: Gemäß dem von Ihnen angegebenen [Link] ( developer.android.com/reference/android/text/format/Time.html ): Diese Klasse weist eine Reihe von Problemen auf, und es wird empfohlen, stattdessen GregorianCalendar zu verwenden .
ccpizza
Oh ... diese Issue-Info ist neuer als mein Kommentar, das ist also eine veraltete Antwort
FireZenk
10

Verwenden Sie diese beiden als Klassenvariablen:

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

Und benutze es so:

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

Dies ist meine Methode, Sie können das Format definieren und eingeben.

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
quelle
8

SimpleDateFormat

Ich verwende SimpleDateFormat ohne benutzerdefiniertes Muster , um das tatsächliche Datum und die Uhrzeit vom System im vorgewählten Format des Geräts abzurufen :

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

Rückgabe :

  • 13.01.15 11:45
  • 13.01.15 10:45 Uhr
  • ...
Tomas
quelle
7

Verwenden Sie die eingebaute Zeitklasse!

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
quelle
Dies ist die optimale Lösung, da das leichtgewichtige Time-Objekt aus dem Android Framework verwendet wird: developer.android.com/reference/android/text/format/Time.html
Dean Wild
13
Dies ist nicht die optimale Lösung: Das Datumsformat aus dem Gebietsschema des Benutzers wird nicht berücksichtigt.
Dan Hulme
5

Die anderen Antworten sind im Allgemeinen richtig. Ich möchte die moderne Antwort beitragen. Die Klassen Date, DateFormatund SimpleDateFormatin den meisten anderen Antworten verwendet werden, sind lange veraltet und haben für viele Programmierer über viele Jahre hinweg verursacht Probleme. Heute haben wir viel mehr in java.timeAKA JSR-310, der modernen Java-API für Datum und Uhrzeit. Kannst du das schon auf Android benutzen? Höchstwahrscheinlich! Die modernen Klassen wurden im ThreeTenABP-Projekt auf Android zurückportiert. Weitere Informationen finden Sie in dieser Frage: Verwendung von ThreeTenABP in Android Project .

Mit diesem Snippet können Sie loslegen:

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

Wenn ich die bevorzugte Sprache meines Computers auf US-Englisch oder UK-Englisch einstelle, wird Folgendes gedruckt:

Sep 28, 2017 10:45:00 PM

Wenn ich es stattdessen auf Dänisch setze, bekomme ich:

28-09-2017 22:45:00

Es folgt also der Konfiguration. Ich bin mir jedoch nicht sicher, in welchem ​​Detail die Datums- und Uhrzeiteinstellungen Ihres Geräts eingehalten werden. Dies kann von Telefon zu Telefon unterschiedlich sein.

Ole VV
quelle
5

Dieser Code funktioniert für mich!

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
quelle
5

Die Datumsformatklasse arbeitet mit dem Cheat-Code, um das Datum festzulegen. Mögen

  1. M -> 7, MM -> 07, MMM -> Jul, MMMM -> Juli
  2. EEE -> Di, EEEE -> Dienstag
  3. z -> EST, zzz -> EST, zzzz -> Eastern Standard Time

Sie können hier mehr Cheats überprüfen .

Sunil
quelle
4

Dieser Code würde das aktuelle Datum und die aktuelle Uhrzeit zurückgeben:

public String getCurrDate()
{
    String dt;
    Date cal = Calendar.getInstance().getTime();
    dt = cal.toLocaleString();
    return dt;
}
Chetan
quelle
1
toLocaleString () ist veraltet
nspo
4

Gebietsschema

Um Datum oder Uhrzeit im Gebietsschema von Millisekunden abzurufen, habe ich Folgendes verwendet:

Datum (und Uhrzeit

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

Datum

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

Zeit

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

Sie können einen anderen Datums- und Zeitstil verwenden. Weitere Infos zu Styles hier .

Wojtek
quelle
2

Versuchen:

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

Und wenn Sie auf übergebene Variablen zugreifen:

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

Ich benutze es so:

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
quelle
1

Vermeiden Sie juDate

Java.util.Date und .Calendar sowie SimpleDateFormat in Java (und Android) sind bekanntermaßen problematisch. Vermeide sie. Sie sind so schlecht, dass Sun / Oracle sie aufgegeben hat und sie durch das neue Paket java.time in Java 8 ersetzt hat (ab 2014 nicht in Android). Das Neue java.timewurde von der Joda-Time- Bibliothek inspiriert .

Joda-Zeit

Joda-Time funktioniert in Android.

Durchsuchen Sie StackOverflow nach "Joda", um viele Beispiele und Diskussionen zu finden.

Ein bisschen Quellcode mit Joda-Time 2.4.

Standardformat.

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

Lokalisiertes Format.

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

Zurück zum Jahr 2016, wenn ich das Format anpassen möchte (nicht entsprechend der Gerätekonfiguration, wie Sie fragen ...), verwende ich normalerweise die String-Ressourcendatei:

in strings.xml:

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

In Aktivität:

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

Dies ist auch bei der Veröffentlichung der neuen Datumsbindungsbibliothek hilfreich .

So kann ich so etwas in der Layoutdatei haben:

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

Und in der Java-Klasse:

    MovieDetailViewModel vm = new MovieDetailViewModel();
    vm.setReleaseDate(new Date());
alexpfx
quelle
0

Die Android-Zeitklasse bietet drei Formatierungsmethoden: http://developer.android.com/reference/android/text/format/Time.html

So habe ich es gemacht:

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

Ich hoffe das ist hilfreich :-)

Broo
quelle
0

Es ist zu spät, aber es kann jemandem helfen

DateFormat.format(format, timeInMillis);

Hier formatist das Format, das Sie benötigen

Beispiel: "HH: mm" gibt 15:30 zurück

Subrahmanyam Boyapati
quelle