Làm cách nào để định dạng ngày và giờ trong Android?


321

Làm cách nào để định dạng chính xác theo ngày và giờ cấu hình thiết bị khi có một năm, tháng, ngày, giờ và phút?

Câu trả lời:


291

Sử dụng lớp DateFormat Java tiêu chuẩn.

Ví dụ để hiển thị ngày giờ hiện tại, hãy làm như sau:

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

Bạn có thể khởi tạo một đối tượng Date bằng các giá trị của riêng bạn, tuy nhiên bạn nên lưu ý rằng các hàm tạo đã bị phản đối và bạn thực sự nên sử dụng một đối tượng Lịch Java.


42
Đây là android.text.format.DateFormat chứ không phải java.text.DateFormat.
jamesh

4
Android IME khá điển hình khi có hai lớp mà cả hai đều tuyên bố sẽ cung cấp cho bạn một kết quả được đặt thành Địa điểm mặc định nhưng một lớp thì không. Vì vậy, vâng, đừng quên sử dụng phiên bản android.text.format của DateFormat (thậm chí không lấy được java.util one LOL).
mxcl

22
Xin lưu ý dòng này: DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());DateFormat được trả về là loại java.text.DateFormat(và KHÔNG android.text.format.DateFormat)
Arye Rosenstein

2
@Harsha - để giải quyết vấn đề đó, tôi sử dụng DateFormat để sử dụng lớp Android và do đó tôi không phải tham khảo lớp Android và do đó không có bất kỳ lớp mơ hồ nào. chuỗi cuối cùng dateStr = DateFormat.getDateFormat (this) .format (d); Bạn có thể sử dụng phương thức định dạng () của Android và có mã dọn dẹp (IMHO) và một đối tượng ít hơn để khởi tạo.
Jerry Brady

23
Định dạng này chỉ bao gồm ngày, không phải thời gian như câu hỏi ban đầu đã nêu. Thay vào đó, hãy sử dụng DateUtils từ cùng một gói, xem stackoverflow.com/questions/2983920/iêu
Asmo Soinio

203

Theo tôi, android.text.format.DateFormat.getDateFormat(context)làm cho tôi bối rối vì phương thức này trả về java.text.DateFormatchứ không phải android.text.format.DateFormat- - ".

Vì vậy, tôi sử dụng mã phân đoạn như dưới đây để lấy ngày / giờ hiện tại theo định dạng của mình.

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

Ngoài ra, bạn có thể sử dụng các định dạng khác. Thực hiện theo DateFormat .


21
Hữu ích, nhưng câu hỏi cho biết "theo cấu hình thiết bị". Đối với tôi, ngụ ý sử dụng định dạng được chọn dựa trên ngôn ngữ / quốc gia của người dùng hoặc được người dùng chọn trực tiếp, thay vì mã hóa lựa chọn định dạng.
Chris Boyle

17
Ngoài ra, đừng quên rằng hh:mm:sssẽ cung cấp cho bạn 01:00:00trong 1 giờ chiều, bạn sẽ cần sử dụng kk:mm:ssđể có được13:00:00
dnet

2
@dnet klà giờ trong ngày (1-24), ý bạn không phải Hlà giờ trong ngày (0-23), vd. HH: mm: ss? Xem: developer.android.com/reference/java/text/SimpleDateFormat.html
Joony

1
@Joony không, có sự khác biệt giữa java.text.SimpleDateFormat(những gì bạn đã liên kết và sử dụng Hhàng giờ trong phạm vi 0-23) và android.text.format.DateFormat(câu trả lời là gì và sử dụng khàng giờ trong phạm vi 0-23)
dnet

@dnet Sau khi kiểm tra, bạn đã chính xác về k, tuy nhiên, tài liệu cho DateFormatcác trạng thái rõ ràng Đối với tài liệu chính tắc của các chuỗi định dạng, hãy xem SimpleDateFormat. Rất bối rối. Hay tôi đang thiếu một cái gì đó?
Joony

145

Bạn có thể sử dụng DateFormat. Kết quả phụ thuộc vào Địa điểm mặc định của điện thoại, nhưng bạn cũng có thể chỉ định Địa điểm:

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

Đây là kết quả trên một

DateFormat.getDateInstance().format(date)                                          

Địa điểm FR: 3 tiểu thuyết. 2017

Hoa Kỳ / Địa điểm: ngày 12 tháng 1 năm 1952


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

Địa điểm FR: 03/11/2017

Hoa Kỳ / Địa điểm: 12.13.52


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

Địa điểm FR: 3 tiểu thuyết. 2017

Hoa Kỳ / Địa điểm: ngày 12 tháng 1 năm 1952


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

Địa điểm FR: 3 tiểu thuyết 2017

Hoa Kỳ / Địa điểm: ngày 12 tháng 1 năm 1952


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

FR Locale: mối thù 3 năm 2017

Hoa Kỳ / Địa điểm: Thứ ba ngày 12 tháng 4 năm 1952


DateFormat.getDateTimeInstance().format(date)

Địa điểm FR: 3 tiểu thuyết. 2017 16:04:58


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

Địa điểm FR: 03/11/2017 16:04


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

Địa điểm FR: 03/11/2017 16:04:58


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

Địa điểm FR: 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)

Địa điểm FR: 16:04:58


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

Địa điểm FR: 16:04


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

Địa điểm FR: 16:04:58


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

Địa điểm FR: 16:04:58 GMT + 01:00


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

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



4
Cảm ơn bạn đã đặt tất cả những trường hợp này ở một nơi. Nếu bạn chỉ có thể thêm các trường hợp cho thời gian, điều này sẽ làm cho nó trở thành một tài liệu tham khảo đầy đủ.
zeeshan

41

Chuỗi ngày đến miền địa phương:

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

Tùy chọn:

   DateFormat.getDateInstance() 

-> 31/12/1969

   DateFormat.getDateTimeInstance() 

-> 31/12/1969 4:00:00 CH

   DateFormat.getTimeInstance() 

-> 4:00:00 CH


3
Làm cách nào để xóa năm khỏi DateFormat.getDateInstance ()?
Hardik Joshi

21

Điều này sẽ làm điều đó:

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

Điều này sẽ được bản địa hóa khi người dùng thay đổi ngôn ngữ trong thiết bị Android?
Kannan_SJD

14

Sử dụng SimpleDateFormat

Như thế này:

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

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

5
Có, với ngôn ngữ mặc định để tránh các vấn đề về hiệu suất:new SimpleDateFormat("my-format", Locale.getDefault());
iutinvg

14

Theo dõi điều này: http://developer.android.com/reference/android/text/format/Time.html

Tốt hơn là sử dụng lớp Thời gian gốc của Android:

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

Sau đó định dạng:

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

1
@FireZenk: Theo [link] ( developer.android.com/reference/android/text/format/Time.html ) bạn đã cung cấp: Lớp này có một số vấn đề và chúng tôi khuyên bạn nên sử dụng GregorianCalWiki .
ccpizza

Ồ ... thông tin về vấn đề này mới hơn bình luận của tôi, vì vậy đó là một câu trả lời không được chấp nhận
FireZenk

10

Sử dụng hai cái này như một biến lớp:

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

Và sử dụng nó như thế này:

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

9

Đây là phương pháp của tôi, bạn có thể xác định và định dạng đầu vào và đầu ra.

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

Tôi sử dụng SimpleDateFormat mà không có mẫu tùy chỉnh để nhận ngày giờ thực tế từ hệ thống ở định dạng được chọn trước của thiết bị :

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

trả về :

  • 13.01.15 11:45
  • 1/13/15 10:45 sáng
  • ...

7

Sử dụng xây dựng trong lớp Thời gian!

Time time = new Time();
time.set(0, 0, 17, 4, 5, 1999);
Log.i("DateTime", time.format("%d.%m.%Y %H:%M:%S"));

Đây là giải pháp tối ưu vì nó sử dụng đối tượng Time nhẹ từ Khung Android: developer.android.com/reference/android/text/format/Time.html
Dean Wild

13
Đây không phải là giải pháp tối ưu: nó không tôn trọng định dạng ngày từ ngôn ngữ của người dùng.
Dan Hulme

5

Các câu trả lời khác nói chung là chính xác. Tôi muốn đóng góp câu trả lời hiện đại. Các lớp Date, DateFormatSimpleDateFormatđược sử dụng trong hầu hết các câu trả lời khác, đã lỗi thời và gây rắc rối cho nhiều lập trình viên trong nhiều năm. Hôm nay chúng ta có nhiều thứ tốt hơn java.time, AKA JSR-310, API ngày & giờ Java hiện đại. Bạn có thể sử dụng cái này trên Android chưa? Chắc chắn nhất! Các lớp hiện đại đã được đưa vào Android trong dự án ThreeTenABP. Xem câu hỏi này: Cách sử dụng ThreeTenABP trong Dự án Android để biết tất cả các chi tiết.

Đoạn mã này sẽ giúp bạn bắt đầu:

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

Khi tôi đặt ngôn ngữ ưa thích của máy tính của mình thành US English hoặc UK English, bản in này:

Sep 28, 2017 10:45:00 PM

Khi thay vào đó, tôi đặt nó thành tiếng Đan Mạch, tôi nhận được:

28-09-2017 22:45:00

Vì vậy, nó làm theo cấu hình. Tuy nhiên, tôi không chắc chắn chính xác đến chi tiết nào sau cài đặt ngày và giờ của thiết bị của bạn và điều này có thể khác nhau tùy theo từng điện thoại.


5

Mã này làm việc cho tôi!

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

Lớp định dạng ngày làm việc với mã cheat để tạo ngày. Giống

  1. M -> 7, MM -> 07, MMM -> Tháng 7, MMMM -> Tháng 7
  2. EEE -> Thứ ba, EEEE -> Thứ ba
  3. z -> EST, zzz -> EST, zzzz -> Giờ chuẩn miền đông

Bạn có thể kiểm tra thêm gian lận ở đây .


4

Mã này sẽ trả về ngày và giờ hiện tại:

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

1
toLocaleString () không được dùng nữa
nspo

4

Địa phương

Để có được ngày hoặc thời gian ở định dạng miền địa phương từ mili giây tôi đã sử dụng điều này:

Ngày và giờ

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

Ngày

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

Thời gian

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

Bạn có thể sử dụng phong cách ngày và phong cách thời gian khác. Thông tin thêm về phong cách ở đây .


4

Con đường ngắn nhất:

// 2019-03-29 16:11
String.format("%1$tY-%<tm-%<td %<tR", Calendar.getInstance())

%tRlà viết tắt của từ %tH:%tM, <có nghĩa là sử dụng lại tham số cuối cùng ( 1$).

Nó tương đương với String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM", Calendar.getInstance())

https://developer.android.com/reference/java/util/Formatter.html


2

Thử:

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

Và khi bạn đang truy cập các biến đã qua:

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

2

Tôi sử dụng nó như thế này:

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

Tránh juDate

Java.util.Date và .CalWiki và SimpleDateFormat trong Java (và Android) nổi tiếng là rắc rối. Tránh chúng. Chúng tệ đến mức Sun / Oracle đã từ bỏ chúng, thay thế chúng bằng gói java.time mới trong Java 8 (không phải trong Android như năm 2014). Cái mới java.timeđược lấy cảm hứng từ thư viện Joda-Time .

Joda-Thời gian

Joda-Time không hoạt động trong Android.

Tìm kiếm StackOverflow cho "Joda" để tìm nhiều ví dụ và nhiều cuộc thảo luận.

Một mẩu tin về mã nguồn sử dụng Joda-Time 2.4.

Định dạng chuẩn.

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

Định dạng cục bộ.

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

1

Quay lại năm 2016, Khi tôi muốn tùy chỉnh định dạng (không theo cấu hình thiết bị, như bạn hỏi ...) Tôi thường sử dụng tệp tài nguyên chuỗi:

trong chuỗi XML:

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

Trong hoạt động:

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

Điều này cũng hữu ích với việc phát hành Thư viện liên kết ngày mới .

Vì vậy, tôi có thể có một cái gì đó như thế này trong tập tin bố trí:

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

Và trong lớp java:

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

0

Lớp Thời gian android cung cấp 3 phương thức định dạng http://developer.android.com/reference/android/text/format/Time.html

Đây là cách tôi đã làm nó:

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

Tôi hy vọng điều đó hữu ích :-)


0

Quá muộn nhưng nó có thể giúp ích cho ai đó

DateFormat.format(format, timeInMillis);

đây formatlà định dạng bạn cần

ví dụ: "HH: mm" trả về 15:30

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.