|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
手机用到的是用j2me所编出来的小程序。观点|初级
Java初级日期观点
假如你的Java程序向处在分歧时区大概分歧国度的用户显现工夫和日期,那末你必要懂得Java日期类的一些加倍初级的方面
。
本文中会商的类将包括java.text.DateFormat,和java.util.TimeZone和java.util.Locate。我们还将会商怎样利用一个java.util.Date的子类java.sql.Date来从Oracle数据库里提取和保留Java日期数据。
区域的成绩
在我们国际化我们的日期数据之前,我们必要进一步的进修Locale类,也就是java.util.Locale。Locale类的一个实例一般包括国度和言语信息。个中的每个部分都是由基于国际尺度化构造(ISO)制订的国度代码ISO-3166和言语代码ISO-639的两字符的字符串组成的。
让我们来创立两个Locale实例,个中一个对应的是美国英语而另外一个对应的是法公法语。见表A。
表A
importjava.util.Locale;
publicclassDateExample6{
publicstaticvoidmain(String[]args){
//CreatealocalefortheEnglishlanguageintheUS.
LocalelocaleEN=newLocale("en","US");
System.out.println("DisplayName:"+
localeEN.getDisplayName());
System.out.println("Country:"+localeEN.getCountry());
System.out.println("Language:"+localeEN.getLanguage());
//CreatealocalefortheFrenchlanguageinFrance.
LocalelocaleFR=newLocale("fr","FR");
System.out.println("
DisplayName:"+
localeFR.getDisplayName());
System.out.println("Country:"+localeFR.getCountry());
System.out.println("Language:"+localeFR.getLanguage());
//DisplaytheEnglish-USlocaleinFrench
System.out.println("
enDisplayNameinFrench:"+
localeEN.getDisplayName(localeFR));
}
}
在这个例子中,我们用getDisplayName办法来显现Locale的一个更容易读的文本。你还应当注重到我们在最初一次挪用getDisplayName的时分,我们在对EnglishLocale对象挪用getDisplayName的时分同时传送了FrenchLocale对象。这同意我们选择显现Locale对象所用的言语,让我们用英语显现法语Locale对象的内容。上面是这个例子的输入:
DisplayName:English(UnitedStates)
Country:US
Language:en
DisplayName:French(France)
Country:FR
Language:fr
enDisplayNameinFrench:anglais(états-Unis)
多个地区的日期格局化
利用java.util.Locale和java.text.DateFormat类我们就可以够格局化日期数据把它显现给在另外一个地区的用户,例如法国。表B中的例子为英语和法语各创立了一个完全的日期格局化器。
表B
importjava.util.Locale;
importjava.util.Date;
importjava.text.DateFormat;
publicclassDateExample7{
publicstaticvoidmain(String[]args){
//Getthecurrentsystemdateandtime.
Datedate=newDate();
//GetaFrancelocaleusingaLocaleconstant.
LocalelocaleFR=Locale.FRANCE;
//CreateanEnglish/USlocaleusingtheconstructor.
LocalelocaleEN=newLocale("en","US");
//GetadatetimeformatterfordisplayinFrance.
DateFormatfullDateFormatFR=
DateFormat.getDateTimeInstance(
DateFormat.FULL,
DateFormat.FULL,
localeFR);
//GetadatetimeformatterfordisplayintheU.S.
DateFormatfullDateFormatEN=
DateFormat.getDateTimeInstance(
DateFormat.FULL,
DateFormat.FULL,
localeEN);
System.out.println("Locale:"+localeFR.getDisplayName());
System.out.println(fullDateFormatFR.format(date));
System.out.println("Locale:"+localeEN.getDisplayName());
System.out.println(fullDateFormatEN.format(date));
}
}
这个例子的输入是:
Locale:French(France)
vendredi5octobre200121h05GMT-04:00
Locale:English(UnitedStates)
Friday,October5,20019:05:54PMEDT
注重这个输入包含了时区信息:GMT-04:00和PMEDT。这个时区是人体系的时区设置里捕捉的。你能够瞥见,日期是以谁人区域的用户希冀的格局显现的。让我们等一上去看看时区的观点。
时区
TimeZone类,即java.util.TimeZone类的实例包括了一个与格林威治本定时间(GMT)比拟较得出的以微秒为单元的时区偏移量,并且它还处置夏令时
。要取得一个一切撑持的进区的列表,你可使用办法TimeZone.getAvailableIDs,它将前往一个包括了一切进区ID的字符串数组。要晓得关于TimeZone类的更多细节,能够参看Sun公司的Web站点。
为了演示这个观点,我们将创立三个时区对象。第一个对象将利用getDefault从体系时钟前往时区数据;第二个和第三个对象将传进一个时区字符串ID。见表C中的代码。
表C
importjava.util.TimeZone;
importjava.util.Date;
importjava.text.DateFormat;
importjava.util.Locale;
publicclassDateExample8{
publicstaticvoidmain(String[]args){
//Getthesystemtimezone.
TimeZonetimeZoneFL=TimeZone.getDefault();
System.out.println("
"+timeZoneFL.getDisplayName());
System.out.println("RawOffset:"+timeZoneFL.getRawOffset());
System.out.println("Usesdaylightsaving:"+timeZoneFL.useDaylightTime());
TimeZonetimeZoneLondon=TimeZone.getTimeZone("Europe/London");
System.out.println("
"+timeZoneLondon.getDisplayName());
System.out.println("RawOffset:"+timeZoneLondon.getRawOffset());
System.out.println("Usesdaylightsaving:"+timeZoneLondon.useDaylightTime());
TimeZonetimeZoneParis=TimeZone.getTimeZone("Europe/Paris");
System.out.println("
"+timeZoneParis.getDisplayName());
System.out.println("RawOffset:"+timeZoneParis.getRawOffset());
System.out.println("Usesdaylightsaving:"+timeZoneParis.useDaylightTime());
}
}
其输入以下:
EasternStandardTime
RawOffset:-18000000
Usesdaylightsaving:true
GMT+00:00
RawOffset:0
Usesdaylightsaving:true
CentralEuropeanStandardTime
RawOffset:3600000
Usesdaylightsaving:true
正如你所瞥见的,TimeZone对象给我们的是原始的偏移量,也就是与GMT相差的微秒数,并且还会告知我们这个时区是不是利用夏令时。有个这个信息,我们就可以够持续将时区对象和日期格局化器分离在一同在别的的时区和别的的言语显现工夫了。
国际化的时代显现了时区转换
让我们来看一个分离了国际化显现,时区和日期格局化的例子。表D为一个在迈阿密和巴黎具有办公室的公司显现了以后的完全日期和工夫。关于迈阿密的办公室,我们将在每一个办公室里用英语显现完全的日期和工夫。关于巴黎的办公室,我们将用法语显现完全确当前日期和工夫。
表D
importjava.util.TimeZone;
importjava.util.Date;
importjava.util.Locale;
importjava.text.DateFormat;
publicclassDateExample9{
publicstaticvoidmain(String[]args){
LocalelocaleEN=Locale.US;
LocalelocaleFrance=Locale.FRANCE;
TimeZonetimeZoneMiami=TimeZone.getDefault();
TimeZonetimeZoneParis=TimeZone.getTimeZone("Europe/Paris");
DateFormatdateFormatter=DateFormat.getDateTimeInstance(
DateFormat.FULL,
DateFormat.FULL,
localeEN);
DateFormatdateFormatterParis=DateFormat.getDateTimeInstance(
DateFormat.FULL,
DateFormat.FULL,
localeFrance);
DatecurDate=newDate();
System.out.println("DisplayforMiamioffice.");
//PrinttheMiamitimezonedisplaynameinEnglish
System.out.println(timeZoneMiami.getDisplayName(localeEN));
//SetthetimezoneofthedateFormattertoMiamitimezone.
dateFormatter.setTimeZone(timeZoneMiami);
//Printtheformatteddate.
System.out.println(dateFormatter.format(curDate));
//SetthetimezoneofthedateformattertoParistimezone.
dateFormatter.setTimeZone(timeZoneParis);
//PrinttheParistimezonedisplaynameinEnglish.
System.out.println(timeZoneParis.getDisplayName(localeEN));
//PrinttheParistimeinenglish.
System.out.println(dateFormatter.format(curDate));
System.out.println("
DisplayforParisoffice.");
//PrinttheMiamitimezonedisplaynameinFrench
System.out.println(timeZoneMiami.getDisplayName(localeFrance));
//Setthetimezoneofthe
//dateFormatterParistoMiamitimezone.
dateFormatterParis.setTimeZone(timeZoneMiami);
//PrinttheformatteddateinFrench.
System.out.println(dateFormatterParis.format(curDate));
//SetthetimezoneofthedateformattertoParistimezone.
dateFormatterParis.setTimeZone(timeZoneParis);
//PrinttheParistimezonedisplaynameinFrench.
System.out.println(timeZoneParis.getDisplayName(localeFrance));
//PrinttheParistimeinFrench.
System.out.println(dateFormatterParis.format(curDate));
}
}
这个例子的输入是:
DisplayforMiamioffice.
EasternStandardTime
Friday,October5,200110:28:02PMEDT
CentralEuropeanStandardTime
Saturday,October6,20014:28:02AMCEST
DisplayforParisoffice.
GMT-05:00
vendredi5octobre200122h28GMT-04:00
GMT+01:00
samedi6octobre200104h28GMT+02:00
在一个SQL数据库中保留和提取日期数据
我们将要利用的下一个类是java.sql.Date,它是java.util.Date的子类但它利用了Java数据库毗连(JDBC)办法
。让我们来看一个复杂的只要一个表单--LAST_ACCESS的ORACLE数据库,它是用上面的SQL创立的:
createtableLAST_ACCESS(
LAST_HITdate
);
这个表单只要一个纪录,用上面的拔出语句创立:
insertintoLAST_ACCESSvalues(Sysdate);
表E演示了怎样修正和提取LAST_HIT数据库域。
表E
importjava.sql.*;
importjava.text.DateFormat;
importjava.util.Date;
publicclassDateExample10{
publicstaticvoidmain(String[]args){
//Getafulldateformatter.
DateFormatdateFormatter=DateFormat.getDateTimeInstance(
DateFormat.FULL,
DateFormat.FULL);
//Getthesystemdateandtime.
java.util.DateutilDate=newDate();
//Convertittojava.sql.Date
java.sql.Datedate=newjava.sql.Date(utilDate.getTime());
//Displaythedatebeforestoring.
System.out.println(dateFormatter.format(date));
//Savethedatetothedatabase.
setLastHit(date);
//Getthedatefromthedatabase.
DatedateFromDB=getLastHit();
//Displaythedatefromthedatabase.
System.out.println(dateFormatter.format(dateFromDB));
}
publicstaticvoidsetLastHit(java.sql.Datedate){
try{
//Loadtheclass.
Class.forName("oracle.jdbc.driver.OracleDriver");
//Getaconnection.
Connectionconnection=DriverManager.getConnection(
//DatabaseURL
"jdbc:oracle:thin:@localhost:1521:buzz2",
"web_site",//Username
"web_site");//Password
try{
/Getapreparedstatementfromtheconnection
//specifyingtheupdateSQL.
PreparedStatementps=connection.prepareStatement(
"updateLAST_ACCESSsetLAST_HIT=");
try{
/setthedatelettingJDBCtotheworkof
//formattingtheSQLappropriately.
ps.setDate(1,date);
//Executetheupdatestatement.
intiRowsUpdated=ps.executeUpdate();
System.out.println("Rowsupdated:"+iRowsUpdated);
}finally{
ps.close();
}
}finally{
connection.close();
}
}catch(Exceptionex){
System.out.println("Error:"+ex.getMessage());
}
}
publicstaticjava.sql.DategetLastHit(){
java.sql.DatereturnDate=null;
try{
//Loadthedriverclass.
Class.forName("oracle.jdbc.driver.OracleDriver");
//Gettheconnection.
Connectionconnection=DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:buzz2",
"web_site","web_site");
try{
/Getthepreparedstatementspecifyingthe
//selectSQL.
PreparedStatementps=connection.prepareStatement(
"selectLAST_HITfromLAST_ACCESS");
try{
//ExecutetheSQLandgettheResultSetobject.
ResultSetrs=ps.executeQuery();
try{
//Retreivetherecord.
if(rs.next()){
//Returnthelasthitdate.
returnDate=rs.getDate("LAST_HIT");
System.out.println(
"Successfullyretrievedlasthit.");
}else{
System.out.println("Didnotgetlasthit.");
}
}
finally{
rs.close();
}
}finally{
ps.close();
}
}finally{
connection.close();
}
}catch(Exceptionex){
System.out.println("Error:"+ex.getMessage());
}
returnreturnDate;
}
}
这个例子的输入以下:
Friday,October5,200110:42:34PMEDT
Rowsupdated:1
Successfullyretrievedlasthit.
Friday,October5,200112:00:00AMEDT
固然这个例子没无为保留和提取日期数据供应功能上优秀的办法,但它的确树模了怎样为一条更新和删除语句将Java日期数据转换成SQL日期数据。从一个java.util.Date对象设置Oracledate数据域的历程是由以下的语句处置的:
ps.setDate(1,date);
它是我们预界说语句接口java.sql.PreparedStatement.setDate的一个办法。
这行代码呈现在我们的setLastHit办法里。它将Java以微秒为单元的长整型日期值转换成ORACLE的SQL日期格局。当我们可以在getLastHit办法里用java.sql.PreparedStatement.getDate从数据库获得日期数据的时分这类转换就可以够完成。
你还应当注重到只要日期被设置了。小时,分钟,秒,和微秒都没有包含在从Java日期数据到SQL日期数据的转换过程当中。
结论
一旦你把握了这些观点,你就应当可以基于体系工夫大概一个输出的工夫创立日期对象了。别的,你还应当可以利用尺度和定制的格局化历程格局化日期数据,将文本的日期数据剖析成日期对象,并以多种言语和多种时区显现一个日期数据。最初,你将可以在一个SQL数据库里保留和提取日期值。
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译) |
|