Jak sformatować datę i godzinę w Androidzie?


321

Jak poprawnie sformatować zgodnie z datą i godziną konfiguracji urządzenia, mając rok, miesiąc, dzień, godzinę i minutę?

Odpowiedzi:


291

Użyj standardowej klasy Java DateFormat.

Na przykład, aby wyświetlić bieżącą datę i godzinę, wykonaj następujące czynności:

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

Możesz zainicjować obiekt Date własnymi wartościami, należy jednak pamiętać, że konstruktory zostały wycofane i naprawdę powinieneś używać obiektu Java Calendar.


42
To jest android.text.format.DateFormat zamiast java.text.DateFormat.
jamesh

4
Typowe dla IME Androida jest posiadanie dwóch klas, które twierdzą, że dają wynik ustawiony na domyślne ustawienia regionalne, ale jedna nie. Więc tak, nie zapomnij użyć wersji DateFormat android.text.format (która nawet nie wywodzi java.util jednego LOL).
mxcl

22
Zwróć uwagę na ten wiersz: DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());Zwrócony format daty jest typu java.text.DateFormat(i NIE android.text.format.DateFormat)
Arye Rosenstein

2
@Harsha - aby obejść ten problem, łączę użycie DateFormat, więc muszę tylko odwoływać się do klasy Androida, a zatem nie ma żadnych dwuznacznych klas. końcowy ciąg dateStr = DateFormat.getDateFormat (this) .format (d); Możesz użyć metody format () Androida i mieć czystszy kod (IMHO) oraz jeden obiekt mniej do utworzenia.
Jerry Brady

23
Ten formatyzator zawiera tylko datę, a nie godzinę, jak podano w pierwotnym pytaniu. Zamiast tego użyj DateUtils z tego samego pakietu, patrz stackoverflow.com/questions/2983920/...
Asmo Soinio

203

Moim zdaniem android.text.format.DateFormat.getDateFormat(context)wprawia mnie w zakłopotanie, ponieważ metoda ta zwraca java.text.DateFormatraczej niż android.text.format.DateFormat- - ".

Tak więc używam kodu fragmentu, jak poniżej, aby uzyskać bieżącą datę / godzinę w moim formacie.

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

Ponadto możesz używać innych formatów. Śledź DateFormat .


21
Przydatne, ale pytanie brzmiało „zgodnie z konfiguracją urządzenia”. Dla mnie oznacza to użycie formatu wybranego na podstawie języka / kraju użytkownika lub wybranego bezpośrednio przez użytkownika, a nie na stałe wyboru formatu.
Chris Boyle,

17
nie zapomnij też, że hh:mm:ssda ci to 01:00:0013:00, musisz użyć, kk:mm:ssaby uzyskać13:00:00
dnet

2
@dnet kto godzina w dzień (1-24), nie masz na myśli H, która jest godzina w dzień (0-23), np. GG: mm: ss? Zobacz: developer.android.com/reference/java/text/SimpleDateFormat.html
Joony

1
@Joony nie, istnieje różnica między java.text.SimpleDateFormat(tym, co łączysz i używa Hdo godzin w zakresie 0-23) i android.text.format.DateFormat(o co chodzi w odpowiedzi i używa kdo godzin w zakresie 0-23)
dnet

@dnet Po przetestowaniu masz rację k, ale dokumentacja dla jasnych DateFormatstanów Kanoniczna dokumentacja ciągów formatu znajduje się w SimpleDateFormat. Bardzo mylące. A może coś mi brakuje?
Joony,

145

Możesz użyć DateFormat. Wynik zależy od domyślnych ustawień regionalnych telefonu, ale możesz też określić ustawienia regionalne:

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

To wyniki na

DateFormat.getDateInstance().format(date)                                          

FR Ustawienia regionalne: 3 listopada 2017 r

US / En Locale: 12 stycznia 1952


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

FR Ustawienia regionalne: 03.11.2017

Ustawienia regionalne US / En: 12.13.52


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

FR Ustawienia regionalne: 3 listopada 2017 r

US / En Locale: 12 stycznia 1952


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

FR Ustawienia regionalne: 3 listopada 2017 r

US / En Locale: 12 stycznia 1952


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

FR Lokalizacja: sprzedawca, 3 listopada 2017

US / En Locale: wtorek, 12 kwietnia 1952 r


DateFormat.getDateTimeInstance().format(date)

FR Ustawienia regionalne: 3 listopada 2017 16:04:58


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

FR Ustawienia regionalne: 03.11.2017 16:04


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

FR Ustawienia regionalne: 03.11.2017 16:04:58


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

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


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

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


DateFormat.getTimeInstance().format(date)

FR Ustawienia regionalne: 16:04:58


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

FR Ustawienia regionalne: 16:04


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

FR Ustawienia regionalne: 16:04:58


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

FR Ustawienia regionalne: 16:04:58 GMT + 01: 00


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

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



4
Dziękujemy za umieszczenie wszystkich tych skrzynek w jednym miejscu. Jeśli możesz dodać przypadki tylko dla czasu, będzie to kompletne odniesienie.
zeeshan

41

Ciąg daty Data do ustawień regionalnych:

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

Opcje:

   DateFormat.getDateInstance() 

-> 31 grudnia 1969 r

   DateFormat.getDateTimeInstance() 

-> 31 grudnia 1969 16:00

   DateFormat.getTimeInstance() 

-> 16:00


3
Jak usunąć rok z DateFormat.getDateInstance ()?
Hardik Joshi,

21

To zrobi to:

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

Czy zostanie to zlokalizowane, gdy użytkownik zmieni język na urządzeniu z Androidem?
Kannan_SJD

14

Użyj SimpleDateFormat

Lubię to:

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

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

5
Tak, z domyślnymi ustawieniami regionalnymi, aby uniknąć problemów z wydajnością:new SimpleDateFormat("my-format", Locale.getDefault());
iutinvg

14

Po tym: http://developer.android.com/reference/android/text/format/Time.html

Lepiej jest korzystać z natywnej klasy czasowej Androida:

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

Następnie sformatuj:

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

1
@FireZenk: Zgodnie z [link] ( developer.android.com/reference/android/text/format/Time.html ) podałeś: Ta klasa ma wiele problemów i zalecane jest użycie GregorianCalendar .
ccpizza

Och ... ta informacja o problemie jest nowsza niż mój komentarz, więc jest to przestarzała odpowiedź
FireZenk

10

Użyj tych dwóch jako zmiennych klasowych:

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

I użyj tego w ten sposób:

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

9

To jest moja metoda, możesz zdefiniować i format wejściowy i wyjściowy.

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

Korzystam z SimpleDateFormat bez niestandardowego wzorca, aby uzyskać aktualną datę i godzinę z systemu we wstępnie wybranym formacie urządzenia :

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

zwraca :

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


5

Pozostałe odpowiedzi są ogólnie poprawne. Chciałbym przekazać nowoczesną odpowiedź. Klasy Date, DateFormati SimpleDateFormatstosowane w większości innych odpowiedzi, dawno nieaktualne i spowodowały kłopoty dla wielu programistów przez wiele lat. Dzisiaj mamy o wiele lepsze java.time, AKA JSR-310, nowoczesny interfejs API daty i godziny Java. Czy możesz już tego używać na Androidzie? Z całą pewnością! Nowoczesne klasy zostały przeniesione na Androida w projekcie ThreeTenABP. Zobacz to pytanie: Jak korzystać z ThreeTenABP w Android Project dla wszystkich szczegółów.

Ten fragment powinien zacząć:

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

Gdy ustawiam preferowany język mojego komputera na angielski amerykański lub angielski brytyjski, drukuje się:

Sep 28, 2017 10:45:00 PM

Gdy zamiast tego ustawię go na duński, otrzymuję:

28-09-2017 22:45:00

Czyli postępuje zgodnie z konfiguracją. Nie jestem jednak pewien, z jakim szczegółem zależy on od ustawień daty i godziny urządzenia, i może to różnić się w zależności od telefonu.


5

Ten kod działa dla mnie!

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

Klasa formatu daty współpracuje z kodem oszukiwającym, aby ustalić datę. Lubić

  1. M -> 7, MM -> 07, MMM -> lipiec, MMMM -> lipiec
  2. EEE -> Wt, EEEE -> Wtorek
  3. z -> EST, zzz -> EST, zzzz -> Eastern Standard Time

Można sprawdzić kolejne kody tutaj .


4

Ten kod zwróci bieżącą datę i godzinę:

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

1
Funkcja toLocaleString () jest przestarzała
nspo

4

Widownia

Aby uzyskać datę lub godzinę w formacie lokalnym z milisekund, użyłem tego:

Data i godzina

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

Czas

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

Możesz użyć innego stylu daty i czasu. Więcej informacji o stylach tutaj .



2

Próbować:

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

A kiedy uzyskujesz dostęp do przekazywanych zmiennych:

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

2

Używam tego w ten sposób:

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

Unikaj juDate

Java.util.Date oraz .Calendar i SimpleDateFormat w Javie (i Androidzie) są niezwykle kłopotliwe. Unikaj ich. Są tak złe, że Sun / Oracle zrezygnowało z nich, zastępując je nowym pakietem java.time w Javie 8 (nie w Androidzie od 2014 roku). Nowy java.timezostał zainspirowany Joda-Time biblioteką .

Joda-Time

Joda-Time działa w systemie Android.

Wyszukaj StackOverflow dla „Joda”, aby znaleźć wiele przykładów i wiele dyskusji.

Smakołyk kodu źródłowego przy użyciu Joda-Time 2.4.

Standardowy format.

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

Zlokalizowany format.

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

1

Powrót do 2016 roku, kiedy chcę dostosować format (nie zgodnie z konfiguracją urządzenia, jak pytasz ...) Zwykle używam pliku zasobów ciągów:

w strings.xml:

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

W działaniu:

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

Jest to również przydatne w wydaniu nowej Biblioteki wiążącej datę .

Więc mogę mieć coś takiego w pliku układu:

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

A w klasie java:

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

0

Klasa czasu Android zapewnia 3 metody formatowania http://developer.android.com/reference/android/text/format/Time.html

Oto jak to zrobiłem:

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

Mam nadzieję, że to pomocne :-)


0

Jest za późno, ale może komuś pomóc

DateFormat.format(format, timeInMillis);

oto formatjaki format potrzebujesz

np .: „GG: mm” zwraca 15:30

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.