Bagaimana memformat tanggal dan waktu di Android?

321

Bagaimana memformat dengan benar sesuai dengan tanggal dan waktu konfigurasi perangkat ketika memiliki satu tahun, bulan, hari, jam dan menit?

pupeno
sumber

Jawaban:

291

Gunakan kelas Java DateFormat standar.

Misalnya untuk menampilkan tanggal dan waktu saat ini lakukan hal berikut:

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

Anda dapat menginisialisasi objek Tanggal dengan nilai Anda sendiri, namun Anda harus menyadari bahwa konstruktor telah usang dan Anda benar-benar harus menggunakan objek Kalender Java.

JamieH
sumber
42
Ini adalah android.text.format.DateFormat daripada java.text.DateFormat.
jamesh
4
Ini cukup khas dari Android IME untuk memiliki dua kelas yang keduanya mengklaim memberi Anda hasil yang diatur ke Lokal default tetapi satu tidak. Jadi ya, jangan lupa untuk menggunakan versi android.text.format dari DateFormat (yang bahkan tidak mendapatkan java.util satu LOL).
mxcl
22
Harap perhatikan baris ini: DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());DateFormat yang dikembalikan bertipe java.text.DateFormat(dan BUKAN android.text.format.DateFormat)
Arye Rosenstein
2
@Harsha - untuk mengatasi masalah itu, saya rantai penggunaan DateFormat saya jadi saya hanya perlu referensi kelas Android dan karena itu tidak ada kelas ambigu. final String dateStr = DateFormat.getDateFormat (ini) .format (d); Anda dapat menggunakan metode format () Android dan memiliki kode pembersih (IMHO) dan satu objek lebih sedikit untuk instantiate.
Jerry Brady
23
Formatter ini hanya mencakup tanggal, bukan waktu seperti yang dinyatakan pertanyaan awal. Gunakan DateUtils dari paket yang sama sebagai gantinya, lihat stackoverflow.com/questions/2983920/…
Asmo Soinio
203

Menurut pendapat saya, android.text.format.DateFormat.getDateFormat(context)membuat saya bingung karena metode ini mengembalikan java.text.DateFormatdaripada android.text.format.DateFormat- - ".

Jadi, saya menggunakan kode fragmen seperti di bawah ini untuk mendapatkan tanggal / waktu saat ini dalam format saya.

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

Selain itu, Anda dapat menggunakan format lain. Ikuti DateFormat .

Fuangwith S.
sumber
21
Berguna, tetapi pertanyaannya "sesuai dengan konfigurasi perangkat". Bagi saya itu menyiratkan menggunakan format yang dipilih berdasarkan bahasa / negara pengguna, atau dipilih langsung oleh pengguna, daripada hardcoding pilihan format.
Chris Boyle
17
juga, jangan lupa itu hh:mm:ssakan memberi Anda 01:00:00untuk 1 PM, Anda harus menggunakan kk:mm:ssuntuk mendapatkan13:00:00
dnet
2
@net kadalah jam dalam sehari (1-24), maksud Anda H, yaitu jam dalam hari (0-23), mis. HH: mm: dd? Lihat: developer.android.com/reference/java/text/SimpleDateFormat.html
Joony
1
@ Joony tidak, ada perbedaan antara java.text.SimpleDateFormat(apa yang Anda tautkan dan gunakan Hselama berjam-jam dalam rentang 0-23) dan android.text.format.DateFormat(apa jawabannya dan gunakan kselama berjam-jam dalam rentang 0-23)
dnet
@net Setelah pengujian, Anda benar tentang k, namun, dokumentasi untuk DateFormatstatus yang jelas. Untuk dokumentasi kanonik dari string format, lihat SimpleDateFormat. Sangat membingungkan. Atau apakah saya melewatkan sesuatu?
Joony
145

Anda bisa menggunakannya DateFormat. Hasil tergantung pada Lokal default ponsel, tetapi Anda juga dapat menentukan Lokal:

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

Ini adalah hasil pada a

DateFormat.getDateInstance().format(date)                                          

FR Lokal: 3 nov. 2017

Lokal AS / En: 12 Januari 1952


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

FR Lokal: 03/11/2017

Lokal AS / En: 12.13.52


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

FR Lokal: 3 nov. 2017

Lokal AS / En: 12 Januari 1952


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

FR Lokal: 3 November 2017

Lokal AS / En: 12 Januari 1952


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

FR Lokal: vendredi 3 novembre 2017

Lokal AS / En: Selasa, 12 April 1952


DateFormat.getDateTimeInstance().format(date)

FR Lokal: 3 nov. 2017 16:04:58


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

FR Lokal: 03/11/2017 16:04


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

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


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

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


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

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


DateFormat.getTimeInstance().format(date)

FR Lokal: 16:04:58


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

FR Lokal: 16:04


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

FR Lokal: 16:04:58


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

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


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

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


Dany Pop
sumber
4
Terima kasih telah meletakkan semua kasing ini di satu tempat. Jika Anda dapat menambahkan kasus hanya untuk waktu saja, ini akan membuatnya menjadi referensi lengkap.
zeeshan
41

Date to Locale date string:

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

Pilihan:

   DateFormat.getDateInstance() 

-> 31 Des 1969

   DateFormat.getDateTimeInstance() 

-> 31 Des 1969 4:00:00 PM

   DateFormat.getTimeInstance() 

-> 4:00:00 PM

Ivo Stoyanov
sumber
3
Bagaimana cara menghapus tahun dari DateFormat.getDateInstance ()?
Hardik Joshi
21

Ini akan melakukannya:

Date date = new Date();
java.text.DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
mTimeText.setText("Time: " + dateFormat.format(date));
tukang trem
sumber
Apakah ini akan dilokalkan ketika pengguna mengubah bahasa di perangkat android?
Kannan_SJD
14

Gunakan SimpleDateFormat

Seperti ini:

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

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
Date date = format.parse(bundle.getString("starttime"));
neknek mouh
sumber
5
Ya, dengan lokal default untuk menghindari masalah kinerja:new SimpleDateFormat("my-format", Locale.getDefault());
iutinvg
14

Berikut ini: http://developer.android.com/reference/android/text/format/Time.html

Lebih baik menggunakan kelas Waktu asli Android:

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

Kemudian format:

Log.d("DEBUG", "Time "+now.format("%d.%m.%Y %H.%M.%S"));
FireZenk
sumber
1
@FireZenk: Menurut [tautan] ( developer.android.com/reference/android/text/format/Time.html ) yang Anda berikan: Kelas ini memiliki sejumlah masalah dan disarankan agar GregorianCalendar digunakan sebagai gantinya .
ccpizza
Oh ... masalah-info ini lebih baru daripada komentar saya, jadi itu jawaban yang sudah usang
FireZenk
10

Gunakan keduanya sebagai variabel kelas:

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

Dan gunakan seperti ini:

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

Ini adalah metode saya, Anda dapat menentukan dan memasukkan serta menampilkan format.

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

SimpleDateFormat

Saya menggunakan SimpleDateFormat tanpa pola khusus untuk mendapatkan tanggal dan waktu aktual dari sistem dalam format yang dipilih perangkat :

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

pengembalian :

  • 13.01.15 11:45
  • 13/1/15 10:45
  • ...
Tomas
sumber
7

Gunakan build di kelas Time!

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
sumber
Ini adalah solusi optimal karena menggunakan objek Waktu yang ringan dari Kerangka Android: developer.android.com/reference/android/text/format/Time.html
Dean Wild
13
Ini bukan solusi optimal: itu tidak menghormati format tanggal dari lokal pengguna.
Dan Hulme
5

Jawaban lain umumnya benar. Saya ingin berkontribusi jawaban modern. Kelas-kelas Date, DateFormatdan SimpleDateFormatdigunakan di sebagian besar jawaban lain, sudah lama ketinggalan dan telah menyebabkan masalah bagi banyak programmer selama bertahun-tahun. Hari ini kami memiliki jauh lebih baik di java.time, AKA JSR-310, API tanggal & waktu Jawa modern. Bisakah Anda menggunakan ini di Android? Hampir dipastikan! Kelas-kelas modern telah di-backport ke Android dalam proyek ThreeTenABP. Lihat pertanyaan ini: Cara menggunakan ThreeTenABP di Android Project untuk semua detail.

Cuplikan ini akan membantu Anda memulai:

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

Ketika saya mengatur bahasa pilihan komputer saya ke US English atau UK English, ini mencetak:

Sep 28, 2017 10:45:00 PM

Ketika sebaliknya saya mengaturnya ke Denmark, saya mendapatkan:

28-09-2017 22:45:00

Jadi tidak mengikuti konfigurasi. Saya tidak yakin persisnya detail apa yang mengikuti pengaturan tanggal dan waktu perangkat Anda, dan ini mungkin berbeda dari ponsel ke ponsel.

Ole VV
sumber
5

Kode ini berfungsi untuk saya!

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

Format tanggal kelas bekerja dengan kode cheat untuk membuat tanggal. Suka

  1. M -> 7, MM -> 07, MMM -> Jul, MMMM -> Juli
  2. EEE -> Sel, EEEE -> Selasa
  3. z -> EST, zzz -> EST, zzzz -> Waktu Standar Timur

Anda dapat memeriksa lebih banyak kode curang di sini .

Sunil
sumber
4

Kode ini akan mengembalikan tanggal dan waktu saat ini:

public String getCurrDate()
{
    String dt;
    Date cal = Calendar.getInstance().getTime();
    dt = cal.toLocaleString();
    return dt;
}
chetan
sumber
1
toLocaleString () tidak digunakan lagi
nspo
4

Lokal

Untuk mendapatkan tanggal atau waktu dalam format lokal dari milidetik, saya menggunakan ini:

Tanggal dan waktu

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

Tanggal

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

Waktu

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

Anda dapat menggunakan gaya tanggal dan gaya waktu lainnya. Info lebih lanjut tentang gaya di sini .

Wojtek
sumber
2

Mencoba:

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

Dan ketika Anda mengakses variabel yang diteruskan:

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

Saya menggunakannya seperti ini:

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

Hindari menjodohkan

Java.util.Date dan .Calendar dan SimpleDateFormat di Java (dan Android) terkenal merepotkan. Hindari mereka. Mereka begitu buruk sehingga Sun / Oracle menyerah pada mereka, menggantikan mereka dengan paket java.time baru di Java 8 (bukan di Android pada 2014). Yang baru java.timeterinspirasi oleh perpustakaan Joda-Time .

Joda-Time

Joda-Time bekerja di Android.

Cari StackOverflow untuk "Joda" untuk menemukan banyak contoh dan banyak diskusi.

Sebuah tidbit kode sumber menggunakan Joda-Time 2.4.

Format standar.

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

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

Kembali ke 2016, Ketika saya ingin menyesuaikan format (tidak sesuai dengan konfigurasi perangkat, seperti yang Anda tanyakan ...) Saya biasanya menggunakan file sumber string:

di strings.xml:

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

Dalam Aktivitas:

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

Ini juga berguna dengan rilis Perpustakaan Pengikat Tanggal baru .

Jadi saya dapat memiliki sesuatu seperti ini di file 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"
    />

Dan di kelas java:

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

Kelas Waktu android menyediakan 3 metode pemformatan http://developer.android.com/reference/android/text/format/Time.html

Beginilah cara saya melakukannya:

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

Saya harap itu membantu :-)

Broo
sumber
0

Sudah terlambat tetapi mungkin membantu seseorang

DateFormat.format(format, timeInMillis);

di sini formatadalah format apa yang Anda butuhkan

mis: "HH: mm" mengembalikan 15:30

subrahmanyam boyapati
sumber