动态数据的国际化
数值,货币,时间,日期等数据由于可能在程序运行时动态产生,所以无法像文字一样简单地将它们从应用程序中分离出来,而是需要特殊处理。
Java 中提供了解决这些问题的 API 类(位于 java.util 包和 java.text 包中)
1.Locale 类
•Locale 实例对象代表一个特定的地理,政治、文化区域。
•一个 Locale 对象本身不会验证它代表的语言和国家地区信息是否正确,只是向本地敏感的类提供国家地区信息,与国际化相关的格式化和解析任务由本地敏感的类去完成。
(若JDK中的某个类在运行时需要根据 Locale 对象来调整其功能,这个类就称为本地敏感类)
2.java.text.DateFormat类
DateFormat 类可以将一个日期/时间对象格式化为表示某个国家地区的日期/时间字符串,项目中不提倡用Date类型。
DateFormat 类除了可按国家地区格式化输出日期外,它还定义了一些用于描述日期/时间的显示模式的 int 型的常量,
包括FULL, LONG, MEDIUM, DEFAULT, SHORT,实例化DateFormat对象时,可以使用这些常量,控制日期/时间的显示长度。
中文:
short:11-11-1
default:2011-11-1
medium:2011-11-1
long:2011年11月1日
full:2011年11月1日 星期二
英文:
short:11/1/11
default:Nov 1, 2011
medium:Nov 1, 2011
long:November 1, 2011
full:Tuesday, November 1, 2011
DateFormat 对象的方法:
•format: 将日期/时间对象格式化为符合某个本地环境习惯的字符串。
•parse:将符合某个本地环境习惯的日期/时间字符串解析为日期/时间对象
•注意:parse和format完全相反,一个是把date时间转化为相应地区和国家的显示样式,一个是把相应地区的时间日期转化成date对象,该方法在使用时,解析的时间或日期要符合指定的国家、地区格式,否则会抛异常。
•解析:2010年9月33日有异常吗?不会抛异常,会显示不正确。
DateFormat对象通常不是线程安全的,每个线程都应该创建自己的 DateFormat实例对象,ThreadLocal<DateFormat>
1 import java.text.DateFormat; 2 import java.text.ParseException; 3 import java.util.Date; 4 import java.util.Locale; 5 6 public class Demo1 { 7 public static void main(String[] args) throws ParseException { 8 9 /*DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, Locale.US); 10 DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, Locale.US); 11 System.out.println(df.format(new Date()));*/ 12 /*DateFormat df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.CHINA); 13 System.out.println(df.format(new Date()));*/ 14 15 String str = "2011年11月33日 星期二"; 16 DateFormat df = DateFormat.getDateInstance(DateFormat.FULL,Locale.CHINA); 17 Date date = df.parse(str); 18 System.out.println(df.format(date)); 19 } 20 }
Date->Calendar(日历)->DateFormat->SimpleDateFormat
1 import java.text.SimpleDateFormat; 2 import java.util.Calendar; 3 import java.util.Date; 4 import java.util.Locale; 5 6 //演示SimpleDateFormat和Calendar的用法 7 public class Demo2 { 8 public static void main(String[] args) throws Exception { 9 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",Locale.CHINA); 10 Date date = sdf.parse("2011-11-1"); 11 Calendar c = Calendar.getInstance(Locale.CHINA); 12 c.setTime(date); 13 System.out.println(c.get(Calendar.YEAR)+"年"); 14 System.out.println(c.get(Calendar.MONTH)+1+"月"); 15 System.out.println(c.get(Calendar.DATE)+"日"); 16 System.out.println(c.get(Calendar.DAY_OF_WEEK));//1(星期天) 17 System.out.println(c.get(Calendar.DAY_OF_MONTH));//1 18 System.out.println(c.get(Calendar.DAY_OF_YEAR));// 19 } 20 }
1 <% 2 TimeZone tz = TimeZone.getDefault(); 3 pageContext.setAttribute("tz",tz); 4 %> 5 <jsp:useBean id="now" class="java.util.Date" scope="page"/> 6 中国 7 <fmt:timeZone value="${tz}"> 8 <fmt:formatDate value="${now}" type="both" dateStyle="full" timeStyle="full"/> 9 </fmt:timeZone> 10 <hr/> 11 美国 12 <fmt:timeZone value="GMT-06:00"> 13 <fmt:formatDate value="${now}" type="both" dateStyle="full" timeStyle="full"/> 14 </fmt:timeZone> 15 <br/> 16 <fmt:formatDate value="${now}" pattern="yyyy/MM/dd hh:mm:ss" 17 timeZone="GMT-06:00"/>
by hacket