Cách nhận thời gian và ngày hiện tại trong Android


1109

Làm cách nào tôi có thể nhận được thời gian và ngày hiện tại trong một ứng dụng Android?


3
43 câu trả lời! Trong khi nhiều trong số chúng là tốt khi chúng được viết, câu trả lời tốt để sử dụng trong năm 2018 là ở đây .
Ole VV

Câu trả lời:


1310

Bạn đã có thể sử dụng:

import java.util.Calendar

Date currentTime = Calendar.getInstance().getTime();

Có rất nhiều hằng số trong Lịch cho mọi thứ bạn cần.

Chỉnh sửa:
Kiểm tra tài liệu lớp Lịch


14
+1 Điều này rất hữu ích. Là mới, đó là tất cả những mẩu tin nhỏ mà chúng ta cần ... Tôi đang sử dụng Lịch để có được ngày Julian. Dễ dàng hơn nhiều so với nhận được mili giây và tìm ra nếu giá trị bằng với ngày hôm nay;)
Bill Mote

9
Nhưng điều này kéo ngày và thời gian từ đâu? Thiết bị android tự cài đặt?
Kyle Clegg

12
@Kyle Có, nó dựa trên cài đặt thời gian / múi giờ của thiết bị. Trích dẫn từ tài liệu : "Phương thức getInstance của Lịch trả về lịch có ngôn ngữ dựa trên cài đặt hệ thống và trường thời gian đã được khởi tạo với ngày và giờ hiện tại" - (phía trên dòng lấy mẫu đầu tiên trong tài liệu lớp).

3
+1 giải pháp này có độ chính xác đến mili giây, đúng với những gì tôi cần.
Igor Zelaya

42
Như @adamdport nói, điều này không thực sự trả lời câu hỏi ... Calendar.getInstance().getTime()hoặc Calendar.getInstance().getTimeInMillis()sẽ hoạt động.
akousmata

487

Bạn có thể ( nhưng không còn nên - xem bên dưới!) Sử dụng android.text.format.Time :

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

Từ tài liệu tham khảo được liên kết ở trên:

Lớp Time là sự thay thế nhanh hơn cho các lớp java.util.CalWiki và java.util.GregorianCalWiki. Một thể hiện của lớp Time biểu thị một khoảnh khắc trong thời gian, được chỉ định với độ chính xác thứ hai.


CHÚ THÍCH 1: Đã vài năm kể từ khi tôi viết câu trả lời này, và đó là về một lớp học cũ, cụ thể dành cho Android và hiện không dùng nữa. Google hiện nói rằng "[t] lớp của anh ấy có một số vấn đề và chúng tôi khuyên bạn nên sử dụng GregorianCalWiki thay thế".


CHÚ THÍCH 2: Mặc dù Timelớp có một toMillis(ignoreDaylightSavings)phương thức, đây chỉ đơn giản là sự tiện lợi để chuyển sang các phương thức mong đợi thời gian tính bằng mili giây. Giá trị thời gian chỉ chính xác đến một giây ; phần mili giây luôn luôn 000. Nếu trong một vòng lặp bạn làm

Time time = new Time();   time.setToNow();
Log.d("TIME TEST", Long.toString(time.toMillis(false)));
... do something that takes more than one millisecond, but less than one second ...

Chuỗi kết quả sẽ lặp lại cùng một giá trị, chẳng hạn như 1410543204000, cho đến khi giây tiếp theo bắt đầu, tại thời điểm đó 1410543205000sẽ bắt đầu lặp lại.


2
@InsanityOnABun và Muhammad Babar. Không không không. Tài liệu nói "được chỉ định với độ chính xác thứ hai" Ngay cả thử nghiệm đơn giản nhất (nhận thời gian hiện tại trong một vòng lặp, toMillis và ghi nhật ký / in kết quả) sẽ cho bạn thấy rằng thời gian kết quả có 000 là phần mili giây!
ToolmakerSteve

3
@IgorZelaya Nếu bạn muốn độ chính xác của mili giây, có lẽ bạn đang thực hiện định thời gian , thay vì thời gian trong ngày. Tài liệu Android khuyên SystemClock.uptimeMillis()dùng cho thời gian cách quãng. Vì đó là những gì hầu hết các chức năng tích hợp sử dụng, có động lực mạnh mẽ để nó được triển khai tốt trên tất cả các thiết bị. Xem thảo luận trong SystemClock ... Nếu bạn muốn tương quan với thời gian trong ngày, trong ứng dụng onResume, hãy đọc cả điều này và Time / setToNow / toMillis. Hãy nhớ sự khác biệt giữa những người.
ToolmakerSteve

Không sử dụng lớp Thời gian . Nó sẽ bị xóa trong tương lai và có nhiều vấn đề với nó.
Sandy Chapman

1
> Lớp này không được dùng ở cấp API 22. Thay vào đó, hãy sử dụng GregorianCalWiki. Xem tại đây
Neo

Trên thực tế, GregorianCalendarđã được thay thế từ nhiều năm trước trong Java và trong Android sau này bởi các lớp java.time , cụ thể ZonedDateTime. Đối với Android trước đó, hãy xem các dự án ThreeTen-BackportThreeTenABP .
Basil Bourque

366

Nếu bạn muốn lấy ngày và giờ theo một mẫu cụ thể, bạn có thể sử dụng như sau:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
String currentDateandTime = sdf.format(new Date());

Hoặc là,

Ngày :

String currentDate = new SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()).format(new Date());

Thời gian:

String currentTime = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(new Date());

Điều này sẽ cho thời gian trong UTC, nên áp dụng cho múi giờ.
Andras Balázs Lajtha

10
Coi chừng, SimpleDateFormat có thể có vấn đề nếu hiệu suất là một vấn đề. Trong ứng dụng của mình, tôi có chế độ xem tùy chỉnh có khoảng 20 nhãn HH: MM đại diện cho thời gian cụ thể (số nguyên dài giữ mili giây) và số lượng tài nguyên có thể rút được bằng nhau. Thử nghiệm ban đầu cho thấy sự tương tác không phải là chất lỏng như tôi muốn. Khi tôi định hình trênDraw () tôi thấy rằng các cuộc gọi SimpleTimeFormatter đang chiếm 80% thời gian. Trên thực tế, tôi đang đọc trang này như một phần của việc tìm kiếm một công cụ định dạng hiệu quả hơn và để tìm hiểu thêm về Lịch, v.v.
William T. Mallard 22/07/13

3
Có, nhưng không còn. Tôi đã không nhận ra chi phí liên quan và đã cho rằng đó là khá nhiều POJO.
William T. Mallard

32
Tóm lại:String currentDateandTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
Pratik Butani

4
bạn có thể chèn sdf.setTimeZone(TimeZone.getDefault())vào giữa
Harvey

231

Đối với những người thích thay đổi định dạng tùy chỉnh, bạn có thể sử dụng:

DateFormat df = new SimpleDateFormat("EEE, d MMM yyyy, HH:mm");
String date = df.format(Calendar.getInstance().getTime());

Trong khi đó bạn có thể có các mẫu DateFormat như:

"yyyy.MM.dd G 'at' HH:mm:ss z" ---- 2001.07.04 AD at 12:08:56 PDT
"hh 'o''clock' a, zzzz" ----------- 12 o'clock PM, Pacific Daylight Time
"EEE, d MMM yyyy HH:mm:ss Z"------- Wed, 4 Jul 2001 12:08:56 -0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"------- 2001-07-04T12:08:56.235-0700
"yyMMddHHmmssZ"-------------------- 010704120856-0700
"K:mm a, z" ----------------------- 0:08 PM, PDT
"h:mm a" -------------------------- 12:08 PM
"EEE, MMM d, ''yy" ---------------- Wed, Jul 4, '01

126

Trên thực tế, an toàn hơn khi đặt múi giờ hiện tại được đặt trên thiết bị Time.getCurrentTimezone(), nếu không bạn sẽ có được thời gian hiện tại trong UTC.

Time today = new Time(Time.getCurrentTimezone());
today.setToNow();

Sau đó, bạn có thể lấy tất cả các trường ngày bạn muốn, ví dụ:

textViewDay.setText(today.monthDay + "");             // Day of the month (1-31)
textViewMonth.setText(today.month + "");              // Month (0-11)
textViewYear.setText(today.year + "");                // Year 
textViewTime.setText(today.format("%k:%M:%S"));  // Current time

Xem lớp android.text.format.Time để biết tất cả các chi tiết.

CẬP NHẬT

Như nhiều người đang chỉ ra, Google cho biết lớp này có một số vấn đề và không được sử dụng nữa:

Lớp này có một số vấn đề và thay vào đó nên sử dụng GregorianCalWiki.

Các vấn đề đã biết:

Vì các lý do lịch sử khi thực hiện tính toán thời gian, tất cả số học hiện đang diễn ra bằng cách sử dụng số nguyên 32 bit. Điều này giới hạn phạm vi thời gian đáng tin cậy có thể biểu thị từ năm 1902 đến năm 2037. Xem bài viết trên wikipedia về vấn đề Năm 2038 để biết chi tiết. Đừng dựa vào hành vi này; nó có thể thay đổi trong tương lai. Gọi switchTimezone (Chuỗi) vào một ngày không thể tồn tại, chẳng hạn như thời gian treo tường bị bỏ qua do chuyển đổi DST, sẽ dẫn đến một ngày vào năm 1969 (tức là -1, hoặc 1 giây trước ngày 1 tháng 1 năm 1970 UTC). Phần lớn định dạng / phân tích giả định văn bản ASCII và do đó không phù hợp để sử dụng với các tập lệnh không phải ASCII.


Nên nhập thời gian từ gói nào?
ManishSB

Lớp này không được dùng ở cấp độ API 22. Chúng ta có thể sử dụng GregorianCalWiki thay thế.
Choletski

78

Đối với ngày và giờ hiện tại, sử dụng:

String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());

Đầu ra nào:

Feb 27, 2012 5:41:23 PM

Tôi đã nhận được ngày, ngày và giờ hiện tại của hệ thống nhưng thời gian không thay đổi. Tôi sẽ tăng thời gian từng giây. Tôi có thể làm gì?
Bhavesh Hirpara

2
Đây là cách làm được đề xuất, theo API của Android: developer.android.com/reference/java/text/ mẹo Cảm ơn!
M Granja

58

Thử theo cách này Tất cả các định dạng được đưa ra dưới đây để có được định dạng ngày và giờ.

    Calendar c = Calendar.getInstance();
    SimpleDateFormat dateformat = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss aa");
    String datetime = dateformat.format(c.getTime());
    System.out.println(datetime);

Đầu tiên

thứ hai ngày thứ ba


53

tl; dr

Instant.now()  // Current moment in UTC.

…hoặc là…

ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )  // In a particular time zone

Chi tiết

Các câu trả lời khác, trong khi chính xác, đã lỗi thời. Các lớp thời gian cũ đã được chứng minh là được thiết kế kém, khó hiểu và rắc rối.

java.time

Các lớp cũ này đã được thay thế bởi khung java.time .

Các lớp mới này được lấy cảm hứng từ dự án Joda-Time rất thành công , được xác định bởi JSR 310 và được mở rộng bởi dự án ThreeTen-Extra .

Xem Hướng dẫn của Oracle .

Instant

An Instantlà một khoảnh khắc trên dòng thời gian trong UTC với độ phân giải lên tới nano giây .

 Instant instant = Instant.now(); // Current moment in UTC.

Múi giờ

Áp dụng múi giờ ( ZoneId) để có được a ZonedDateTime. Nếu bạn bỏ qua múi giờ thì múi giờ mặc định hiện tại của JVM sẽ được áp dụng hoàn toàn. Tốt hơn để xác định rõ ràng múi giờ mong muốn / dự kiến.

Sử dụng tên múi giờ thích hợp trong các định dạng của continent/regionnhư America/Montreal, Europe/Brusselshoặc Asia/Kolkata. Không bao giờ sử dụng 3-4 chữ viết tắt như ESThoặc ISTvì chúng không được tiêu chuẩn hóa hoặc duy nhất.

ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Or "Asia/Kolkata", "Europe/Paris", and so on.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

Bảng các loại thời gian trong Java, cả hiện đại và di sản

Tạo chuỗi

Bạn có thể dễ dàng tạo một Stringbiểu diễn dưới dạng văn bản của giá trị thời gian. Bạn có thể đi với định dạng chuẩn, định dạng tùy chỉnh của riêng bạn hoặc định dạng tự động cục bộ.

ISO 8601

Bạn có thể gọi các toStringphương thức để có được định dạng văn bản bằng cách sử dụng tiêu chuẩn ISO 8601 phổ biến và hợp lý .

String output = instant.toString();

2016-03-23T03: 09: 01.613Z

Lưu ý rằng ZonedDateTime, toStringphương pháp mở rộng tiêu chuẩn ISO 8601 bằng cách nối thêm tên của múi giờ trong ngoặc vuông. Thông tin cực kỳ hữu ích và quan trọng, nhưng không chuẩn.

2016-03-22T20: 09: 01.613-08: 00 [Mỹ / Los_Angele]

Định dạng tùy chỉnh

Hoặc chỉ định mẫu định dạng cụ thể của riêng bạn với DateTimeFormatterlớp.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "dd/MM/yyyy hh:mm a" );

Chỉ định một Localengôn ngữ của con người (tiếng Anh, tiếng Pháp , v.v.) để sử dụng trong việc dịch tên của ngày / tháng và cả trong việc xác định các chuẩn mực văn hóa như thứ tự của năm và tháng và ngày. Lưu ý rằng Localekhông có gì để làm với múi giờ.

formatter = formatter.withLocale( Locale.US ); // Or Locale.CANADA_FRENCH or such.
String output = zdt.format( formatter );

Bản địa hóa

Tốt hơn hết, hãy để java.time thực hiện công việc bản địa hóa tự động.

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM );
String output = zdt.format( formatter.withLocale( Locale.US ) );  // Or Locale.CANADA_FRENCH and so on.

Giới thiệu về java.time

Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date, Calendar, & SimpleDateFormat.

Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.

Để tìm hiểu thêm, xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .

Bạn có thể trao đổi các đối tượng java.time trực tiếp với cơ sở dữ liệu của bạn. Sử dụng trình điều khiển JDBC tương thích với JDBC 4.2 trở lên. Không cần chuỗi, không cần java.sql.*lớp.

Nơi để có được các lớp java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 và mới hơn
    • Được xây dựng trong.
    • Một phần của API Java tiêu chuẩn với việc triển khai đi kèm.
    • Java 9 thêm một số tính năng nhỏ và sửa lỗi.
  • Java SE 6 Java SE 7
    • Phần lớn chức năng java.time được chuyển ngược lại sang Java 6 & 7 trong ThreeTen-Backport .
  • Android
    • Các phiên bản sau của triển khai gói Android của các lớp java.time.
    • Đối với Android trước đó (<26), các ThreeTenABP dự án thích nghi ThreeTen-backport (nêu trên). Xem Cách sử dụng ThreeTenABP .

Bảng liệt kê việc triển khai công nghệ * java.time * nào để sử dụng trên phiên bản Java và Android nào.


2
@ gi hươu cao cổ.guru Đọc lại câu trả lời của tôi. Bạn đã bỏ lỡ viên đạn thứ ba. Phần lớn chức năng java.time được chuyển ngược lại sang Java 6 & 7 trong ThreeTen-Backport và được điều chỉnh thêm cho Android trong ThreeTenABP .
Basil Bourque

Instant.now()ZonedDateTime.now()được yêu cầu API 26
Ryde

2
@Ryde Như tôi đã nói với gi hươu cao cổ.guru, đọc lại Câu trả lời của tôi. Tìm kiếm viên đạn thứ ba đề cập đến "Android".
Basil Bourque

Tôi tin rằng bạn đã đúng: bảng phiên bản java.time mới của bạn truyền tải thông điệp trực tiếp và dễ dàng hơn danh sách dấu đầu dòng. Nếu đó là tôi, tôi nghĩ rằng tôi sẽ làm phức tạp thêm một chút nữa và đặt dấu kiểm trong ngoặc (hoặc một cái gì đó tương tự) trong ThreeTenBackport / Java 8+ và cả ThreeTenABP / Android 26+ vì các kết hợp này hoạt động, chỉ có điều đó không hoạt động thường không có bất kỳ điểm nào trong việc sử dụng chúng. Các ứng dụng Android đang được phát triển sử dụng ThreeTenABP và nhắm mục tiêu một loạt các cấp độ API Android cả trên và dưới cấp 26. Đối với tôi, các nhà phát triển chọn tốt trong các trường hợp này.
Ole VV

1
@ OleV.V. Cảm ơn bạn đã gợi ý một dấu kiểm thứ cấp trong bảng đồ họa. Tôi đã sử dụng nó trong các phiên bản sau của bảng. Cải thiện nhiều.
Basil Bourque

52

Để ge thời gian hiện tại bạn có thể sử dụng System.currentTimeMillis()đó là tiêu chuẩn trong Java. Sau đó, bạn có thể sử dụng nó để tạo một ngày

Date currentDate = new Date(System.currentTimeMillis());

Và như được đề cập bởi những người khác để tạo ra một thời gian

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

13
Không cần System.currentTimeMillis(); chỉ đơn giản là new Date() làm điều tương tự .
Jonik

@Jonik Cannot resolve constructor Date()trong Android, SDK Android sử dụng hỗn hợp Java 6 và 7.
surfer190

1
Cảm ơn bạn. Date currentDate = new Date(System.currentTimeMillis());là chính xác
mghhgm

@mghhgm Không, new Date(System.currentTimeMillis())không đúng: (a) nó là dư thừa, vì đó là chính xác như new Date(). (b) Lớp rắc rối java.util.Datehiện được thay thế bởi java.time.InstantJava 8 trở lên. Đã chuyển ngược sang Java 6 & 7 trong dự án ThreeTen-Backport và cho Android trước đó (<26) trong ThreeTenABP .
Basil Bourque

37

Bạn có thể sử dụng mã:

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strDate = sdf.format(c.getTime());

Đầu ra:

2014-11-11 00:47:55

Bạn cũng có thêm một số tùy chọn định dạng cho SimpleDateFormattừ đây .


FYI, người già lớp ngày thời gian phiền hà như java.util.Date, java.util.Calendarjava.text.SimpleDateFormatbây giờ là di sản , thay thế bởi sự java.time class built vào Java 8 và sau đó. Xem Hướng dẫn của Oracle .
Basil Bourque

32

Dễ dàng, bạn có thể phân tích thời gian để có được các giá trị riêng cho thời gian hiện tại, như sau:

Calendar cal = Calendar.getInstance(); 

  int millisecond = cal.get(Calendar.MILLISECOND);
  int second = cal.get(Calendar.SECOND);
  int minute = cal.get(Calendar.MINUTE);
        //12 hour format
  int hour = cal.get(Calendar.HOUR);
        //24 hour format
  int hourofday = cal.get(Calendar.HOUR_OF_DAY);

Tương tự như vậy đối với ngày, như sau:

Calendar cal = Calendar.getInstance(); 

  int dayofyear = cal.get(Calendar.DAY_OF_YEAR);
  int year = cal.get(Calendar.YEAR);
  int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
  int dayofmonth = cal.get(Calendar.DAY_OF_MONTH);

Làm thế nào có thể có được ngày trong 5-10 ngày tới..là nó tính toán thủ công ở đây?
CoDe

@CoDe Bạn sử dụng Ngày cho điều đó
FindOutIslamNow

27

Có một số tùy chọn vì Android chủ yếu là Java, nhưng nếu bạn muốn viết nó trong textView, đoạn mã sau sẽ thực hiện thủ thuật:

String currentDateTimeString = DateFormat.getDateInstance().format(new Date());

// textView is the TextView view that should display it
textView.setText(currentDateTimeString);

8
Bạn nên sử dụng Calendarhoặc GregorianCalendar. Các Datelớp bị phản đối.
Joseph Earl

Cảm ơn bạn đời :) Tôi hoàn toàn không biết gì về điều đó
dLobatog 20/03/2016

12
Theo tài liệu tham khảo Date () ( developer.android.com/reference/java/util/Date.html ), không có gì liên quan đến lớp Date () bị phản đối - tuy nhiên một số phương thức và hàm tạo bị phản đối.
Zac Seth

2
Điều này sẽ tạo ra kết quả không chính xác theo ý nghĩa của cài đặt người dùng hiện tại (ví dụ định dạng 12/24). Sử dụng android.text.format.DateFormat.getTimeFormat (Ngữ cảnh ngữ cảnh) để nhận DateFormat cho cài đặt người dùng hiện tại.
wonder.mice

@Zac bạn đúng ngay cả phương thức getTime của Date thậm chí còn sử dụng đầy đủ hơn

24
SimpleDateFormat databaseDateTimeFormate = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat databaseDateFormate = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdf1 = new SimpleDateFormat("dd.MM.yy");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy.MM.dd G 'at' hh:mm:ss z");
SimpleDateFormat sdf3 = new SimpleDateFormat("EEE, MMM d, ''yy");
SimpleDateFormat sdf4 = new SimpleDateFormat("h:mm a");
SimpleDateFormat sdf5 = new SimpleDateFormat("h:mm");
SimpleDateFormat sdf6 = new SimpleDateFormat("H:mm:ss:SSS");
SimpleDateFormat sdf7 = new SimpleDateFormat("K:mm a,z");
SimpleDateFormat sdf8 = new SimpleDateFormat("yyyy.MMMMM.dd GGG hh:mm aaa");


String currentDateandTime = databaseDateTimeFormate.format(new Date());     //2009-06-30 08:29:36
String currentDateandTime = databaseDateFormate.format(new Date());     //2009-06-30
String currentDateandTime = sdf1.format(new Date());     //30.06.09
String currentDateandTime = sdf2.format(new Date());     //2009.06.30 AD at 08:29:36 PDT
String currentDateandTime = sdf3.format(new Date());     //Tue, Jun 30, '09
String currentDateandTime = sdf4.format(new Date());     //8:29 PM
String currentDateandTime = sdf5.format(new Date());     //8:29
String currentDateandTime = sdf6.format(new Date());     //8:28:36:249
String currentDateandTime = sdf7.format(new Date());     //8:29 AM,PDT
String currentDateandTime = sdf8.format(new Date());     //2009.June.30 AD 08:29 AM

Mẫu định dạng ngày

G   Era designator (before christ, after christ)
y   Year (e.g. 12 or 2012). Use either yy or yyyy.
M   Month in year. Number of M's determine length of format (e.g. MM, MMM or MMMMM)
d   Day in month. Number of d's determine length of format (e.g. d or dd)
h   Hour of day, 1-12 (AM / PM) (normally hh)
H   Hour of day, 0-23 (normally HH)
m   Minute in hour, 0-59 (normally mm)
s   Second in minute, 0-59 (normally ss)
S   Millisecond in second, 0-999 (normally SSS)
E   Day in week (e.g Monday, Tuesday etc.)
D   Day in year (1-366)
F   Day of week in month (e.g. 1st Thursday of December)
w   Week in year (1-53)
W   Week in month (0-5)
a   AM / PM marker
k   Hour in day (1-24, unlike HH's 0-23)
K   Hour in day, AM / PM (0-11)
z   Time Zone

1
Mặc dù các câu trả lời khác cũng đúng. Tôi thích câu trả lời này vì nó cũng giúp các vấn đề liên quan đến thời gian liên quan. Cảm ơn @Vighnesh KM
Ankit Gupta

17
final Calendar c = Calendar.getInstance();
    int mYear = c.get(Calendar.YEAR);
    int mMonth = c.get(Calendar.MONTH);
    int mDay = c.get(Calendar.DAY_OF_MONTH);

textView.setText(""+mDay+"-"+mMonth+"-"+mYear);

15

Đây là một phương pháp sẽ hữu ích để có được ngày và thời gian:

private String getDate(){
    DateFormat dfDate = new SimpleDateFormat("yyyy/MM/dd");
    String date=dfDate.format(Calendar.getInstance().getTime());
    DateFormat dfTime = new SimpleDateFormat("HH:mm");
    String time = dfTime.format(Calendar.getInstance().getTime());
    return date + " " + time;
}

Bạn có thể gọi phương thức này và nhận các giá trị ngày và giờ hiện tại:

2017/01//09 19:23

Tôi không thích sự kết hợp chặt chẽ giữa logic trình bày và logic quá trình; Tôi thích một phương thức chỉ định dạng và lấy tham số đầu vào ngày. Tôi cũng không hiểu tại sao bạn sử dụng 2 SimpleDateFormatgiây và Date... bạn không thể sử dụng "yyyy/MM/dd HH:mm"làm định dạng và lịch gọi một lần?
AjahnCharles

12
Time time = new Time();
time.setToNow();
System.out.println("time: " + time.hour+":"+time.minute);

Điều này sẽ cung cấp cho bạn, ví dụ, 12:32.

Nhớ nhập android.text.format.Time;


12
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    Calendar cal = Calendar.getInstance();
    System.out.println("time => " + dateFormat.format(cal.getTime()));

    String time_str = dateFormat.format(cal.getTime());

    String[] s = time_str.split(" ");

    for (int i = 0; i < s.length; i++) {
         System.out.println("date  => " + s[i]);
    }

    int year_sys = Integer.parseInt(s[0].split("/")[0]);
    int month_sys = Integer.parseInt(s[0].split("/")[1]);
    int day_sys = Integer.parseInt(s[0].split("/")[2]);

    int hour_sys = Integer.parseInt(s[1].split(":")[0]);
    int min_sys = Integer.parseInt(s[1].split(":")[1]);

    System.out.println("year_sys  => " + year_sys);
    System.out.println("month_sys  => " + month_sys);
    System.out.println("day_sys  => " + day_sys);

    System.out.println("hour_sys  => " + hour_sys);
    System.out.println("min_sys  => " + min_sys);

12

Đối với ngày và giờ hiện tại có định dạng, Sử dụng

Trong Java

Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strDate = sdf.format(c.getTime());
Log.d("Date","DATE : " + strDate)

Ở Kotlin

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    val current = LocalDateTime.now()
    val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy. HH:mm:ss")
    var myDate: String =  current.format(formatter)
    Log.d("Date","DATE : " + myDate)
} else {
    var date = Date()
    val formatter = SimpleDateFormat("MMM dd yyyy HH:mma")
    val myDate: String = formatter.format(date)
    Log.d("Date","DATE : " + myDate)
}

Mẫu định dạng ngày

"yyyy.MM.dd G 'at' HH:mm:ss z" ---- 2001.07.04 AD at 12:08:56 PDT
"hh 'o''clock' a, zzzz" ----------- 12 o'clock PM, Pacific Daylight Time
"EEE, d MMM yyyy HH:mm:ss Z"------- Wed, 4 Jul 2001 12:08:56 -0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"------- 2001-07-04T12:08:56.235-0700
"yyMMddHHmmssZ"-------------------- 010704120856-0700
"K:mm a, z" ----------------------- 0:08 PM, PDT
"h:mm a" -------------------------- 12:08 PM
"EEE, MMM d, ''yy" ---------------- Wed, Jul 4, '01

Cảm ơn vì muốn đóng góp. Bạn có đang đóng góp một cái gì đó chưa có trong 36 câu trả lời trước không? Trong mọi trường hợp, bạn vẫn đang sử dụng SimpleDateFormatlớp lỗi thời nổi tiếng và rắc rối . Ngay cả trước khi Oreo bạn không cần, thay vào đó, bạn có thể sử dụng ThreeTenABP , backport của java.time, API ngày và giờ Java hiện đại.
Ole VV

11

Bạn cũng có thể sử dụng android.os.SystemClock. Ví dụ: SystemClock.elapsedRealtime () sẽ cho bạn đọc thời gian chính xác hơn khi điện thoại đang ngủ.


10

Nếu bạn cần ngày hiện tại:

Calendar cc = Calendar.getInstance();
int year = cc.get(Calendar.YEAR);
int month = cc.get(Calendar.MONTH);
int mDay = cc.get(Calendar.DAY_OF_MONTH);
System.out.println("Date", year + ":" + month + ":" + mDay);

Nếu bạn cần thời gian hiện tại:

 int mHour = cc.get(Calendar.HOUR_OF_DAY);
 int mMinute = cc.get(Calendar.MINUTE);
 System.out.println("time_format" + String.format("%02d:%02d", mHour , mMinute));

9

Đối với định dạng ngày giờ tùy chỉnh:

    SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ",Locale.ENGLISH);
    String cDateTime=dateFormat.format(new Date());

Đầu ra giống như định dạng dưới đây: 2015-06-18T10: 15: 56-05: 00


8
Date todayDate = new Date();
todayDate.getDay();
todayDate.getHours();
todayDate.getMinutes();
todayDate.getMonth();
todayDate.getTime();


8

Bạn có thể có được ngày bằng cách sử dụng:

Time t = new Time(Time.getCurrentTimezone());
t.setToNow();
String date = t.format("%Y/%m/%d");

Điều này sẽ cung cấp cho bạn một kết quả trong một hình thức đẹp, như trong ví dụ này: "2014/02/09".


Hàm tạo không tham số Time t = new Time();sẽ sử dụng múi giờ mặc định. Theo kinh nghiệm của tôi, mặc định == hiện tại.
William T. Mallard

7

Vâng, tôi đã gặp vấn đề với một số câu trả lời của API nên tôi hợp nhất mã này, tôi hy vọng nó phục vụ họ:

    Time t = new Time(Time.getCurrentTimezone());
    t.setToNow();
    String date1 = t.format("%Y/%m/%d");

    Date date = new Date(System.currentTimeMillis());
    SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm aa",
            Locale.ENGLISH);
    String var = dateFormat.format(date);
    String horafecha = var+ " - " + date1;

    tvTime.setText(horafecha);

Đầu ra: 03:25 PM - 2017/10/03


7

Bạn chỉ có thể sử dụng mã sau đây:

 DateFormat df = new SimpleDateFormat("HH:mm"); // Format time
 String time = df.format(Calendar.getInstance().getTime());

 DateFormat df1 = new SimpleDateFormat("yyyy/MM/dd"); // Format date
 String date = df1.format(Calendar.getInstance().getTime());

6

Thử cái này

String mytime = (DateFormat.format("dd-MM-yyyy hh:mm:ss", new java.util.Date()).toString());

Đây là một giải pháp hoàn hảo và thanh lịch. Đó là tất cả những gì cần thiết, không phải là giải pháp dài không cần thiết như trong các câu trả lời khác.
zeeshan

5

Phương pháp bên dưới sẽ trả về ngày và giờ hiện tại trong Chuỗi, Sử dụng múi giờ khác theo múi giờ thực tế của bạn. Tôi đã sử dụng GMT

public static String GetToday(){
    Date presentTime_Date = Calendar.getInstance().getTime();
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
    return dateFormat.format(presentTime_Date);
}

4

Bạn nên sử dụng lớp Calender theo API mới. Ngày lớp không được dùng nữa.

Calendar cal = Calendar.getInstance();

String date = ""+cal.get(Calendar.DATE)+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.YEAR);

String time = ""+cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE);

4

Hãy thử sử dụng mã dưới đây:

 Date date = new Date();
 SimpleDateFormat dateFormatWithZone = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",Locale.getDefault());  
 String currentDate = dateFormatWithZone.format(date);
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.