Java 문자열에서 날짜 형식 변경


465

나는 String데이트를 대표합니다.

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

그것을로 변환하고 형식으로 Date출력 하고 싶습니다 YYYY-MM-DD.

2011-01-18

어떻게하면 되나요?


좋아, 아래에서 검색 한 답변을 바탕으로 내가 시도한 것이 있습니다.

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));

그러나 02011-00-1원하는 대신 출력 합니다 2011-01-18. 내가 무엇을 잘못하고 있지?


163
yyyyy는 yyyy와 다릅니다. :)
호버 크래프트 가득한 뱀장어

2
부메랑 질문입니다. 사용 사례는 무엇입니까? 내장 패턴 (DateFormat.getDateTimeInstance ())을 사용해야 할 수도 있습니다.
Paweł Dyda

11
월은 위의 예와 같이 mm이 아니라 형식 문자열에서 MM으로 표시됩니다. mm는 분을 의미합니다.
Mike

3
초기 버전은 작동하지 않았다 원인 나는 YYYY-MM-DD로 YYYY-MM-DD 변경
파블로 Zvarych

답변:


506

특정 패턴의 a 를로 구문 분석 하려면 LocalDateTime#parse()(또는 ZonedDateTime#parse()문자열에 시간대 부분이 포함 된 경우) 사용하십시오 .StringLocalDateTime

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

사용 LocalDateTime#format()(또는 ZonedDateTime#format()형식으로) LocalDateTime로를 String특정 패턴으로.

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

또는 아직 Java 8을 사용하지 않는 경우 특정 패턴의 a SimpleDateFormat#parse()를로 구문 분석하는 데 사용 String하십시오 Date.

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

a를 특정 패턴 으로 SimpleDateFormat#format()형식화하는 데 사용 합니다 .DateString

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

또한보십시오:


업데이트 : 실패한 시도에 따라 패턴은 대소 문자를 구분 합니다. 개별 부분의 약자 인 java.text.SimpleDateFormatjavadoc을 읽으십시오 . 따라서 M몇 달과 m몇 분을 의미합니다. 또한 연도는 yyyy5 자리 가 아닌 4 자리 숫자로 존재합니다 yyyyy. 위에 게시 한 코드 스 니펫을 자세히 살펴보십시오.


날짜를 "2012 년 9 월 1 일 월요일"처럼 보이려면 어떻게해야합니까?
crmepham 2016 년

11
@crm : javadoc 링크를 클릭하고 필요한 패턴 문자를 파악한 후 그에 따라 패턴을 변경하십시오.
BalusC

아직 Java 8을 사용하지 않는 경우 백 포트, ThreeTen Backport 및 첫 번째 답변 예를 사용해보십시오. 또는 API 레벨 26 이하의 Android의 경우 ThreeTenABP 입니다.
Ole VV

157

서식은 대소 문자를 구분하므로 mm이 아닌 월 (이것은 분)이고 yyyy는 참조 용으로 다음 치트 시트를 사용할 수 있습니다.

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

예 :

"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"는 "yyyy-MM-dd'T'HH : mm : ss.SSS'Z '"이어야합니다.
공정한 플레이어

2
아니요 작은 따옴표로 Z를 넣으면 Z가 출력으로 제공되지만 Z가 없으면 시간대가 제공됩니다. 예. 2014-08-14T01 : 24 : 57.236Z 그리고 그것없이 2014-08-14T01 : 24 : 57.236-0530-> 나는 jdk1.7에서 시도했다
Dev

1
"yyyyy.MMMMM.dd GGG hh : mm aaa"02001.July.04 AD 12:08 PM 달에 여분의 M이 있습니다. 넷이 아니라 다섯!
Stefano Mtangoo '12

4 글자 이상이면 전체 양식이 사용됩니다. 그래서 당신은 4 배 m 또는 심지어 5 배 m을 사용할 수 있습니다
Dev

이것은 문서의 복사-붙여 넣기와 거의 같습니다. 추가 설명이 제공되지 않으며 필요한 경우 더 많은 정보를 얻을 수있는 문서에 대한 링크가 없습니다. -1. ( 여기 btw 링크가 있습니다 )
XenoRo

108

대답은 물론 SimpleDateFormat 객체를 만들어 String을 Date로 구문 분석하고 Dates를 String으로 형식화하는 데 사용합니다. SimpleDateFormat을 시도했지만 작동하지 않으면 코드와 오류가 표시 될 수 있습니다.

부록 : 문자열 형식의 "mm"은 "MM"과 다릅니다. 몇 달 동안 MM을 사용하고 몇 분 동안 MM을 사용하십시오. 또한 yyyyy는 yyyy와 다릅니다. 예 :

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));
    }

}

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class formateDate {/ ** * @param args * @throws ParseException * / public static void main (String [] args) throws ParseException {// TODO 자동 생성 된 메소드 스텁 문자열 date_s = "2011-01-18 00:00 : 00.0 "; SimpleDateFormat dt = 새로운 SimpleDateFormat ( "yyyyy-mm-dd hh : mm : ss"); 날짜 날짜 = dt.parse (date_s); SimpleDateFormat dt1 = 새로운 SimpleDateFormat ( "yyyyy-mm-dd"); System.out.println (dt1.format (date)); }} 풋 아웃은 "2011-01-18"이어야하지만 풋 아웃은 02011-00-1입니다.
amit4444

원래 질문에 추가 한 코드 (공백 들여 쓰기)를 게시하십시오. 이런 식으로 형식을 유지 한 다음 읽을 수 있습니다.
호버크라프트 가득한 뱀장어

1
위의 답변에 대한 수정을 참조하십시오. "MM"을 사용해야하는 문자열 형식에서 "mm"을 사용하고 있습니다.
호버크라프트 가득한 장어

hh1 ~ 12 범위의 시간을 제공 a하므로 인쇄 / 구문 분석 AM또는 을 사용해야 PM합니다. 0-23 범위의 시간을 인쇄 / 파싱하려면을 사용하십시오 HH.
Andre Holzner

22

단순히 이것을 사용하지 않는 이유

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

또한 이것은 다른 방법입니다.

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

또는

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

건배!


2
왜 이것을 사용하지 않습니까? (a) 시간대 문제를 무시하기 때문입니다. 날짜를 결정하는 것은 시간대에 따라 다릅니다. 이 코드는 JVM의 기본 시간대에 따라 다릅니다. 따라서 결과가 실수로 달라질 수 있습니다. 그리고 (b) java.util.Date 및 SimpleDateFormat 클래스는 악명 높고 피해야하기 때문에.
Basil Bourque

2
항상 strin을 반환, Date requiredDate = df.format (new Date ());
대인 수수

15

java.timeJava 8 이상 에서 패키지 사용 :

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

에서 [BalusC의 수정을 포함하도록 편집] SimpleDateFormat의의 클래스는 트릭을 수행해야합니다

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();
}

DD"달의 날"이 아니라 "년의 날"을 나타냅니다. hh"일시 (0-23) 시간"이 아니라 "시 /시 (1-12) 시간"을 나타냅니다.
BalusC

9

다른 답변은 정확합니다. 기본적으로 패턴에 잘못된 "y"문자 수가 있습니다.

시간대

한가지 더 문제가 있습니다… 당신은 시간대를 다루지 않았습니다. UTC 를 의도 한 경우 그렇게 말했을 것입니다. 그렇지 않으면 답변이 완료되지 않은 것입니다. 시간이없는 날짜 부분 만 있으면 문제가 없습니다. 그러나 시간이 필요할 수있는 추가 작업을 수행하려면 시간대를 지정해야합니다.

조다 타임

다음은 동일한 종류의 코드이지만 타사 오픈 소스를 사용하는 것입니다. Joda-Time 2.3 라이브러리를 사용합니다.

// © 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 ) );

달릴 때…

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

여기에서 "날짜 및 시간 패턴"을 참조하십시오. 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
코드를 설명하기 위해 답변에 정보를 추가하십시오.
Kursad Gulseven

SimpleDateFormat을 적용한 후에 u가 날짜 obj를 얻을 수있는 getDate () 메소드 이름이 있습니다. 따라서 SimpleDateFormat 생성자에 정의되어 있고 StringDate 메소드에서 설정 한 형식에 따라 날짜를 변환하여 캐시 할 수 있습니다.
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

당신은 단지 사용할 수 있습니다 :

Date yourDate = new Date();

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

완벽하게 작동합니다!


5

substring ()을 사용할 수도 있습니다

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

날짜 앞에 공백을 원하면

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

5

당신은 시도 할 수 8 자바를date자세한 내용은에서 찾을 수 있습니다 Oracle 설명서 .

아니면 당신은 오래된 것을 시도 할 수 있습니다

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

하나의 y 양식을 제거 SimpleDateFormat dt1 = new SimpleDateFormat("yyyyy-mm-dd");해야합니다.SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-mm-dd");


정확히. 현대를 사용 DateTimeFormatter하거나 구식에 집착하는 경우에도 올바른 대소 문자가 필요합니다 SimpleDateFormat.
Ole VV

0

SimpleDateFormat dt1 = 새로운 SimpleDateFormat ( "yyyy-mm-dd");


이 날짜-시간 클래스는 현대 java.time 클래스에 의해 몇 년 전에 대체되었습니다 . 구체적 DateTimeFormatter으로 DateTimeFormatterBuilder. SimpleDateFormat2019 년에 제안 하는 것은 좋지 않은 조언입니다.
Basil Bourque

잘못된 형식 코드가 여기에 있습니다. hh시간입니다.
Basil Bourque

보통 우리는 약간의 토론이나 설명을 기대합니다. 스택 오버플로는 스 니펫 라이브러리 이상을 의미합니다.
Basil Bourque

0

2019-12-20 10:50 AM GMT + 6:00을 2019-12-20 10:50 AM으로 변경하고 싶다면 먼저 날짜 형식을 이해해야합니다. 한 날짜 형식은 yyyy-MM-dd hh입니다. : mm a zzz 및 두 번째 날짜 형식은 yyyy-MM-dd hh : mm입니다.

이 함수에서 문자열을 반환하십시오.

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;
}

이 함수는 원하는 답변을 반환합니다. 더 많이 사용자 정의하려면 날짜 형식에서 구성 요소를 추가하거나 제거하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.