SimpledateFormat 및 로케일 기반 형식 문자열
-
12-09-2019 - |
문제
주어진 로케일을 기준으로 다른 방식으로 Java로 날짜를 포맷하려고합니다. 예를 들어, 영어 사용자가 "2009 년 11 월 1 일"( "Mmm D, Yyyy"에 의해 형식화 됨) 및 노르웨이 사용자가 "1. 11 월 2009"( "D. Mmm. yyyy")을보고 싶어합니다.
Month Part는 SimpledateFormat 생성자에 로케일을 추가하면 OK 작동하지만 나머지는 어떻습니까?
나는 SimpledateFormat에 로케일과 쌍을 이루는 형식 문자열을 추가 할 수 있기를 바랐지만이를 수행 할 방법을 찾을 수는 없습니다. 내 코드가 로케일을 확인하고 해당 형식 문자열을 추가하도록해야합니까?
해결책
사용 dateformat.getDateInstance (int 스타일, 로케일 로케일) 자신만의 패턴을 만드는 대신 SimpleDateFormat
.
다른 팁
SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE dd MMM yyyy", Locale.ENGLISH);
String formatted = dateFormat.format(the_date_you_want_here);
사용 스타일 + 로케일: dateformat.getDateInstance (int 스타일, 로케일 로케일)
확인하다 http://java.sun.com/j2se/1.5.0/docs/api/java/text/dateformat.html
차이점을 보려면 다음 예제를 실행하십시오.
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
public class DateFormatDemoSO {
public static void main(String args[]) {
int style = DateFormat.MEDIUM;
//Also try with style = DateFormat.FULL and DateFormat.SHORT
Date date = new Date();
DateFormat df;
df = DateFormat.getDateInstance(style, Locale.UK);
System.out.println("United Kingdom: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.US);
System.out.println("USA: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.FRANCE);
System.out.println("France: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.ITALY);
System.out.println("Italy: " + df.format(date));
df = DateFormat.getDateInstance(style, Locale.JAPAN);
System.out.println("Japan: " + df.format(date));
}
}
산출:
United Kingdom: 25-Sep-2017
USA: Sep 25, 2017
France: 25 sept. 2017
Italy: 25-set-2017
Japan: 2017/09/25
tl; dr
LocalDate.now().format(
DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM )
.withLocale( new Locale( "no" , "NO" ) )
)
귀찮은 클래스 java.util.Date
그리고 SimpleDateFormat
이제 Java.Time 클래스에 의해 대체 된 유산입니다.
LocalDate
그만큼 LocalDate
클래스는 시간 영역이없고 시간대가없는 날짜 전용 값을 나타냅니다.
시간대는 날짜를 결정하는 데 중요합니다. 주어진 순간에 따라 날짜는 영역마다 전 세계적으로 다릅니다. 예를 들어, 자정에 몇 분 후 파리 프랑스 여전히“어제”에있는 새로운 날입니다. 몬트리올 퀘벡.
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DateTimeFormatter
사용 DateTimeFormatter
날짜 양수 또는 시간 정치만을 나타내는 문자열을 생성합니다.
그만큼 DateTimeFormatter
클래스는 자동으로 할 수 있습니다 현지화.
현지화하려면 다음을 지정합니다.
FormatStyle
문자열이 얼마나 길거나 약화되어야하는지 결정합니다.Locale
(a) 날의 이름, 월 이름, 그와 같은 인간 언어 및 (b) 약어, 자본화, 구두점 등의 문제를 결정하는 문화적 규범.
예시:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l );
String output = ld.format( f );
다른 방향으로 가면 현지화 된 문자열을 구문 분석 할 수 있습니다.
LocalDate ld = LocalDate.parse( input , f );
로케일과 시간대는 완전히 직교 문제입니다. 몬트리올 순간을 일본어로 제시하거나 힌디어로 제시된 오클랜드 뉴질랜드 순간을 가질 수 있습니다.
또 다른 예 : 변경 6 junio 2012
(스페인어)까지 2012-06-06
(기준 ISO 8601 체재). Java.Time 클래스는 구문 분석/생성 문자열에 기본적으로 ISO 8601 형식을 사용합니다.
String input = "6 junio 2012";
Locale l = new Locale ( "es" , "ES" );
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "d MMMM uuuu" , l );
LocalDate ld = LocalDate.parse ( input , f );
String output = ld.toString(); // 2012-06-06.
FERUSE FORMATS
다음은 여러 로케일에서 여러 지역에서 여러 형식의 결과를 숙지하기위한 몇 가지 예제 코드입니다.
an EnumSet
구현입니다 Set
, 수집시 낮은 메모리 사용량과 빠른 실행 속도 모두에 대해 최적화되었습니다. Enum
사물. 그래서, EnumSet.allOf( FormatStyle.class )
우리에게 네 가지 컬렉션을 제공합니다 FormatStyle
열거적인 객체. 루프. 자세한 내용은 참조하십시오 열거 유형에 대한 Oracle 튜토리얼.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 );
List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH );
locales.add( new Locale( "no" , "NO" ) );
locales.add( Locale.US );
// Or use all locales (almost 800 of them, for about 120K text results).
// Locale[] locales = Locale.getAvailableLocales(); // All known locales. Almost 800 of them.
for ( Locale locale : locales )
{
System.out.println( "------| LOCALE: " + locale + " — " + locale.getDisplayName() + " |----------------------------------" + System.lineSeparator() );
for ( FormatStyle style : EnumSet.allOf( FormatStyle.class ) )
{
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( style ).withLocale( locale );
String output = ld.format( f );
System.out.println( output );
}
System.out.println( "" );
}
System.out.println( "« fin »" + System.lineSeparator() );
산출.
------| LOCALE: fr_CA — French (Canada) |----------------------------------
mardi 23 janvier 2018
23 janvier 2018
23 janv. 2018
18-01-23
------| LOCALE: no_NO — Norwegian (Norway) |----------------------------------
tirsdag 23. januar 2018
23. januar 2018
23. jan. 2018
23.01.2018
------| LOCALE: en_US — English (United States) |----------------------------------
Tuesday, January 23, 2018
January 23, 2018
Jan 23, 2018
1/23/18
« fin »
에 대한 Java.Time
그만큼 Java.Time 프레임 워크는 Java 8 이상에 내장되어 있습니다. 이 수업은 번거로운 오래된 것을 대체합니다 유산 다음과 같은 날짜 시간 수업 java.util.Date
, Calendar
, & SimpleDateFormat
.
그만큼 조다-시간 지금 프로젝트 유지 관리 모드, Java.Time 클래스.
자세한 내용은 오라클 튜토리얼. 많은 예와 설명에 대한 검색 스택 오버 플로우. 사양입니다 JSR 310.
교환 할 수 있습니다 Java.Time 데이터베이스와 직접 개체. a JDBC 드라이버 준수합니다 JDBC 4.2 또는 나중에. 문자열이 필요없고 필요하지 않습니다 java.sql.*
클래스.
Java.Time 수업을 어디에서 얻을 수 있습니까?
- Java SE 8, Java SE 9, 그리고 나중에
- 내장.
- 번들 구현이있는 표준 Java API의 일부.
- Java 9는 사소한 기능과 수정 사항을 추가합니다.
- Java SE 6 그리고 Java SE 7
- Java.Time 기능의 대부분은 Java 6 & 7으로 백 포트되어 있습니다. Threeten-Backport.
- 기계적 인조 인간
- Java.Time 클래스의 이후 버전의 Android 번들 구현.
- 이전 안드로이드의 경우 threetenabp 프로젝트 적응 Threeten-Backport (위에 언급했듯이). 보다 Threetenabp를 사용하는 방법….
그만큼 Threeten-extra 프로젝트는 추가 클래스로 Java.Time을 연장합니다. 이 프로젝트는 Java.Time에 향후 추가 할 수있는 근거입니다. 여기에서 유용한 수업을 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더.
날짜 문자열의 현지화 :
Redsonic의 게시물을 기반으로 :
private String localizeDate(String inputdate, Locale locale) {
Date date = new Date();
SimpleDateFormat dateFormatCN = new SimpleDateFormat("dd-MMM-yyyy", locale);
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");
try {
date = dateFormat.parse(inputdate);
} catch (ParseException e) {
log.warn("Input date was not correct. Can not localize it.");
return inputdate;
}
return dateFormatCN.format(date);
}
String localizedDate = localizeDate("05-Sep-2013", new Locale("zh","CN"));
05- 0 -2013과 같을 것입니다
사용자에 따라 날짜가 표시됩니다 현재 로케일:
반환 날짜와 시간 :
import java.text.DateFormat;
import java.util.Date;
Date date = new Date();
DateFormat df = DateFormat.getDateTimeInstance();
String myDate = df.format(date);
1969 년 12 월 31 일 오후 7:00:02
날짜 만 반환하려면 사용하십시오.
DateFormat.getDateInstance()
1969 년 12 월 31 일
String text = new SimpleDateFormat("E, MMM d, yyyy").format(date);
주어진 날짜의 Java 8 스타일
LocalDate today = LocalDate.of(1982, Month.AUGUST, 31);
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.ENGLISH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.FRENCH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.JAPANESE)));
Java8
import java.time.format.DateTimeFormatter;
myDate.format(DateTimeFormatter.ofPattern("dd-MMM-YYYY",new Locale("ar")))