DateFormat에서 반환된 월 및 일 이름의 대문자 사용을 제어하는 방법은 무엇입니까?
-
09-06-2019 - |
문제
다음은 빠른 테스트 프로그램입니다:
public static void main( String[] args )
{
Date date = Calendar.getInstance().getTime();
System.out.println("Months:");
printDate( "MMMM", "en", date );
printDate( "MMMM", "es", date );
printDate( "MMMM", "fr", date );
printDate( "MMMM", "de", date );
System.out.println("Days:");
printDate( "EEEE", "en", date );
printDate( "EEEE", "es", date );
printDate( "EEEE", "fr", date );
printDate( "EEEE", "de", date );
}
public static void printDate( String format, String locale, Date date )
{
System.out.println( locale + ": " + (new SimpleDateFormat( format, new Locale( locale ) )).format( date ) );
}
출력은 다음과 같습니다
Months:
en: September
es: septiembre
fr: septembre
de: September
Days:
en: Monday
es: lunes
fr: lundi
de: Montag
이름의 대문자 사용을 어떻게 제어할 수 있나요?어떤 이유에서인지 스페인어와 프랑스어는 항상 소문자로 시작하는 이름을 반환하는 것 같습니다.
해결책
모든 언어가 영어 대문자 사용 규칙을 공유하는 것은 아닙니다.API에서 사용하는 데이터를 변경해야 할 것 같지만 영어가 아닌 클라이언트는 이를 좋아하지 않을 수도 있습니다...
다른 팁
대문자 사용 규칙은 언어마다 다릅니다.프랑스어에서는 월 이름 대문자로 쓰면 안 된다.
대문자 사용을 변경하고 싶지 않을 수도 있습니다. 문화에 따라 다른 단어를 대문자로 사용합니다(예를 들어 독일어에서는 고유 명사뿐만 아니라 모든 명사를 대문자로 사용합니다).
tl;dr
이름의 대문자 사용을 어떻게 제어할 수 있나요?
당신은 그렇지 않습니다.언어와 문화에 따라 대문자, 구두점, 약어 등에 대한 규칙이 다릅니다.
Month.from( LocalDate.now( ZoneId.of( "Pacific/Auckland" ) ) ) // Get current month.
.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) // Localize automatically. Specify `Locale` to determine human language and cultural norms for translation.
페브리에
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) ) // Get current date as seen by people in a certain region (time zone).
.getDayOfWeek() // Get the day-of-week as a pre-defined `DayOfWeek` enum object.
.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH )
룬디
현지화
다른 사람들이 말했듯이 대문자 사용에 대한 자신만의 편협한(미국 영어?) 개념을 강요해서는 안 됩니다.괜찮은 날짜-시간 라이브러리를 사용하고 자동으로 현지화되도록 하세요.
java.time
현재 레거시이며 java.time 클래스로 대체된 끔찍한 오래된 날짜-시간 클래스를 사용하고 있습니다.
그만큼 LocalDate
클래스는 시간과 시간대가 없는 날짜 전용 값을 나타냅니다.
시간대는 날짜를 결정하는 데 매우 중요합니다.특정 순간의 날짜는 전 세계의 구역에 따라 다릅니다.예를 들어, 자정이 몇 분 지난 후 파리 프랑스 새로운 날이지만 여전히 "어제"입니다. 몬트리올 퀘벡.
지정 적절한 시간대 이름 형식으로 continent/region
, 와 같은 America/Montreal
, Africa/Casablanca
, 또는 Pacific/Auckland
.다음과 같은 3~4자 약어를 사용하지 마십시오. EST
또는 IST
있는 그대로 ~ 아니다 표준화되지도 않고 고유하지도 않은(!) 실제 시간대입니다.
ZoneId z = ZoneId.of( "Asia/Kolkata" );
LocalDate today = LocalDate.now( z );
한 달로 작업하려면 다음을 추출하세요. Month
열거형 객체.요일에 대해서도 마찬가지입니다. DayOfWeek
.
부르다 getDisplayName
.통과 TextStyle
약어로.통과 Locale
(a) 요일 이름, 월 이름 등을 번역하기 위한 인간 언어 및 (b) 약어, 대문자 사용, 구두점, 구분 기호 등의 문제를 결정하는 문화적 규범을 결정합니다.참고하세요 Locale
가지다 아무것도 아님 시간대와 관련이 있습니다.
Month m = today.getMonth() ;
String mNameQuébec = m.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;
String mNameGermany = m.getDisplayName( TextStyle.FULL , Locale.GERMANY ) ;
…그리고…
DayOfWeek dow = today.getDayOfWeek() ;
String dowNameQuébec = dow.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;
String dowNameGermany = dow.getDisplayName( TextStyle.FULL , Locale.GERMANY ) ;
에 대한 java.time
그만큼 java.time 프레임워크는 Java 8 이상에 내장되어 있습니다.이 클래스는 번거로운 기존 클래스를 대체합니다. 유산 다음과 같은 날짜-시간 수업 java.util.Date
, Calendar
, & SimpleDateFormat
.
그만큼 조다타임 프로젝트, 지금 유지 관리 모드, 다음으로 마이그레이션을 권장합니다. java.time 클래스.
자세한 내용은 다음을 참조하세요. 오라클 튜토리얼.그리고 Stack Overflow를 검색해 많은 예와 설명을 알아보세요.사양은 JSR 310.
와 JDBC 드라이버 준수 JDBC 4.2 또는 나중에 교환할 수 있습니다. java.time 데이터베이스와 직접 개체를 연결합니다.문자열이나 java.sql.* 클래스가 필요하지 않습니다.
java.time 클래스는 어디서 구할 수 있나요?
- 자바 SE 8, 자바 SE 9, 그리고 나중에
- 내장.
- 번들로 구현된 표준 Java API의 일부입니다.
- Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.
- 자바 SE 6 그리고 자바 SE 7
- java.time 기능의 대부분은 Java 6 및 7로 백포팅되었습니다. ThreeTen-백포트.
- 기계적 인조 인간
- java.time 클래스의 최신 버전 Android 번들 구현.
- 이전 Android의 경우 쓰리텐ABP 프로젝트가 적응하다 ThreeTen-백포트 (위에 언급했듯이).보다 ThreeTenABP를 사용하는 방법….
그만큼 쓰리텐-엑스트라 프로젝트는 추가 클래스로 java.time을 확장합니다.이 프로젝트는 java.time에 향후 추가될 수 있는 기능을 입증하는 기반입니다.여기에서 다음과 같은 유용한 클래스를 찾을 수 있습니다. Interval
, YearWeek
, YearQuarter
, 그리고 더.
문장이 "dimanche 07 mars"로 시작하는 경우 문제가 발생합니다. 문장 시작 부분이 아니더라도 문제가 되지 않습니다.문자열의 첫 번째 문자에 대해 수동으로 문자열을 조작하지 않는 한 이는 변경할 수 없는 것 같습니다.