2017-02-23 2 views
-2
public static void main(String[] args) { 
     Date now = new Date(); 

     String dateString = now.toString(); 
     System.out.println(" 1. " + dateString); 

     SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); 

     try { 
      Date parsed = format.parse(dateString); 
      System.out.println(" 2. " + parsed.toString()); 
     } catch (ParseException pe) { 
      System.out.println("ERROR: Cannot parse \"" + dateString + "\""); 
     } 

     System.out.println(" 3. " + format.format(now)); 
    } 

콘솔에서 인쇄 :java SimpleDateFormat?

1. Thu Feb 23 17:14:51 CET 2017 
ERROR: Cannot parse "Thu Feb 23 17:14:51 CET 2017" 
3. jeu. févr. 23 05:14:51 CET 2017 

대신은 :

1. Thu Feb 23 17:14:51 CET 2017 
2. Thu Feb 23 17:14:51 CET 2017 
3. jeu. févr. 23 05:14:51 CET 2017 
+2

3은 시스템 로켈이 프랑스어임을 나타냅니다. 따라서 "Thu Feb"는 프랑스어 이름 만 예상하므로 포맷터가 인식하지 못합니다. – Thomas

+2

Bonjour, 왜 당신은 여전히 ​​구식 클래스 인'Date'와'SimpleDateFormat'을 사용하고있는 것입니까? 'java.time'의 새로운 클래스 (Java 8 이후)에는 기본 형식과 로케일에 대해 동의하는'toString' 및'parse' 메소드가 있으므로이 문제와 같은 문제를 해결할 것입니다. –

답변

3

은 기본 LocaleFRENCH처럼 보이는, 그리고 다른 하나를 지정하지 않은 경우 SimpleDateFormat 때문에, 당신이 그것을 사용 Thu 또는 Feb과 같은 영어 abreviations을 성공적으로 구문 분석 할 수 없습니다.

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH); 
0

당신은 자바에서 지금 밖 일자 Date 클래스의 많은 질병 중 하나에 실행 한 :

그러나이 같은 ENGLISHLocale의 사용을 지정할 수 있습니다.

소리와 쉬운 해결 방법은 Java 8 날짜 및 시간 클래스로 변경하는 것입니다. Date에 가장 잘 맞는 새로운 클래스는 Instant입니다. 이 클래스와 코드가된다 : 나는 당신의 예에서 3.을 떠난

Instant now = Instant.now(); 

    String dateString = now.toString(); 
    System.out.println(" 1. " + dateString); 

    try { 
     Instant parsed = Instant.parse(dateString); 
     System.out.println(" 2. " + parsed.toString()); 
    } catch (DateTimeParseException e) { 
     System.out.println("ERROR: Cannot parse \"" + dateString + "\""); 
    } 

. 물론 Instant을 당신이 꿈꿀 수있는 어떤 식 으로든 포맷하는 것이 가능합니다. 그러나 우리가 toString 메쏘드에서와 같은 결과물을 원한다면 지금 당장은 그럴 가치가 없습니다. 오히려이 경우에는 형식이 전혀 필요 없음을 보여 드리고자합니다. 코드는 다음을 인쇄합니다.

1. 2017-02-23T17:07:19.775Z 
2. 2017-02-23T17:07:19.775Z 

시간이 UTC로 인쇄됩니다. 대신 현지 표준 시간대를 사용하려는 경우 Instant 대신 ZonedDateTime을 사용하십시오. 코드의 나머지 부분은 정확히 동일하지만, 내 컴퓨터에 현재 출력은 다음과 같습니다 물론

1. 2017-02-23T18:07:19.852+01:00[Europe/Berlin] 
2. 2017-02-23T18:07:19.852+01:00[Europe/Berlin] 

당신이 새로운 클래스와도 로케일 의견이 맞지에서 얻을 것과 같은 오류를 생성 할 수 있습니다. 멀리 볼 수있는 한, 동의하지 않는 로케일을 명시 적으로 지정해야합니다. 그래서 당신은 쉽게하지 않습니다.