2010-08-12 36 views

Trả lời

109

Làm thế nào để chuyển đổi từ một định dạng ngày tháng khác sử dụng SimpleDateFormat:

final String OLD_FORMAT = "dd/MM/yyyy"; 
final String NEW_FORMAT = "yyyy/MM/dd"; 

// August 12, 2010 
String oldDateString = "12/08/2010"; 
String newDateString; 

SimpleDateFormat sdf = new SimpleDateFormat(OLD_FORMAT); 
Date d = sdf.parse(oldDateString); 
sdf.applyPattern(NEW_FORMAT); 
newDateString = sdf.format(d); 
+1

FYI, các lớp ngày giờ phiền hà cũ như ['java.util.Date'] (https://docs.oracle.com/ javase/8/docs/api/java/util/Date.html), ['java.util.Calendar'] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar .html) và 'java.text.SimpleTextFormat' hiện là [legacy] (https://en.wikipedia.org/wiki/Legacy_system), được thay thế bởi [java.time] (https://docs.oracle. các lớp com/javase/8/docs/api/java/time/package-summary.html). Xem [Hướng dẫn của Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

9

Sử dụng SimpleDateFormat

String DATE_FORMAT = "yyyy/MM/dd"; 
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); 
    System.out.println("Formated Date " + sdf.format(date)); 

Ví dụ Complete:

import java.text.SimpleDateFormat; 
import java.util.Date; 

public class JavaSimpleDateFormatExample { 
    public static void main(String args[]) { 
     // Create Date object. 
     Date date = new Date(); 
     // Specify the desired date format 
     String DATE_FORMAT = "yyyy/MM/dd"; 
     // Create object of SimpleDateFormat and pass the desired date format. 
     SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT); 
     /* 
     * Use format method of SimpleDateFormat class to format the date. 
     */ 
     System.out.println("Today is " + sdf.format(date)); 
    } 
} 
+0

tôi có thể vượt qua chuỗi cho đến nay không ?? – rasi

26
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); 
sdf.format(new Date()); 

này nên làm các trick

+0

tôi có một chuỗi trong định dạng 'dd/MM/yyyy' làm cách nào tôi có thể chuyển đổi – rasi

1

Hoặc bạn có thể đi các tuyến đường regex:

String date = "10/07/2010"; 
String newDate = date.replaceAll("(\\d+)/(\\d+)/(\\d+)", "$3/$2/$1"); 
System.out.println(newDate); 

Nó hoạt động cả hai cách quá. Tất nhiên điều này sẽ không thực sự xác nhận ngày của bạn và cũng sẽ làm việc cho các chuỗi như "21432/32423/52352". Bạn có thể sử dụng "(\\d{2})/(\\d{2})/(\\d{4}" để chính xác hơn về số chữ số trong mỗi nhóm, nhưng nó sẽ chỉ hoạt động từ dd/MM/yyyy sang yyyy/MM/dd chứ không phải theo cách khác nữa (và vẫn chấp nhận số không hợp lệ trong đó 45). Và nếu bạn cho nó một cái gì đó không hợp lệ như "blabla" nó sẽ chỉ trả lại cùng một điều trở lại.

+3

Bây giờ bạn có hai vấn đề. ;-) –

3
SimpleDateFormat newDateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
Date myDate = newDateFormat.parse("28/12/2013"); 
newDateFormat.applyPattern("yyyy/MM/dd") 
String myDateString = newDateFormat.format(myDate); 

Bây giờ MyDate = 2013/12/28

7

tl; dr

LocalDate.parse( 
    "23/01/2017" , 
    DateTimeFormatter.ofPattern("dd/MM/uuuu" , Locale.UK) 
).format(
    DateTimeFormatter.ofPattern("uuuu/MM/dd" , Locale.UK) 
) 

2017/01/23

Tránh thừa lớp ngày thời gian

answer by Christopher Parker là chính xác nhưng đã lỗi thời. Các lớp ngày giờ phiền hà cũ như java.util.Date, java.util.Calendarjava.text.SimpleTextFormat hiện là legacy, được thay thế bởi các lớp java.time.

Sử dụng java.time

Phân tích chuỗi đầu vào làm đối tượng ngày giờ, sau đó tạo đối tượng Chuỗi mới theo định dạng mong muốn.

Lớp LocalDate đại diện cho giá trị chỉ có ngày không có thời gian trong ngày và không có múi giờ.

DateTimeFormatter fIn = DateTimeFormatter.ofPattern("dd/MM/uuuu" , Locale.UK); // As a habit, specify the desired/expected locale, though in this case the locale is irrelevant. 
LocalDate ld = LocalDate.parse("23/01/2017" , fIn); 

Xác định trình định dạng khác cho đầu ra.

DateTimeFormatter fOut = DateTimeFormatter.ofPattern("uuuu/MM/dd" , Locale.UK); 
String output = ld.format(fOut); 

2017/01/23

Bằng cách này, xem xét sử dụng tiêu chuẩn định dạng ISO 8601 cho chuỗi đại diện cho các giá trị ngày thời gian.


Về java.time

Khung java.time được xây dựng vào Java 8 và sau đó. Các lớp này thay thế các lớp học ngày giờ legacy phiền hà cũ như java.util.Date, Calendar, & SimpleDateFormat.

Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển đến các lớp java.time.

Để tìm hiểu thêm, hãy xem Oracle Tutorial. 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.

Nơi lấy các lớp java.time?

Dự án mở rộng ThreeTen-Extra java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho những bổ sung có thể có trong tương lai vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval, YearWeek, YearQuartermore.


Joda thời gian

UPDATE: Dự án Joda-Time hiện đang ở maintenance mode, với đội ngũ tư vấn chuyển đổi sang các java.time lớp. Phần này ở đây để lại vì lợi ích của lịch sử.

Để giải trí, đây là mã của anh ấy được điều chỉnh để sử dụng thư viện Joda-Time.

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so. 
// import org.joda.time.*; 
// import org.joda.time.format.*; 

final String OLD_FORMAT = "dd/MM/yyyy"; 
final String NEW_FORMAT = "yyyy/MM/dd"; 

// August 12, 2010 
String oldDateString = "12/08/2010"; 
String newDateString; 

DateTimeFormatter formatterOld = DateTimeFormat.forPattern(OLD_FORMAT); 
DateTimeFormatter formatterNew = DateTimeFormat.forPattern(NEW_FORMAT); 
LocalDate localDate = formatterOld.parseLocalDate(oldDateString); 
newDateString = formatterNew.print(localDate); 

Dump để an ủi ...

System.out.println("localDate: " + localDate); 
System.out.println("newDateString: " + newDateString); 

Khi chạy ...

localDate: 2010-08-12 
newDateString: 2010/08/12 
-1
SimpleDateFormat format1 = new SimpleDateFormat("yyyy/MM/dd"); 
System.out.println(format1.format(date)); 
1

nhiều cách để thay đổi định dạng ngày

private final String dateTimeFormatPattern = "yyyy/MM/dd"; 
private final Date now = new Date(); 

final DateFormat format = new SimpleDateFormat(dateTimeFormatPattern); 
final String nowString = format.format(now); 

final Instant instant = now.toInstant(); 
final DateTimeFormatter formatter = 
     DateTimeFormatter.ofPattern( 
     dateTimeFormatPattern).withZone(ZoneId.systemDefault()); 
final String formattedInstance = formatter.format(instant); 

    /* Java 8 needed*/ 
    LocalDate date = LocalDate.now(); 
    String text = date.format(formatter); 
    LocalDate parsedDate = LocalDate.parse(text, formatter); 
0

Để thay đổi định dạng của ngày bạn có yêu cầu cả hai định dạng nhìn bên dưới.

String stringdate1 = "28/04/2010"; 

try { 

    SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy"); 
    Date date1 = format1.parse() 
    SimpleDateFormat format2 = new SimpleDateFormat("yyyy/MM/dd"); 

    String stringdate2 = format2.format(date1); 
    } catch (ParseException e) { 
    e.printStackTrace(); 
} 

đây stringdate2 có định dạng ngày yyyy/MM/dd. và nó chứa 2010/04/28.

2

Đây chỉ là Christopher Parker answer thích nghi để sử dụng lớp mới từ Java 8:

final DateTimeFormatter OLD_FORMATTER = DateTimeFormatter.ofPattern("dd/MM/yyyy"); 
final DateTimeFormatter NEW_FORMATTER = DateTimeFormatter.ofPattern("yyyy/MM/dd"); 

String oldString = "26/07/2017"; 
LocalDate date = LocalDate.parse(oldString, OLD_FORMATTER); 
String newString = date.format(NEW_FORMATTER); 

1 tốt, không phải là mới nữa, Java 9 nên được phát hành sớm.

Các vấn đề liên quan