如果你的Java程序向处在不同时区或者不同国家的用户显示时间和日期,那么你需要了解Java日期类的一些更加高级的方面。在“使用JavaDate和Calendar类计算,定制和解析日期”的这篇文章里我们提供了对日期,日期数据的格式化,日期数据的解析和日期计算的一个概览。对于这些概念的深入的理解对于讨论更高级的诸如时区,国际化标准格式和SQL日期数据等这些有关日期的问题是关键的。
我们在本文中讨论的类将包含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("\nDisplayName:"+
localeFR.getDisplayName());
System.out.println("Country:"+localeFR.getCountry());
System.out.println("Language:"+localeFR.getLanguage());
//DisplaytheEnglish-USlocaleinFrench
System.out.println("\nenDisplayNameinFrench:"+
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("\n"+timeZoneFL.getDisplayName());
System.out.println("RawOffset:"+timeZoneFL.getRawOffset());
System.out.println("Usesdaylightsaving:"+timeZoneFL.useDaylightTime());
TimeZonetimeZoneLondon=TimeZone.getTimeZone("Europe/London");
System.out.println("\n"+timeZoneLondon.getDisplayName());
System.out.println("RawOffset:"+timeZoneLondon.getRawOffset());
System.out.println("Usesdaylightsaving:"+timeZoneLondon.useDaylightTime());
燭imeZonetimeZoneParis=TimeZone.getTimeZone("Europe/Paris");
System.out.println("\n"+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("\nDisplayforParisoffice.");
//PrinttheMiamitimezonedisplaynameinFrench
System.out.println(timeZoneMiami.getDisplayName(localeFrance));
//Setthetimezoneofthe
//dateFormatterParistoMiamitimezone.
dateFormatterParis.setTimeZone(timeZoneMiami);
//PrinttheformatteddateinFrench.
燬ystem.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.
燙onnectionconnection=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(rselse{
燬ystem.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数据库里保存和提取日期值
分享到:
相关推荐
Java高级编程涵盖了许多关键概念,这些概念在开发复杂的软件系统时尤为重要。让我们深入探讨一下标题和描述中提及的几个核心知识点: 1. **图形界面编程**:Java提供了丰富的图形用户界面(GUI)工具包,如JavaFX和...
以下是一些可能出现在Java高级工程师笔试题中的重要概念和主题: 1. **多线程与并发**:Java的并发处理能力是其强大之处,涉及到线程池、synchronized关键字、volatile、ThreadLocal、死锁、活锁和饥饿状态的理解及...
Java高级课程涵盖了Java编程语言的深入理解和应用...通过这个Java高级课程,你将能够掌握上述核心概念,并具备解决复杂编程问题的能力。无论是为了面试准备,还是提升项目开发能力,这都将是一次非常有价值的学习旅程。
这个压缩包包含的教学视频、阅读材料以及一个网址链接,将覆盖多个Java高级主题,以下将对这些知识点进行详细阐述。 1. **多线程**:Java的并发处理能力是其强大的特点之一。学习Java高级理论时,多线程是必修课。...
总而言之,Java高级语言编程进阶版是一本针对具有一定编程基础的Java爱好者的书籍,它覆盖了从泛型到多线程,再到国际化和MVC架构的多个高级主题,目标是帮助程序员提升他们的Java编程技能到一个新的层次。
通过《Java高级程序设计》-王路群-电子教案的学习,开发者可以深入理解这些概念,结合实际案例进行练习,从而提升自己的Java编程能力。这个压缩包中的PPT资源很可能是课程的讲义,包含了课程的主要内容和示例,对于...
在"java高级编程100实例"这个资源中,尽管实例数量可能未达到100,但它们仍然能为开发者提供宝贵的实践经验,帮助他们深入理解和掌握Java的高级特性。 1. **多线程编程**:Java提供了强大的并发支持,如Thread类和...
Java高级编程涵盖了许多重要的主题,这些主题对于提升Java开发者的技术水平至关重要。这组幻灯片很可能是为了深入探讨Java语言的复杂性和高级特性而设计的。以下是一些可能包含在"第8章 Java高级编程"中的关键知识点...
Java高级编程资料主要涵盖了许多Java开发中的核心概念和技术,这些技术是成为一名优秀的Java开发者不可或缺的知识。下面将分别从多线程、工具类和编程资料这三个方面进行深入的讲解。 首先,多线程是Java编程中的一...
《Java高级程序设计》是针对已经掌握了Java基础的开发者们深入学习的一门课程,由知名讲师王路群精心编撰的电子教案。本教程旨在帮助学员掌握Java编程的高级概念和技术,提升编程能力和解决问题的技巧。通过这个...
本教程集合了Java高级视频教程的配套PPT和演示代码,旨在帮助学习者深入理解并熟练掌握Java的高级知识。以下将对这些知识点进行详细阐述。 一、多线程与并发 在Java中,多线程处理能力是必不可少的技能。通过学习...
7. **第7章 JAVA高级应用**: 这一章可能涵盖了除上述内容外的其他高级Java话题,如反射、代理、注解、泛型等,这些都是Java进阶开发者必须掌握的技能。 8. **第8章 JAVA 8新特性**: Java8引入了大量新特性,如...
"java基础+java高级"这个标题暗示了我们将探讨Java语言的基础概念以及更高级的主题。让我们一起深入了解一下Java的世界。 首先,Java基础部分涵盖以下几个关键点: 1. **环境配置**:学习Java的第一步是安装JDK...
在Java编程语言中,日历(Calendar)类是处理日期和时间的核心类,它提供了丰富的功能来满足各种日期和时间操作需求。这个“java日历”项目可能涉及到以下几个知识点: 1. **Java.util.Calendar**: Java中的...
文档涵盖了日期计算的基本概念,包括如何计算两个日期之间的差异,如何格式化日期以及如何处理时区。此外,文档还提供了各种日期计算任务的详细代码示例和实现细节。 文档还涵盖了高级主题,如如何处理闰年以及如何...
Java是一种广泛使用的面向对象的...随着学习的深入,你将能够解决更复杂的问题,进一步探索Java的高级特性和框架。记住,实践是最好的老师,动手编写代码并不断调试是提升技能的关键。祝你在Java编程的道路上越走越远!
"Java培训高级"这个主题聚焦于深入理解Java编程语言的核心概念、高级特性以及最佳实践,这对于提升个人或团队的编程技能至关重要。本培训课程的目标是帮助学员从初级阶段跃升至精通Java的高级开发者水平。 在Java...
在Java编程语言中,处理日期和时间是常见的需求之一,特别是在开发涉及日志记录、数据分析、用户界面等领域的...随着Java语言的不断演进,开发者们也应该关注新的日期时间API,以利用其更高级的功能和更简洁的语法。
总之,《Java核心技术:高级部分第10版 - Java 8 介绍》这本书详尽地阐述了Java 8的关键特性,包括Lambda表达式、Stream API、方法引用、默认方法、日期和时间API的更新、CompletableFuture以及Optional等,是Java...
6. **Java 8新特性**:Lambda表达式、Stream API、日期时间API的改进。 此外,可能还包含实战项目和面试题解析,帮助学习者将理论知识应用于实际开发,并为求职做好准备。 总之,这个Java私塾教材资料大全是一套...