2014-12-22 3 views
2

Android 프로젝트에서 스페인어 로케일 (SimpleDateFormat)을 사용하여 날짜 문자열을 파싱했는데 어떤 이상한 이유로 인해 ParseException은 9 월을 날짜로 사용했습니다. 달. 왜이 문제가 발생했는지 알지 못해이 버그를 재연하기 위해이 예외를 던지는 날짜 문자열을 사용하여 Eclipse에서 장난감 프로그램을 작성하기로 결정했습니다. 놀랍게도 예외는 발생하지 않았고 날짜는 정확하게 파싱되었습니다.Android 프로젝트에서 java.text.simpledateform이 다르게 동작합니다.

제 질문은 : 첫 번째 코드 블록 (jdk 1.8_25 포함)이 ParseException을 던지지 않는 이유는 두 번째 코드 블록 (빈 Android Studio 애플리케이션에서 SDK 21 rev.2 및 Build -Tools 21.1.2)는 ParseException을 던집니까? 다른 누구도이 이상한 행동을 재현 할 수 있습니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 두 경우 모두 문자열을 날짜로 정확하게 파싱해서는 안됩니까?

코드 # 1 (JDK 1.8_25) :

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

public class Main { 
private static final String THIS_YEAR_TIME_FORMAT = "d 'de' MMM, HH:mm"; 
private static final DateFormat THIS_YEAR_TIME_FORMATTER = new SimpleDateFormat(THIS_YEAR_TIME_FORMAT, 
     new Locale("es", "ES")); 

public static void main(String[] args) { 
    final String problemStr = "3 de sep, 22:50"; 
    Date time; 
    try { 
     time = THIS_YEAR_TIME_FORMATTER.parse(problemStr); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
} 
} 

코드 # 2 (안드로이드 SDK 21 계 2:13, 빌드 - 도구 21.1.2) :

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

public class MainActivity extends ActionBarActivity { 
private static final String THIS_YEAR_TIME_FORMAT = "d 'de' MMM, HH:mm"; 
private static final DateFormat THIS_YEAR_TIME_FORMATTER = new SimpleDateFormat(THIS_YEAR_TIME_FORMAT, 
     new Locale("es", "ES")); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final String problemStr = "3 de sep, 22:50"; 
    Date time; 
    try { 
     time = THIS_YEAR_TIME_FORMATTER.parse(problemStr); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
} 
} 

답변

2

"9pt."은 Android가 사용하는 CLDR에 따른 적절한 스페인어 9 월/septiembre 약어입니다. Java의 경우 CLDR 지원은 Java 8에만 추가되며 기본적으로 사용되지 않으며 Java 기본 구현은 CLDR과 100 % 호환되지 않습니다. 이는 비 호환성 중 하나라고 생각합니다.

는 (2013)는 안드로이드 5.0 +의 주요 버그처럼

코드는 갤럭시 S3 (안드로이드 4.3) & 안드로이드 4.4 에뮬레이터에서 작동 ... 보이지만 모두 안드로이드 5.0 에뮬레이터와 넥서스 7에 실패 5.0.1을 실행 중입니다. 심지어 Locale.getAvailableLocales()에 의해 반환 된 Locale 인스턴스를 사용하더라도 Android 5.0.x에서는 실패합니다.

Google이 제공하고 Google이 멀리 떨어져 있습니다.

+0

조사 해 주셔서 감사합니다. 이것에 대해 어떻게 알았습니까? // 'sep'가 9 월에 항상 파싱되도록하려면 'sept'가 아닌 'sep'가 필요합니다. 어디에서나 사용할 수 있도록'SimpleDateFormat'으로 이것을 어떻게 보장 할 수 있습니까? – hallaplay835

+0

@ hallaplay835 꽤 많은 인터넷 검색과 독서가 있었지만 CLDR은 확실히 데이터를 쉽게 이해할 수 없습니다. 어디서나 작동하도록하는 한 가지 방법은'ParseException'을 잡아서 "sep"를 "sept"로 바꾸는 것입니다. 문자열에서 다시 시도하십시오. 그것은 못생긴 해결책이지만, 더 나은 방법으로 이것을 달성하는 방법에 대한 문서를 보지 못했습니다. – Kai

관련 문제