Thay đổi định dạng ngày trong chuỗi Java


465

Tôi là một Stringđại diện cho một ngày.

String date_s = "2011-01-18 00:00:00.0";

Tôi muốn chuyển đổi nó thành một Datevà xuất nó ở YYYY-MM-DDđịnh dạng.

2011-01-18

Làm thế nào tôi có thể đạt được điều này?


Được rồi, dựa trên các câu trả lời tôi đã lấy bên dưới, đây là điều tôi đã thử:

String date_s = " 2011-01-18 00:00:00.0"; 
SimpleDateFormat dt = new SimpleDateFormat("yyyyy-mm-dd hh:mm:ss"); 
Date date = dt.parse(date_s); 
SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");
System.out.println(dt1.format(date));

Nhưng nó đầu ra 02011-00-1thay vì mong muốn 2011-01-18. Tôi đang làm gì sai?


163
yyyyy không giống như yyyy. :)
Hovercraft Full Of Eels

2
Một câu hỏi boomerang. Trường hợp sử dụng của bạn là gì? Bởi vì có thể bạn nên sử dụng các mẫu dựng sẵn (DateFormat.getDateTimeInstance ()).
Paweł Dyda

11
Tháng được biểu thị bằng MM trong chuỗi định dạng, không phải bằng mm như trong các ví dụ ở trên. mm có nghĩa là phút.
Mike

3
Tôi đã đổi yyyy-mm-dd thành yyyy-MM-dd, vì phiên bản ban đầu không hoạt động
Pavlo Zvarych

Câu trả lời:


506

Sử dụng LocalDateTime#parse()(hoặc ZonedDateTime#parse()nếu chuỗi xảy ra để chứa một phần múi giờ) để phân tích một mẫu Stringtrong một mẫu nhất định thành một LocalDateTime.

String oldstring = "2011-01-18 00:00:00.0";
LocalDateTime datetime = LocalDateTime.parse(oldstring, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"));

Sử dụng LocalDateTime#format()(hoặc ZonedDateTime#format()) để định dạng a LocalDateTimethành một Stringmẫu nhất định.

String newstring = datetime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(newstring); // 2011-01-18

Hoặc , khi bạn chưa có trên Java 8, hãy sử dụng SimpleDateFormat#parse()để phân tích một Stringmẫu theo một mẫu nhất định thành một Date.

String oldstring = "2011-01-18 00:00:00.0";
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S").parse(oldstring);

Sử dụng SimpleDateFormat#format()để định dạng a Datethành một Stringtrong một mẫu nhất định.

String newstring = new SimpleDateFormat("yyyy-MM-dd").format(date);
System.out.println(newstring); // 2011-01-18

Xem thêm:


Cập nhật : theo nỗ lực thất bại của bạn: các mẫu có phân biệt chữ hoa chữ thường . Đọc java.text.SimpleDateFormatjavadoc những gì các phần riêng lẻ đại diện cho. Vì vậy, ví dụ Mcho tháng và mtrong vài phút. Ngoài ra, năm tồn tại của bốn chữ số yyyy, không phải năm yyyyy. Nhìn kỹ hơn các đoạn mã tôi đã đăng ở đây.


Điều gì nếu bạn muốn ngày giống như "Thứ Hai ngày 1 tháng 9 năm 2012"?
crmepham

11
@crm: Chỉ cần nhấp vào liên kết javadoc, tìm các ký tự mẫu cần thiết ở đó và thay đổi mẫu cho phù hợp.
BalusC

Khi bạn chưa có trên Java 8, hãy xem xét sử dụng backport, ThreeTen Backport và sau đó là các ví dụ đầu tiên từ câu trả lời. Hoặc cho Android dưới API cấp 26, ThreeTenABP .
Ole VV

157

Định dạng là CASE-SENSITIVE để SỬ DỤNG MM cho tháng không phải mm (điều này là trong vài phút) và yyyy Để tham khảo, bạn có thể sử dụng theo sau áo choàng.

G   Era designator  Text    AD
y   Year    Year    1996; 96
Y   Week year   Year    2009; 09
M   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 name in week    Text    Tuesday; Tue
u   Day number of week (1 = Monday, ..., 7 = Sunday)    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

Ví dụ:

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

1
"yyyy-MM-dd'T'HH: mm: ss.SSSZ" cần được "yyyy-MM-dd'T'HH: mm: ss.SSS'Z '"
một cầu thủ công bằng

2
không, nếu bạn đặt Z trong một trích dẫn, nó sẽ cho Z là đầu ra nhưng không có nó, nó sẽ cung cấp cho Timezone. ví dụ. 2014-08-14T01: 24: 57.236Z và từ không có nó 2014-08-14T01: 24: 57.236-0530 -> Tôi đã thử trên jdk1.7
Dev

1
"yyyyy.MMMMM.dd GGG hh: mm aaa" 02001.July.04 AD 12:08 PM Lưu ý thêm M trong tháng. Bốn không năm!
Stefano Mtangoo

nếu đó là 4 chữ cái trở lên, thì hình thức đầy đủ được sử dụng. vì vậy bạn có thể sử dụng 4 lần m hoặc thậm chí 5 lần so với cùng một lần
Dev

Đây là khá nhiều Copy-Paste của các tài liệu. Không có giải thích thêm đang được cung cấp, và không có liên kết đến các tài liệu nơi có thể có thêm thông tin nếu cần. -1. ( Đây là liên kết btw )
XenoRo

108

Câu trả lời tất nhiên là tạo một đối tượng SimpleDateFormat và sử dụng nó để phân tích các Chuỗi thành Ngày và định dạng Ngày thành Chuỗi. Nếu bạn đã thử SimpleDateFormat và nó không hoạt động, thì vui lòng hiển thị mã của bạn và bất kỳ lỗi nào bạn có thể nhận được.

Phụ lục: "mm" trong định dạng Chuỗi không giống như "MM". Sử dụng MM cho tháng và mm trong vài phút. Ngoài ra, yyyyy không giống như yyyy. ví dụ,:

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

public class FormateDate {

    public static void main(String[] args) throws ParseException {
        String date_s = "2011-01-18 00:00:00.0";

        // *** note that it's "yyyy-MM-dd hh:mm:ss" not "yyyy-mm-dd hh:mm:ss"  
        SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = dt.parse(date_s);

        // *** same for the format String below
        SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(dt1.format(date));
    }

}

nhập java.text.PudeException; nhập java.text.SimpleDateFormat; nhập java.util.Date; lớp công khai formateDate {/ ** * @param args * @throw ParseException * / public static void main (String [] args) throws ParseException {// TODO Phương thức tự động tạo ra stub String date_s = "2011-01-18 00:00 : 00.0 "; SimpleDateFormat dt = new SimpleDateFormat ("yyyyy-mm-dd hh: mm: ss"); Ngày ngày = dt.parse (date_s); SimpleDateFormat dt1 = new SimpleDateFormat ("yyyyy-mm-dd"); System.out.println (dt1.format (ngày)); }} tôi muốn đặt ra nên là "2011-01-18" nhưng đặt ra là 02011-00-1
amit4444

Đăng bất kỳ mã nào bạn có dưới dạng bổ sung cho câu hỏi ban đầu (thụt vào bốn khoảng trắng). Bằng cách này, nó sẽ giữ lại định dạng của nó và sau đó chúng ta có thể đọc nó.
Hovercraft Full Of Eels

1
Xem chỉnh sửa để trả lời của tôi ở trên. Bạn đang sử dụng "mm" trong chuỗi định dạng của mình, nơi bạn nên sử dụng "MM"
Hovercraft Full Of Eels

hhsẽ cung cấp cho bạn giờ trong phạm vi 1-12, bạn sẽ cần sử dụng angoài việc in / phân tích AMhoặc PM. Để in / phân tích giờ trong phạm vi 0-23, sử dụng HH.
Andre Holzner

22

Tại sao không sử dụng đơn giản

Date convertToDate(String receivedDate) throws ParseException{
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        Date date = formatter.parse(receivedDate);
        return date;
    }

Ngoài ra, đây là cách khác:

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
String requiredDate = df.format(new Date()).toString();

hoặc là

Date requiredDate = df.format(new Date());

Chúc mừng!


2
Tại sao không sử dụng cái này? Bởi vì (a) nó bỏ qua vấn đề múi giờ. Xác định ngày phụ thuộc vào múi giờ. Mã này phụ thuộc vào múi giờ mặc định của JVM. Vì vậy, kết quả có thể vô tình thay đổi. Và (b) vì các lớp java.util.Date và SimpleDateFormat nổi tiếng là rắc rối và nên tránh.
Basil Bourque

2
luôn trả về strin, Date requiredDate = df.format (Ngày mới ());
delive

15

Sử dụng java.timegói trong Java 8 trở lên:

String date = "2011-01-18 00:00:00.0";
TemporalAccessor temporal = DateTimeFormatter
    .ofPattern("yyyy-MM-dd HH:mm:ss.S")
    .parse(date); // use parse(date, LocalDateTime::from) to get LocalDateTime
String output = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(temporal);

9

[được chỉnh sửa để bao gồm các chỉnh sửa của BalusC] Lớp SimpleDateFormat nên thực hiện thủ thuật:

String pattern = "yyyy-MM-dd HH:mm:ss.S";
SimpleDateFormat format = new SimpleDateFormat(pattern);
try {
  Date date = format.parse("2011-01-18 00:00:00.0");
  System.out.println(date);
} catch (ParseException e) {
  e.printStackTrace();
}

DDlà viết tắt của "ngày trong năm", không phải "ngày trong tháng". hhlà viết tắt của "giờ trong sáng / chiều (1-12)", không phải "giờ trong ngày (0-23)".
BalusC

9

Các câu trả lời khác là chính xác, về cơ bản, bạn đã có sai số ký tự "y" trong mẫu của mình.

Múi giờ

Một vấn đề nữa mặc dù bạn không giải quyết các múi giờ. Nếu bạn dự định UTC , thì bạn nên nói như vậy. Nếu không, câu trả lời không đầy đủ. Nếu tất cả những gì bạn muốn là phần ngày mà không có thời gian, thì không vấn đề gì. Nhưng nếu bạn làm thêm công việc có thể liên quan đến thời gian, thì bạn nên chỉ định múi giờ.

Joda-Thời gian

Đây là cùng một loại mã nhưng sử dụng thư viện Joda-Time 2.3 nguồn mở của bên thứ ba

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.

String date_s = "2011-01-18 00:00:00.0";

org.joda.time.format.DateTimeFormatter formatter = org.joda.time.format.DateTimeFormat.forPattern( "yyyy-MM-dd' 'HH:mm:ss.SSS" );
// By the way, if your date-time string conformed strictly to ISO 8601 including a 'T' rather than a SPACE ' ', you could
// use a formatter built into Joda-Time rather than specify your own: ISODateTimeFormat.dateHourMinuteSecondFraction().
// Like this:
//org.joda.time.DateTime dateTimeInUTC = org.joda.time.format.ISODateTimeFormat.dateHourMinuteSecondFraction().withZoneUTC().parseDateTime( date_s );

// Assuming the date-time string was meant to be in UTC (no time zone offset).
org.joda.time.DateTime dateTimeInUTC = formatter.withZoneUTC().parseDateTime( date_s );
System.out.println( "dateTimeInUTC: " + dateTimeInUTC );
System.out.println( "dateTimeInUTC (date only): " + org.joda.time.format.ISODateTimeFormat.date().print( dateTimeInUTC ) );
System.out.println( "" ); // blank line.

// Assuming the date-time string was meant to be in Kolkata time zone (formerly known as Calcutta). Offset is +5:30 from UTC (note the half-hour).
org.joda.time.DateTimeZone kolkataTimeZone = org.joda.time.DateTimeZone.forID( "Asia/Kolkata" );
org.joda.time.DateTime dateTimeInKolkata = formatter.withZone( kolkataTimeZone ).parseDateTime( date_s );
System.out.println( "dateTimeInKolkata: " + dateTimeInKolkata );
System.out.println( "dateTimeInKolkata (date only): " + org.joda.time.format.ISODateTimeFormat.date().print( dateTimeInKolkata ) );
// This date-time in Kolkata is a different point in the time line of the Universe than the dateTimeInUTC instance created above. The date is even different.
System.out.println( "dateTimeInKolkata adjusted to UTC: " + dateTimeInKolkata.toDateTime( org.joda.time.DateTimeZone.UTC ) );

Khi chạy đào

dateTimeInUTC: 2011-01-18T00:00:00.000Z
dateTimeInUTC (date only): 2011-01-18

dateTimeInKolkata: 2011-01-18T00:00:00.000+05:30
dateTimeInKolkata (date only): 2011-01-18
dateTimeInKolkata adjusted to UTC: 2011-01-17T18:30:00.000Z

9

Vui lòng tham khảo "Mẫu ngày và giờ" tại đây. http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

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

public class DateConversionExample{

  public static void main(String arg[]){

    try{

    SimpleDateFormat sourceDateFormat = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");

    Date date = sourceDateFormat.parse("2011-01-18 00:00:00.0");


    SimpleDateFormat targetDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    System.out.println(targetDateFormat.format(date));

    }catch(ParseException e){
        e.printStackTrace();
    }
  } 

}

8
try
 {
    String date_s = "2011-01-18 00:00:00.0";
    SimpleDateFormat simpledateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
    Date tempDate=simpledateformat.parse(date_s);
    SimpleDateFormat outputDateFormat = new SimpleDateFormat("yyyy-MM-dd");           
    System.out.println("Output date is = "+outputDateFormat.format(tempDate));
  } catch (ParseException ex) 
  {
        System.out.println("Parse Exception");
  }

7
public class SystemDateTest {

    String stringDate;

    public static void main(String[] args) {
        SystemDateTest systemDateTest = new SystemDateTest();
        // format date into String
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
        systemDateTest.setStringDate(simpleDateFormat.format(systemDateTest.getDate()));
        System.out.println(systemDateTest.getStringDate());
    }

    public Date getDate() {
        return new Date();
    }

    public String getStringDate() {
        return stringDate;
    }

    public void setStringDate(String stringDate) {
        this.stringDate = stringDate;
    }
}

3
Vui lòng thêm một số thông tin vào (các) câu trả lời của bạn để giải thích mã của bạn.
Kursad Gulseven

có một getDate tên () phương pháp mà u có thể nhận được ngày obj sau đó áp dụng SimpleDateFormat để bạn có thể chuyển đổi ngày theo định dạng của bạn được định nghĩa trong SimpleDateFormat constructor và thiết lập trong phương pháp StringDate bạn có thể làm cho nó lưu trữ
Neeraj Gahlawat

6
   String str = "2000-12-12";
   Date dt = null;
   SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

    try 
    {
         dt = formatter.parse(str);
    }
    catch (Exception e)
    {
    }

    JOptionPane.showMessageDialog(null, formatter.format(dt));

6

Bạn chỉ có thể sử dụng:

Date yourDate = new Date();

SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
String date = DATE_FORMAT.format(yourDate);

Nó hoạt động hoàn hảo!


5

Bạn cũng có thể sử dụng chuỗi con ()

String date_s = "2011-01-18 00:00:00.0";
date_s.substring(0,10);

Nếu bạn muốn có một không gian trước ngày, hãy sử dụng

String date_s = " 2011-01-18 00:00:00.0";
date_s.substring(1,11);

5

Bạn có thể thử Java 8 mới date, có thể tìm thấy nhiều thông tin hơn trong tài liệu của Oracle .

Hoặc bạn có thể thử cái cũ

public static Date getDateFromString(String format, String dateStr) {

    DateFormat formatter = new SimpleDateFormat(format);
    Date date = null;
    try {
        date = (Date) formatter.parse(dateStr);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    return date;
}

public static String getDate(Date date, String dateFormat) {
    DateFormat formatter = new SimpleDateFormat(dateFormat);
    return formatter.format(date);
}

4
private SimpleDateFormat dataFormat = new SimpleDateFormat("dd/MM/yyyy");

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    if(value instanceof Date) {
        value = dataFormat.format(value);
    }
    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
};

3

loại bỏ một hình thức y SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");nên đượcSimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");


Không chính xác. Bạn cũng cần trường hợp chính xác (không có vấn đề gì nếu bạn sử dụng hiện đại DateTimeFormatterhoặc bám víu vào lỗi thời SimpleDateFormat).
Ole VV

0

SimpleDateFormat dt1 = new SimpleDateFormat ("yyyy-mm-dd");


Lớp thời gian này đã được thay thế từ nhiều năm trước bởi các lớp java.time hiện đại . Cụ thể DateTimeFormatterDateTimeFormatterBuilder. Gợi ý SimpleDateFormatnăm 2019 là lời khuyên kém.
Basil Bourque

Không chính xác Mã định dạng của bạn ở đây là sai. hhlà cho giờ.
Basil Bourque

Thông thường chúng tôi mong đợi một số thảo luận hoặc giải thích. Stack Overflow có nghĩa là nhiều hơn một thư viện đoạn trích.
Basil Bourque

0

Giả sử bạn muốn thay đổi 2019-12-20 10:50 AM GMT + 6: 00 đến 2019-12-20 10:50 AM trước tiên bạn phải hiểu định dạng ngày đầu tiên định dạng ngày là yyyy-MM-dd hh : mm a zzz và định dạng ngày thứ hai sẽ là yyyy-MM-dd hh: mm a

Chỉ cần trả về một chuỗi từ chức năng này như thế nào.

public String convertToOnlyDate(String currentDate) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm a ");
    Date date;
    String dateString = "";
    try {
        date = dateFormat.parse(currentDate);
        System.out.println(date.toString()); 

        dateString = dateFormat.format(date);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return dateString;
}

Chức năng này sẽ trả về câu trả lời mong muốn của bạn. Nếu bạn muốn tùy chỉnh nhiều hơn, chỉ cần thêm hoặc xóa thành phần khỏi định dạng ngày.

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.