use*_*661 12 java date internationalization
这是一个快速测试程序:
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 ) );
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Months:
en: September
es: septiembre
fr: septembre
de: September
Days:
en: Monday
es: lunes
fr: lundi
de: Montag
如何控制名称的大小写.出于某种原因,西班牙语和法语似乎总是返回以小写字母开头的名称.
bra*_*ter 14
并非所有语言都共享英语大小写规则.我想您需要更改API使用的数据,但您的非英语客户可能不会欣赏它...
您可能不希望更改大小写 - 不同的文化会使不同的词语大写(例如,在德语中,您将每个名词大写,而不仅仅是专有名词).
如何控制名称的大小写
你没有。不同的语言和不同的文化对大小写、标点符号、缩写等有不同的规则。
getDisplayName
— 自动本地化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.
Run Code Online (Sandbox Code Playgroud)
费弗里耶
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 )
Run Code Online (Sandbox Code Playgroud)
伦迪
正如其他人所说,您不应该强迫自己狭隘的(美国英语?)大写概念。使用合适的日期时间库,让它自动为您本地化。
您正在使用可怕的旧日期时间类,这些类现在是遗留的,被 java.time 类取代。
该LocalDate
级表示没有时间一天和不同时区的日期,唯一的价值。
时区对于确定日期至关重要。对于任何给定时刻,日期因地区而异。例如,在法国巴黎午夜过后几分钟是新的一天,而在魁北克蒙特利尔仍然是“昨天” 。
以、、 或等格式指定正确的时区名称。永远不要使用 3-4 个字母的缩写,例如或因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。continent/region
America/Montreal
Africa/Casablanca
Pacific/Auckland
EST
IST
ZoneId z = ZoneId.of( "Asia/Kolkata" );
LocalDate today = LocalDate.now( z );
Run Code Online (Sandbox Code Playgroud)
要使用月份,请提取一个Month
枚举对象。星期几同上,DayOfWeek
。
打电话getDisplayName
。传递 aTextStyle
为缩写。通过 aLocale
来确定 (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 ) ;
Run Code Online (Sandbox Code Playgroud)
…和…
DayOfWeek dow = today.getDayOfWeek() ;
String dowNameQuébec = dow.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ;
String dowNameGermany = dow.getDisplayName( TextStyle.FULL , Locale.GERMANY ) ;
Run Code Online (Sandbox Code Playgroud)
该java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date
, Calendar
, & SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310。
使用符合JDBC 4.2或更高版本的JDBC 驱动程序,您可以直接与您的数据库交换java.time对象。不需要字符串或 java.sql.* 类。
从哪里获得 java.time 类?
该ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。