Chuyển đổi chuỗi Java sang ngày


886

Cách tốt nhất để chuyển đổi một Stringđịnh dạng 'ngày 2 tháng 1 năm 2010' sang DateJava là gì?

Cuối cùng, tôi muốn chia ra tháng, ngày và năm dưới dạng số nguyên để tôi có thể sử dụng

Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();

để chuyển đổi ngày thành thời gian.


15
Lưu ý rằng nhiều câu trả lời bỏ qua sự tinh tế như địa phương và múi giờ. Tôi khuyên bạn nên đọc kỹ tài liệu cho các lớp Date, Lịch, TimeZone, Locale và SimpleDateFormat trước khi sử dụng bất kỳ tài liệu nào trong số chúng.
Kristopher Johnson


7
Java 8 cung cấp API Ngày / Giờ mới. Nếu bạn đang sử dụng Java 8 (hoặc mới hơn), bạn nên xem câu trả lời này: stackoverflow.com/a/22180505/1115554
micha

2
Tất cả các setters của Dateđược phản đối.
Raedwald

5
FYI, người già lớp ngày thời gian phiền hà như java.util.Date, java.util.Calendarjava.text.SimpleTextFormatbây giờ là di sản , thay thế bởi sự java.time lớp. Xem Hướng dẫn của Oracle .
Basil Bourque

Câu trả lời:


1641

Đó là cách khó khăn và các java.util.Datephương thức setter đó đã bị từ chối kể từ Java 1.1 (1997). Đơn giản chỉ cần định dạng ngày bằng cách sử SimpleDateFormatdụng mẫu định dạng khớp với chuỗi đầu vào .

Trong trường hợp cụ thể của bạn là "ngày 2 tháng 1 năm 2010" làm chuỗi đầu vào:

  1. "Tháng một" là tháng toàn văn, vì vậy hãy sử dụng MMMMmẫu cho nó
  2. "2" là ngày ngắn trong tháng, vì vậy hãy sử dụng dmẫu cho nó.
  3. "2010" là năm có 4 chữ số, vì vậy hãy sử dụng yyyymẫu cho nó.

String string = "January 2, 2010";
DateFormat format = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH);
Date date = format.parse(string);
System.out.println(date); // Sat Jan 02 00:00:00 GMT 2010

Lưu ý tầm quan trọng của các Localeđối số rõ ràng . Nếu bạn bỏ qua nó, thì nó sẽ sử dụng ngôn ngữ mặc định không nhất thiết phải là tiếng Anh như được sử dụng trong tên tháng của chuỗi đầu vào. Nếu miền địa phương không khớp với chuỗi đầu vào, thì bạn sẽ nhận được một cách khó hiểu java.text.ParseExceptionngay cả khi mẫu định dạng có vẻ hợp lệ.

Đây là một trích xuất liên quan từ javadoc , liệt kê tất cả các mẫu định dạng có sẵn:

Letter  Date or Time Component  Presentation        Examples
------  ----------------------  ------------------  -------------------------------------
G       Era designator          Text                AD
y       Year                    Year                1996; 96
Y       Week year               Year                2009; 09
M/L     Month in year           Month               July; Jul; 07
w       Week in year            Number              27
W       Week in month           Number              2
D       Day in year             Number              189
d       Day in month            Number              10
F       Day of week in month    Number              2
E       Day in week             Text                Tuesday; Tue
u       Day number of week      Number              1
a       Am/pm marker            Text                PM
H       Hour in day (0-23)      Number              0
k       Hour in day (1-24)      Number              24
K       Hour in am/pm (0-11)    Number              0
h       Hour in am/pm (1-12)    Number              12
m       Minute in hour          Number              30
s       Second in minute        Number              55
S       Millisecond             Number              978
z       Time zone               General time zone   Pacific Standard Time; PST; GMT-08:00
Z       Time zone               RFC 822 time zone   -0800
X       Time zone               ISO 8601 time zone  -08; -0800; -08:00

Lưu ý rằng các mẫu có phân biệt chữ hoa chữ thường và các mẫu dựa trên văn bản có bốn ký tự trở lên thể hiện dạng đầy đủ; mặt khác, một hình thức ngắn hoặc viết tắt được sử dụng nếu có sẵn. Vì vậy, ví dụ MMMMMhoặc nhiều hơn là không cần thiết.

Dưới đây là một số ví dụ về SimpleDateFormatcác mẫu hợp lệ để phân tích một chuỗi đã cho đến ngày:

Input string                            Pattern
------------------------------------    ----------------------------
2001.07.04 AD at 12:08:56 PDT           yyyy.MM.dd G 'at' HH:mm:ss z
Wed, Jul 4, '01                         EEE, MMM d, ''yy
12:08 PM                                h:mm a
12 o'clock PM, Pacific Daylight Time    hh 'o''clock' a, zzzz
0:08 PM, PDT                            K:mm a, z
02001.July.04 AD 12:08 PM               yyyyy.MMMM.dd GGG hh:mm aaa
Wed, 4 Jul 2001 12:08:56 -0700          EEE, d MMM yyyy HH:mm:ss Z
010704120856-0700                       yyMMddHHmmssZ
2001-07-04T12:08:56.235-0700            yyyy-MM-dd'T'HH:mm:ss.SSSZ
2001-07-04T12:08:56.235-07:00           yyyy-MM-dd'T'HH:mm:ss.SSSXXX
2001-W27-3                              YYYY-'W'ww-u

Một lưu ý quan trọng SimpleDateFormatkhông phải là chủ đề an toàn. Nói cách khác, bạn không bao giờ nên khai báo và gán nó dưới dạng biến tĩnh hoặc thể hiện và sau đó sử dụng lại từ các phương thức / luồng khác nhau. Bạn phải luôn tạo nó hoàn toàn mới trong phạm vi cục bộ của phương thức.


Cập nhật Java 8

Nếu bạn tình cờ có trên Java 8 hoặc mới hơn, thì hãy sử dụng DateTimeFormatter(cũng ở đây, nhấp vào liên kết để xem tất cả các trình định dạng được xác định trước và các mẫu định dạng có sẵn; hướng dẫn có sẵn ở đây ). API mới này được lấy cảm hứng từ JodaTime .

String string = "January 2, 2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(string, formatter);
System.out.println(date); // 2010-01-02

Lưu ý: nếu mẫu định dạng của bạn cũng có chứa phần thời gian, thì hãy sử dụng LocalDateTime#parse(text, formatter)thay vì LocalDate#parse(text, formatter). Và, nếu mẫu định dạng của bạn cũng có chứa múi giờ, thì hãy sử dụng ZonedDateTime#parse(text, formatter)thay thế.

Đây là một trích xuất liên quan từ javadoc , liệt kê tất cả các mẫu định dạng có sẵn:

Symbol  Meaning                     Presentation  Examples
------  --------------------------  ------------  ----------------------------------------------
G       era                         text          AD; Anno Domini; A
u       year                        year          2004; 04
y       year-of-era                 year          2004; 04
D       day-of-year                 number        189
M/L     month-of-year               number/text   7; 07; Jul; July; J
d       day-of-month                number        10

Q/q     quarter-of-year             number/text   3; 03; Q3; 3rd quarter
Y       week-based-year             year          1996; 96
w       week-of-week-based-year     number        27
W       week-of-month               number        4
E       day-of-week                 text          Tue; Tuesday; T
e/c     localized day-of-week       number/text   2; 02; Tue; Tuesday; T
F       week-of-month               number        3

a       am-pm-of-day                text          PM
h       clock-hour-of-am-pm (1-12)  number        12
K       hour-of-am-pm (0-11)        number        0
k       clock-hour-of-am-pm (1-24)  number        0

H       hour-of-day (0-23)          number        0
m       minute-of-hour              number        30
s       second-of-minute            number        55
S       fraction-of-second          fraction      978
A       milli-of-day                number        1234
n       nano-of-second              number        987654321
N       nano-of-day                 number        1234000000

V       time-zone ID                zone-id       America/Los_Angeles; Z; -08:30
z       time-zone name              zone-name     Pacific Standard Time; PST
O       localized zone-offset       offset-O      GMT+8; GMT+08:00; UTC-08:00;
X       zone-offset 'Z' for zero    offset-X      Z; -08; -0830; -08:30; -083015; -08:30:15;
x       zone-offset                 offset-x      +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z       zone-offset                 offset-Z      +0000; -0800; -08:00;

Xin lưu ý rằng nó có một số trình định dạng được xác định trước cho các mẫu phổ biến hơn. Vì vậy, thay vì ví dụ DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss Z", Locale.ENGLISH);, bạn có thể sử dụng DateTimeFormatter.RFC_1123_DATE_TIME. Điều này là có thể bởi vì chúng trái lại SimpleDateFormat, chủ đề an toàn. Do đó, bạn cũng có thể xác định của riêng bạn, nếu cần thiết.

Đối với định dạng chuỗi đầu vào cụ thể, bạn không cần sử dụng một định nghĩa rõ ràng DateTimeFormatter: ngày ISO 8601 tiêu chuẩn , như 2016-09-26T17: 44: 57Z, có thể được phân tích cú pháp trực tiếp LocalDateTime#parse(text)vì nó đã sử dụng trình ISO_LOCAL_DATE_TIMEđịnh dạng. Tương tự, LocalDate#parse(text)phân tích một ngày ISO mà không có thành phần thời gian (xem ISO_LOCAL_DATE) và ZonedDateTime#parse(text)phân tích một ngày ISO với phần bù và múi giờ được thêm vào (xem ISO_ZONED_DATE_TIME).


Xin chào, trong tùy chọn O, làm thế nào để cho nó in UTC+08:00thay vì GMT+08:00. Tôi không thể lấy bất kỳ ví dụ nào.
theGamblerRises

Có nhiều cách để phân tích ngày, đây là các trường hợp sử dụng khác nhau của DateFormat.parse
drorw

Xin chào BalusC, tôi có một chuỗi 20-JUN-16 12.00.00.000000000 AM, cần trợ giúp để chuyển đổi chuỗi này thành Ngày. Sự giúp đỡ của bạn được đánh giá rất cao!!
mannedear

@mnedear oh xin lỗi .. đó là sai lầm của tôi. Dù sao tôi đã có câu trả lời bạn có thể xem nó ở đây: stackoverflow.com/questions/50982310/
Khăn

74

À đúng rồi, cuộc thảo luận Ngày Java, một lần nữa. Để đối phó với thao tác ngày , chúng tôi sử dụng Ngày , Lịch , GregorianCalWikiSimpleDateFormat . Ví dụ: sử dụng ngày tháng 1 của bạn làm đầu vào:

Calendar mydate = new GregorianCalendar();
String mystring = "January 2, 2010";
Date thedate = new SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH).parse(mystring);
mydate.setTime(thedate);
//breakdown
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));

Sau đó, bạn có thể thao tác điều đó với một cái gì đó như:

Calendar now = Calendar.getInstance();
mydate.set(Calendar.YEAR,2009);
mydate.set(Calendar.MONTH,Calendar.FEBRUARY);
mydate.set(Calendar.DAY_OF_MONTH,25);
mydate.set(Calendar.HOUR_OF_DAY,now.get(Calendar.HOUR_OF_DAY));
mydate.set(Calendar.MINUTE,now.get(Calendar.MINUTE));
mydate.set(Calendar.SECOND,now.get(Calendar.SECOND));
// or with one statement
//mydate.set(2009, Calendar.FEBRUARY, 25, now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE), now.get(Calendar.SECOND));
System.out.println("mydate -> "+mydate);
System.out.println("year   -> "+mydate.get(Calendar.YEAR));
System.out.println("month  -> "+mydate.get(Calendar.MONTH));
System.out.println("dom    -> "+mydate.get(Calendar.DAY_OF_MONTH));
System.out.println("dow    -> "+mydate.get(Calendar.DAY_OF_WEEK));
System.out.println("hour   -> "+mydate.get(Calendar.HOUR));
System.out.println("minute -> "+mydate.get(Calendar.MINUTE));
System.out.println("second -> "+mydate.get(Calendar.SECOND));
System.out.println("milli  -> "+mydate.get(Calendar.MILLISECOND));
System.out.println("ampm   -> "+mydate.get(Calendar.AM_PM));
System.out.println("hod    -> "+mydate.get(Calendar.HOUR_OF_DAY));

17
Đừng quên rằng tháng 1 là số tháng ... 0
Nicolas Zozol

50
String str_date = "11-June-07";
DateFormat formatter;
Date date;
formatter = new SimpleDateFormat("dd-MMM-yy");
date = formatter.parse(str_date);

13
Mục đích của việc tách các khai báo và định nghĩa (mặc dù không được thực hiện cho biến đầu tiên) là gì?
Peter Mortensen

43

Với Java 8, chúng tôi nhận được API Ngày / Giờ mới ( JSR 310 ).

Cách sau đây có thể được sử dụng để phân tích ngày trong Java 8 mà không cần dựa vào Joda-Time :

 String str = "January 2nd, 2010";

// if we 2nd even we have changed in pattern also it is not working please workout with 2nd 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM Q, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(str, formatter);

// access date fields
int year = date.getYear(); // 2010
int day = date.getDayOfMonth(); // 2
Month month = date.getMonth(); // JANUARY
int monthAsInt = month.getValue(); // 1

LocalDate là lớp Java 8 tiêu chuẩn để biểu thị một ngày (không có thời gian). Nếu bạn muốn phân tích các giá trị có chứa thông tin ngày và thời gian, bạn nên sử dụng LocalDateTime . Đối với các giá trị có múi giờ, hãy sử dụng ZencedDateTime . Cả hai đều cung cấp một parse()phương thức tương tự như LocalDate:

LocalDateTime dateWithTime = LocalDateTime.parse(strWithDateAndTime, dateTimeFormatter);
ZonedDateTime zoned = ZonedDateTime.parse(strWithTimeZone, zoneFormatter);

Danh sách các ký tự định dạng từ DateTimeFormatter Javadoc :

All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters. 
The following pattern letters are defined:

Symbol  Meaning                     Presentation      Examples
------  -------                     ------------      -------
 G       era                         text              AD; Anno Domini; A
 u       year                        year              2004; 04
 y       year-of-era                 year              2004; 04
 D       day-of-year                 number            189
 M/L     month-of-year               number/text       7; 07; Jul; July; J
 d       day-of-month                number            10

 Q/q     quarter-of-year             number/text       3; 03; Q3; 3rd quarter
 Y       week-based-year             year              1996; 96
 w       week-of-week-based-year     number            27
 W       week-of-month               number            4
 E       day-of-week                 text              Tue; Tuesday; T
 e/c     localized day-of-week       number/text       2; 02; Tue; Tuesday; T
 F       week-of-month               number            3

 a       am-pm-of-day                text              PM
 h       clock-hour-of-am-pm (1-12)  number            12
 K       hour-of-am-pm (0-11)        number            0
 k       clock-hour-of-am-pm (1-24)  number            0

 H       hour-of-day (0-23)          number            0
 m       minute-of-hour              number            30
 s       second-of-minute            number            55
 S       fraction-of-second          fraction          978
 A       milli-of-day                number            1234
 n       nano-of-second              number            987654321
 N       nano-of-day                 number            1234000000

 V       time-zone ID                zone-id           America/Los_Angeles; Z; -08:30
 z       time-zone name              zone-name         Pacific Standard Time; PST
 O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;
 X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
 x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
 Z       zone-offset                 offset-Z          +0000; -0800; -08:00;

Làm thế nào cảm nhận công việc của phần thứ hai? Nếu tôi sử dụng LocalDateTime date = LocalDateTime.parse ("20140920111713000", Mẫu DateTimeFormatter.of‌ ("yyyyMMddHHm‌ mssSSS")); nó không thành công nhưng nếu tôi sử dụng LocalDateTime date = LocalDateTime.parse ("20140920111713.000", DateTimeFormatter.o‌ fPotype ("yyyyMMddHH‌ mmss.SSS")); nó hoạt động
reos

27

Trong khi một số câu trả lời là đúng về mặt kỹ thuật, chúng không được khuyến khích.

  • Các lớp java.util.Date & Lịch nổi tiếng là rắc rối. Vì những sai sót trong thiết kế và thực hiện, hãy tránh chúng. May mắn thay, chúng tôi có hai lựa chọn thư viện thời gian tuyệt vời khác:
    • Joda-Time
      Thư viện miễn phí mã nguồn mở phổ biến này có thể được sử dụng trên một số phiên bản Java. Nhiều ví dụ về việc sử dụng nó có thể được tìm thấy trên StackOverflow. Đọc một số trong số này sẽ giúp bạn tăng tốc nhanh chóng.
    • java.time. * gói
      này bộ mới của lớp học được lấy cảm hứng từ Joda thời gian và xác định bởi JSR 310. Những lớp học được xây dựng vào Java 8. Một dự án đang được tiến hành để backport các lớp Java 7, nhưng backporting mà không được hỗ trợ bởi Oracle.
  • Như Kristopher Johnson đã lưu ý chính xác trong nhận xét của mình về câu hỏi, các câu trả lời khác bỏ qua các vấn đề quan trọng của:
    • Thời gian trong ngày
      Ngày có cả phần ngày và phần thời gian trong ngày)
    • Múi giờ Thời gian
      bắt đầu một ngày phụ thuộc vào múi giờ. Nếu bạn không chỉ định múi giờ, múi giờ mặc định của JVM sẽ được áp dụng. Điều đó có nghĩa là hành vi của mã của bạn có thể thay đổi khi chạy trên các máy tính khác hoặc với cài đặt múi giờ được sửa đổi. Có lẽ không phải là những gì bạn muốn.
    • Locale
      xác định Locale của ngôn ngữ như thế nào để giải thích các từ (tên của tháng và ngày) gặp phải trong phân tích cú pháp. (Câu trả lời của BalusC xử lý vấn đề này một cách chính xác.) Ngoài ra, Địa điểm ảnh hưởng đến đầu ra của một số trình định dạng khi tạo một chuỗi đại diện cho thời gian ngày của bạn.

Joda-Thời gian

Một vài lưu ý về Joda-Time theo sau.

Múi giờ

Trong Joda-Time , một đối tượng DateTime thực sự biết múi giờ được chỉ định của chính nó. Điều này tương phản với lớp java.util.Date dường như có múi giờ nhưng không.

Lưu ý trong mã ví dụ bên dưới cách chúng ta chuyển một đối tượng múi giờ cho trình định dạng để phân tích chuỗi. Múi giờ đó được sử dụng để giải thích thời gian đó là đã xảy ra trong múi giờ đó. Vì vậy, bạn cần phải suy nghĩ và xác định múi giờ được biểu thị bằng chuỗi đầu vào đó.

Vì bạn không có phần thời gian trong chuỗi đầu vào của mình, Joda-Time chỉ định thời điểm đầu tiên trong ngày của múi giờ được chỉ định là thời gian trong ngày. Thông thường, điều này có nghĩa 00:00:00nhưng không phải lúc nào cũng vì Thời gian tiết kiệm ánh sáng ban ngày (DST) hoặc các bất thường khác. Nhân tiện, bạn có thể làm tương tự với bất kỳ trường hợp DateTime nào bằng cách gọi withTimeAtStartOfDay.

Mẫu định dạng

Các ký tự được sử dụng trong mẫu của trình định dạng tương tự trong Joda-Time với các ký tự trong java.util.Date/CalWiki nhưng không hoàn toàn giống nhau. Đọc kỹ tài liệu.

Bất biến

Chúng tôi thường sử dụng các lớp bất biến trong Joda-Time. Thay vì sửa đổi một đối tượng Thời gian hiện tại, chúng tôi gọi các phương thức tạo một thể hiện mới dựa trên đối tượng khác với hầu hết các khía cạnh được sao chép trừ khi có sự thay đổi mong muốn. Một ví dụ là cuộc gọi đến withZonedòng cuối cùng bên dưới. Tính không thay đổi giúp làm cho Joda-Time rất an toàn cho chủ đề, và cũng có thể làm cho một số công việc rõ ràng hơn.

Chuyển đổi

Bạn sẽ cần các đối tượng java.util.Date để sử dụng với các lớp / khung khác mà không biết về các đối tượng Joda-Time. May mắn thay, nó rất dễ dàng để di chuyển qua lại.

Chuyển từ một đối tượng java.util.Date (có tên ở đây date) sang Joda-Time DateTime

org.joda.time.DateTime dateTime = new DateTime( date, timeZone );

Đi theo hướng khác từ Joda-Time đến một đối tượng java.util.Date

java.util.Date date = dateTime.toDate();

Mã mẫu

String input = "January 2, 2010";

java.util.Locale locale = java.util.Locale.US;
DateTimeZone timeZone = DateTimeZone.forID( "Pacific/Honolulu" ); // Arbitrarily chosen for example.
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MMMM d, yyyy" ).withZone( timeZone ).withLocale( locale );
DateTime dateTime = formatter.parseDateTime( input );

System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime in UTC/GMT: " + dateTime.withZone( DateTimeZone.UTC ) );

Khi chạy đào

dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z

20

Trong khi xử lý lớp SimpleDateFormat, điều quan trọng cần nhớ là Ngày không an toàn cho chuỗi và bạn không thể chia sẻ một đối tượng Ngày duy nhất với nhiều luồng.

Ngoài ra, có sự khác biệt lớn giữa "m" và "M" trong đó trường hợp nhỏ được sử dụng trong vài phút và trường hợp vốn được sử dụng trong tháng. Tương tự với "d" và "D". Điều này có thể gây ra các lỗi tinh vi thường bị bỏ qua. Xem Javadoc hoặc Hướng dẫn chuyển đổi chuỗi thành ngày trong Java để biết thêm chi tiết.


1
Sự khác biệt m / M này khiến tôi mất 5 phút thất vọng, cảm ơn vì đã chỉ ra :)
Buffalo

Tôi ngạc nhiên không ai khác đề cập đến điều này. Sử dụng SimpleDateFormat trong các ứng dụng Web (hoặc bất kỳ ứng dụng đa luồng nào khác) là một điều không nên. Cho đến Java 7, tôi đã sử dụng "FastDateFormat".
JackLThornton

18
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date;
try {
    date = dateFormat.parse("2013-12-4");
    System.out.println(date.toString()); // Wed Dec 04 00:00:00 CST 2013

    String output = dateFormat.format(date);
    System.out.println(output); // 2013-12-04
} 
catch (ParseException e) {
    e.printStackTrace();
}

Việc này ổn với tôi.


5
Điều này sẽ trở lại vào Thứ Tư 04:00 00:00 GST 2013 với tư cách là đầu ra không phải 2013-12-04
Shams

nên được gói trong một thử / bắt
ParseException

Điều này sẽ không trả lại giá trị như mong đợi. Vui lòng kiểm tra trước khi tư vấn
lifemoveon

7

Bạn có thể sử dụng SimpleDateformat để thay đổi chuỗi ngày

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String strDate = "2000-01-01";
Date date = new Date(sdf.parse(strDate).getTime());


1
Phương thức phân tích SimpleDateFormat trả về một đối tượng ngày. Vậy thì tại sao lại dùng Date constructor?
nespapu

6

Ngoài ra, SimpleDateFormat không khả dụng với một số công nghệ phía máy khách, như GWT .

Đó là một ý tưởng hay để sử dụng Calendar.getInstance () và yêu cầu của bạn là so sánh hai ngày; đi hẹn hò lâu


6

Hai định dạng đơn giản chúng ta đã sử dụng:

  1. Chúng ta muốn định dạng ngày nào?
  2. Ngày định dạng nào thực sự có mặt?

Chúng tôi phân tích cú pháp định dạng ngày đầy đủ theo thời gian:

date="2016-05-06 16:40:32";

public static String setDateParsing(String date) throws ParseException {

    // This is the format date we want
    DateFormat mSDF = new SimpleDateFormat("hh:mm a");

    // This format date is actually present
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-mm-dd hh:mm");
    return mSDF.format(formatter.parse(date));
}

5

Chương trình kiểm tra khiêm tốn của tôi. Tôi sử dụng nó để chơi xung quanh với trình định dạng và tìm kiếm ngày dài mà tôi tìm thấy trong các tệp nhật ký (nhưng ai đã đặt chúng ở đó ...).

Chương trình thử nghiệm của tôi:

package be.test.package.time;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

public class TimeWork {

    public static void main(String[] args) {    

        TimeZone timezone = TimeZone.getTimeZone("UTC");

        List<Long> longs = new ArrayList<>();
        List<String> strings = new ArrayList<>();

        //Formatting a date needs a timezone - otherwise the date get formatted to your system time zone.
        //Use 24h format HH. In 12h format hh can be in range 0-11, which makes 12 overflow to 0.
        DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss.SSS");
        formatter.setTimeZone(timezone);

        Date now = new Date();

        //Test dates
        strings.add(formatter.format(now));
        strings.add("01-01-1970 00:00:00.000");
        strings.add("01-01-1970 00:00:01.000");
        strings.add("01-01-1970 00:01:00.000");
        strings.add("01-01-1970 01:00:00.000");
        strings.add("01-01-1970 10:00:00.000");
        strings.add("01-01-1970 12:00:00.000");
        strings.add("01-01-1970 24:00:00.000");
        strings.add("02-01-1970 00:00:00.000");
        strings.add("01-01-1971 00:00:00.000");
        strings.add("01-01-2014 00:00:00.000");
        strings.add("31-12-1969 23:59:59.000");
        strings.add("31-12-1969 23:59:00.000");
        strings.add("31-12-1969 23:00:00.000");

        //Test data
        longs.add(now.getTime());
        longs.add(-1L);
        longs.add(0L); //Long date presentation at - midnight 1/1/1970 UTC - The timezone is important!
        longs.add(1L);
        longs.add(1000L);
        longs.add(60000L);
        longs.add(3600000L);
        longs.add(36000000L);
        longs.add(43200000L);
        longs.add(86400000L);
        longs.add(31536000000L);
        longs.add(1388534400000L);
        longs.add(7260000L);
        longs.add(1417706084037L);
        longs.add(-7260000L);

        System.out.println("===== String to long =====");

        //Show the long value of the date
        for (String string: strings) {
            try {
                Date date = formatter.parse(string);
                System.out.println("Formated date : " + string + " = Long = " + date.getTime());
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }

        System.out.println("===== Long to String =====");

        //Show the date behind the long
        for (Long lo : longs) {
            Date date = new Date(lo);
            String string = formatter.format(date);
            System.out.println("Formated date : " + string + " = Long = " + lo);        
        }
    }
}

Kết quả kiểm tra:

===== String to long =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 01-01-1970 24:00:00.000 = Long = 86400000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 31-12-1969 23:59:59.000 = Long = -1000
Formated date : 31-12-1969 23:59:00.000 = Long = -60000
Formated date : 31-12-1969 23:00:00.000 = Long = -3600000
===== Long to String =====
Formated date : 05-12-2014 10:17:34.873 = Long = 1417774654873
Formated date : 31-12-1969 23:59:59.999 = Long = -1
Formated date : 01-01-1970 00:00:00.000 = Long = 0
Formated date : 01-01-1970 00:00:00.001 = Long = 1
Formated date : 01-01-1970 00:00:01.000 = Long = 1000
Formated date : 01-01-1970 00:01:00.000 = Long = 60000
Formated date : 01-01-1970 01:00:00.000 = Long = 3600000
Formated date : 01-01-1970 10:00:00.000 = Long = 36000000
Formated date : 01-01-1970 12:00:00.000 = Long = 43200000
Formated date : 02-01-1970 00:00:00.000 = Long = 86400000
Formated date : 01-01-1971 00:00:00.000 = Long = 31536000000
Formated date : 01-01-2014 00:00:00.000 = Long = 1388534400000
Formated date : 01-01-1970 02:01:00.000 = Long = 7260000
Formated date : 04-12-2014 15:14:44.037 = Long = 1417706084037
Formated date : 31-12-1969 21:59:00.000 = Long = -7260000

2

Liên kết nguồn

Dành cho Android

Lịch.getInstance (). GetTime () cung cấp cho

Thu Jul 26 15:54:13 GMT+05:30 2018

Sử dụng

String oldDate = "Thu Jul 26 15:54:13 GMT+05:30 2018";
DateFormat format = new SimpleDateFormat("EEE LLL dd HH:mm:ss Z yyyy");
Date updateLast = format.parse(oldDate);

0

Chuyển đổi chuỗi thành ngày:

private Date StringtoDate(String date) throws Exception {
            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
            java.sql.Date sqlDate = null;
            if( !date.isEmpty()) {

                try {
                    java.util.Date normalDate = sdf1.parse(date);
                    sqlDate = new java.sql.Date(normalDate.getTime());
                } catch (ParseException e) {
                    throw new Exception("Not able to Parse the date", e);
                }
            }
            return sqlDate;
        }

-1

Thử cái này

String date = get_pump_data.getString("bond_end_date");
DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date datee = (Date)format.parse(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.