Câu trả lời:
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.
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
)
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.DateFormat
chứ 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 .
hh:mm:ss
sẽ cung cấp cho bạn 01:00:00
trong 1 giờ chiều, bạn sẽ cần sử dụng kk:mm:ss
để có được13:00:00
k
là giờ trong ngày (1-24), ý bạn không phải H
là giờ trong ngày (0-23), vd. HH: mm: ss? Xem: developer.android.com/reference/java/text/SimpleDateFormat.html
java.text.SimpleDateFormat
(những gì bạn đã liên kết và sử dụng H
hàng giờ trong phạm vi 0-23) và android.text.format.DateFormat
(câu trả lời là gì và sử dụng k
hàng giờ trong phạm vi 0-23)
k
, tuy nhiên, tài liệu cho DateFormat
cá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ì đó?
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
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
Đ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));
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"));
new SimpleDateFormat("my-format", Locale.getDefault());
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"));
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());
Đâ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;
}
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ề :
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"));
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
, DateFormat
và SimpleDateFormat
đượ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.
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();
Để 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:
Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.getDefault());
dateFormat.format(date);
Date date = new Date(milliseconds);
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault());
dateFormat.format(date);
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 .
Con đường ngắn nhất:
// 2019-03-29 16:11
String.format("%1$tY-%<tm-%<td %<tR", Calendar.getInstance())
%tR
là 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
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"));
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;
}
}
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-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.
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());
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 :-)
Quá muộn nhưng nó có thể giúp ích cho ai đó
DateFormat.format(format, timeInMillis);
đây format
là định dạng bạn cần
ví dụ: "HH: mm" trả về 15:30