??xml version="1.0" encoding="utf-8" standalone="yes"?>
ȝq?/font>
Subversion是近期在开源社Z非常行的一Ƅ本控制YӞ它是CVS的替代物?/p>
它的主要特征有: 其他q有些零星的功能,具体可以参阅Q?http://subversion.tigris.org/roadmap.html q里解释一?数据仓库 的概念: Subversion 1.2.3: TortoiseSVN: Apache 2.0.55: 下面说一下安装,分两U^収ͼwindowsQlinuxQ及两种模式Q与Apachel定 vs. Stand-aloneQ?br />具体在Apache上的配置倒是大同异?/p>
另外QSVN是支持SSL的,但是q个配置牉|到其他太多东西,本文׃q多涉及了。真的有需要可以参考SVN的手册(英文Q?/p>
方便赯Q用几个变量代表具体的|误行加以调_
%SystemRoot% ?windows的系l所在目录,一般类DPC:\WINNT 另外Q安装过E默认用文件系l做后台数据库,文中不再加以说明。如需使用BerkeleyDBQ请自行参考SVN文档?/p>
Windows上的服务器端安装
1.双击下蝲得来的”svn-1.2.3-setup.exe”ƈ安装到?SVN_HOME%?/p>
2.安装完毕后,?SVN_HOME%\bin”应该已l自动加入到pȝ路径Q?PATH%Q中。如果没有,h工添加?/p>
3.用命令行来测试安装结果是否正: 如果q回q样的错误信息:”svnadmin.exe - Unable To Locate DLL”,那就需要尝试一下步骤的中的一U或几种Q?br />安装VC++ 6.0Q主要是安装VC的运行库Q?br />或者直接从别的机器上拷贝一个”msvcp60.dll”文件到本机的?SystemRoot%\system32″下 4.使用以下命o创徏一个数据仓库,用来存放目的源代码和其他文Ӟ 5.其中%SVN_REPO_PARENT%是包含所有数据仓库的目录Q?PROJECT_NAME%是所创徏的数据仓库对应的目名?/p>
6.从命令行启动SVN ServerQ?/p>
注意里面的参?r 限定了浏览全部数据仓库的根目?/p>
当然如果觉得每次q样启动太麻烦的话,也有SVN Serveice的包装程序(http://dark.clansoft.dk/~mbn/svnservice/Q。通过它能够以windows service的方式运行SVN ServerQ其本质q是Stand-aloneQ,q行h相对比较方便?/p>
7.创徏用户数据库(其实是一个txt文本Q就叫它”users.conf”吧Q你也可以改名)Q保存到 注意q里密码是明文存攄Q所以也是这U方式的不之处?/p>
8.在?SVN_REPO_PARENT%\%PROJECT_NAME%\conf”目录下扑ֈq个”svnserve.conf”文Ӟ用Q何文本编辑器打开Qؓ刚才创徏的那些用h加读写权限: 里面的”users.conf”就是刚才在W?步创建的用户文g?/p>
9.最后,重启SVN ServerQ什么?你不知道怎么重启Q关掉窗口再重新用命令行启动啦;包装成Service的话么就更加单了Q?/p>
现在已经可以使用客户端来q接SVN ServerQ进行import{操作了?br />q接Server的URL应该是类DL(fng)Q?/p>
具体步骤Q请参阅W?0步?/p>
10.首先要了解的是SVN设计的时候只考虑了兼容Apache2.xQ所以在Apache1.x下是不能正常工作的?/p>
11.安装Apache2 12.查Apache2的安装是否成?br />打开览器,讉KQ?http://localhost/ 13.打开Apache的配|文Ӟ ?APACHE_HOME%\conf\httpd.conf?br />查找”LoadModule”这个关键字Q找到导入模块的区块QsectionQ?br />反注释掉下面q样Q从而加载Subversion所需要的DAV模块Q?/p>
完成之后看v来应该是q样Q?/p>
另外在这行下面再d两行Q请注意把\径中的”\”替换成?”)Q?/p>
特别需要注意的是:׃模块依赖关系Q这三行的出现顺序千万不能颠?/font>?/p>
14.再来配置一下”httpd.conf”的其他部分Q告诉Apache2 SVN的数据仓库所在?br />Qؓ避免不必要的ȝQ所有\径中的”\”都h换成?”) d下述内容Q?/p>
q里涉及C个文? ?SVN_REPO_PARENT%/AccessFile???SVN_REPO_PARENT%/passwd? 15.保存”httpd.conf”ƈ退出,q里Apache2的配|告一D落?/p>
16.?SVN_REPO_PARENT%/AccessFile”文件的内容 其中Q?/p>
你可以根据需要来讑֮不同的权限,更详l的说明q需要参考SVN文档中的权限讄章节?/p>
17.?SVN_REPO_PARENT%/passwd”文件的内容 此时用文本编辑器打开?SVN_REPO_PARENT%/passwd”,可以看到里面内容是类DL(fng)Q?/p>
18.把SVN自带的XSLT文g拯到网站根目录Q?br />然后讄合理权限Qwindowsq_则不必考虑Q?/p>
19. 重启Apache2服务Q?/p>
20.打开览器,讉KQhttp://%SERVER_NAME_OR_IP%/svn/
21.和CVS一PSVN在最初的时候需要将已有目导入到数据库中?br />从命令行执行以下命oQStand-aloneQ: 或者(Apache2 moduleQ: 其中Q?br />A) c:\temp\myproject里面包含了你所要导入的目文g的内?br />B) %SERVER_NAME_OR_IP%是SVN Server的名字或者IP地址Q上面存有第5步中创徏的数据仓?br />C) %PROJECT_NAME%是要导入到的数据仓库名称Q这里选择跟项目名一?br />D) 参数 m 表明此次导入操作的注释,SVN的注释是按每ơ提交来定义的,导入也是提交的一U?br />E) your_username和your_password是第7?7步创建的用户及密码,注意该用户必d上面?PROJECT_NAME%数据仓库有写权限才能成功?/p>
22.然后Q需要从Server端再ơcheckout到本圎ͼ 注意Q?br />“co”是”checkout”的一个别?br />那个点[.]代表当前目录Qcheckout出来的文件会自动攑ֈq个目录下。也可以改ؓ某个l对路径?/p>
23.对于向SVN Serer增加Q移动,删除Q或者修改后提交某些文gQ参考用以下命令: 对于上面的客L(fng)操作Q如果安装了TortoiseSVNQ一切就变得单多了?br />不过q个p抓图来说明了。等有空的时候再放上来?/p>
使用Eclipse的朋友还可以参考这里: http://subclipse.tigris.org/ 另外Q具体的讄Q参数说明等q是需要自己去查阅SVN的文档(在安装server端的时候已l附带) 参考文献及资料Q?br />_________________________________________
http://subversion.tigris.org/
一般验证码属于数字型的Q不q有的图片中生成了不彩色和黑白的噪音点Q指验证囄上的斑点Q。那么我们应该怎么去识别呢Q传l的验证码识别方式很单,׃数字的位|是固定的,所以我们只需要提取每一q数字的囄Q没有噪音点的)然后把每一个特D数字独有的象素位置记录下来Q然后在|络上提取需要破解的特征码,除噪音点,对其位置和记录位|进行比对,那就是么p定相应的数字了?/p> ȝ一下传l的是Q?/p> 1.先分析验证码,前景颜色是否不定 2.然后把验证码的宽?验证码文字个?比如一验证码下载后宽度?0,?个数?那么?0/4=15,然后保存每个?如果只有数字保存0-9数字C图文?如果英文那更ȝ?0-9,A-Z都要保存C?位图的前景色都不?保持一U颜?背景随便你改不改 3.如果前景要变则将文字l一为同U颜?每个数字0-9的点阵都有个公共?取该公共炚w色然后把前景全部l一成一U颜?比如白色{255,255,255},位图的结构是BGR,而不是RGB 4.然后q行比较,如果验证码的一点ؓ白色,W?步保存的位图同一点也是白?那么频率增加1 5.最后频率最高的是验证码了! 接下来要做的是做个postE序了,q个太简单了Q代码你p己写吧!不过也要做到如下l节Q做成多U程E序q行发脓(chung)Q不然程序会失去响应的。最好是可以导入大量的代理IP的,然后是发脓(chung)的内Ҏ(gu)后加上几个随机字W,q样可以防止重复贴的qoQ最重要的,只是做测试,发脓(chung)量不要太多、不要ؕ发广告脓(chung)Q?/p> 其实上述Ҏ(gu)已经不是只是寚w证码q行识别了,完全可以用到现实生活中去Q比如说手写体识别、R牌识别等{,但是现实生活中我们还要进行更多的加工Q比如说圆Ş,多边形检等{。所以说从网l安全技术中Q也有很多东西能造福C会Q还{待我们l箋创造! Java中一些关于日期、日期格式、日期的解析和日期的计算
Java 语言的Calendar(日历),Date(日期), 和DateFormat(日期格式)l成了Java标准的一个基本但是非帔R要的部分. 日期是商业逻辑计算一个关键的部分. 所有的开发者都应该能够计算未来的日? 定制日期的显C格? q将文本数据解析成日期对? 我们写了两篇文章, q是W一? 我们大概的学习日期, 日期格式, 日期的解析和日期的计?
我们讨Z面的c?
1、具体类(和抽象类相对)java.util.Date
具体cd以被实例? 但是抽象cd不能. 你首先必d现抽象类的一个具体子c?
Date cMJava 开发包(JDK) 1.0 开始进? 当时它只包含了几个取得或者设|一个日期数据的各个部分的方? 比如说月, ? 和年. q些Ҏ(gu)现在遭到了批评ƈ且已l被转移CCalendarc里M, 我们在本文中进一步讨论它. q种改进旨在更好的处理日期数据的国际化格? p在JDK 1.1中一? Date cd际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林治标准旉)1970q? 1 ?1?0:00:00q一M前或者是之后l历的毫U数.
一、创Z个日期对?
让我们看一个用系l的当前日期和时间创Z个日期对象ƈq回一个长整数的简单例? q个旉通常被称为Java 虚拟?JVM)L环境的系l时?
public class DateExample1
System.out.println(date.getTime());
在星期六, 2001q??9? 下午大约?:50的样? 上面的例子在pȝ输出讑֤上显C的l果?1001803809710. 在这个例子中,值得注意的是我们使用了Date 构造函数创Z个日期对? q个构造函数没有接受Q何参? 而这个构造函数在内部使用了System.currentTimeMillis() Ҏ(gu)来从pȝ获取日期.
那么, 现在我们已经知道了如何获取从1970q??日开始经历的毫秒C. 我们如何才能以一U用h白的格式来显C个日期呢? 在这里类java.text.SimpleDateFormat 和它的抽象基c?java.text.DateFormat 派得上用场?
二、日期数据的定制格式
假如我们希望定制日期数据的格? 比方星期?9?29?2001q? 下面的例子展CZ如何完成q个工作:
//------------------------------------------------------
public class DateExample2
public static void main(String[] args)
SimpleDateFormat bartDateFormat =
Date date = new Date();
System.out.println(bartDateFormat.format(date));
只要通过向SimpleDateFormat 的构造函C递格式字W串"EEE-MMMM-dd-yyyy", 我们p够指明自己想要的格式. 你应该可以看? 格式字符串中的ASCII 字符告诉格式化函C面显C日期数据的哪一个部? EEEE是星? MMMM是月, dd是日, yyyy是年. 字符的个数决定了日期是如何格式化?传?EE-MM-dd-yy"会显C?Sat-09-29-01. 请察看Sun 公司的Web 站点获取日期格式化选项的完整的指示.
三、将文本数据解析成日期对?
假设我们有一个文本字W串包含了一个格式化了的日期对象, 而我们希望解析这个字W串q从文本日期数据创徏一个日期对? 我们再ơ以格式化字W串"MM-dd-yyyy" 调用SimpleDateFormatc? 但是q一? 我们使用格式化解析而不是生成一个文本日期数? 我们的例? 昄在下? 解析文本字W串"9-29-2001"q创Z个gؓ001736000000 的日期对?
//------------------------------------------------------
public class DateExample3
public static void main(String[] args)
// Create a string containing a text date to be parsed.
try {
// Now send the parsed date as a long value
四、用标准的日期格式化过E?
既然我们已经可以生成和解析定制的日期格式? 让我们来看一看如何用内建的格式化过E? Ҏ(gu) DateFormat.getDateTimeInstance() 让我们得以用几种不同的方法获得标准的日期格式化过E? 在下面的例子? 我们获取了四个内建的日期格式化过E? 它们包括一个短? 中等? 长的, 和完整的日期格式.
//------------------------------------------------------
public class DateExample4
public static void main(String[] args)
DateFormat shortDateFormat =
DateFormat mediumDateFormat =
DateFormat longDateFormat =
DateFormat fullDateFormat =
System.out.println(shortDateFormat.format(date));
注意我们在对 getDateTimeInstance的每ơ调用中都传递了两个? W一个参数是日期风格, 而第二个参数是时间风? 它们都是基本数据cdint(整型). 考虑到可L? 我们使用了DateFormat cL供的帔R: SHORT, MEDIUM, LONG, ?FULL. 要知道获取时间和日期格式化过E的更多的方法和选项, L(fng)Sun 公司Web 站点上的解释.
q行我们的例子程序的时? 它将向标准输备输Z面的内容:
五、Calendar c?
我们现在已经能够格式化ƈ创徏一个日期对象了, 但是我们如何才能讄和获取日期数据的特定部分? 比如说小? ? 或者分? 我们又如何在日期的这些部分加上或者减d呢? {案是用Calendar c? 如我们前面提到的那? Calendar cM的方法替代了Date cM被hN的方?
假设你想要设|? 获取, 和操U一个日期对象的各个部分, 比方一个月的一天或者是一个星期的一? Z演示q个q程, 我们用具体的子类 java.util.GregorianCalendar. 考虑下面的例? 它计得C面的W十个星期五?3?
//------------------------------------------------------
public class DateExample5
public static void main(String[] args)
// Create our Gregorian Calendar.
System.out.println("System Date: " +
// Set the day of week to FRIDAY
int friday13Counter = 0;
// Go to the next Friday by adding 7 days.
// If the day of month is 13 we have
在这个例子中我们作了有趣的函数调?
?
set Ҏ(gu)能够让我们通过单的讄星期中的哪一天这个域来将我们的时间调整ؓ星期? 注意到这里我们用了帔R DAY_OF_WEEK ?FRIDAY来增Z码的可读? add Ҏ(gu)让我们能够在日期上加上数? 润年的所有复杂的计算都由q个Ҏ(gu)自动处理.
我们q个例子的输出结果是:
六、时间掌握在你的手里
Subversion(SVN)安装使用指南
一个数据仓库对应的可以是一个项目,也可以是多个目。SVN是基于数据仓库进行管理的?br />按照用户习惯Q可以只在每个数据仓库内仅放|一个项目的内容?/p>
M载?/font>
http://subversion.tigris.org/project_packages.html
QSVN的Server端,分不同操作系l的版本Q这里我下蝲的是for windows及for linux的)
http://tortoisesvn.tigris.org/download.html
Qwindows下的SVN客户端,以shell方式集成在系l右键菜单中Q?/p>
http://httpd.apache.org/download.cgi
Q视操作pȝ而下Q?/p>
d装用?/font>
%SVN_HOME% ?SVN的安装目?br />%SVN_REPO_PARENT% ?SVN所有数据仓库的根目录(是存放全部版本文g的ȝ录)
%PROJECT_NAME% ?目名,严格的来说它对应的是一个数据仓库,但是q里遵从用户习惯Q以目名称方式来命名?br />%SERVER_NAME_OR_IP% ?服务器名或IP地址
%APACHE_HOME% ?Apache2的安装\?/p>
____________________________________________
*************************
* ?Stand-alone 模式q行 *
*************************
%SVN_REPO_PARENT%\%PROJECT_NAME%\conf
目录Q那个conf子文件夹在创建数据仓库时已被自动创徏好)Q然后在q个文g内添加需要的用户名和密码。基本的样例如下Q?/p>
************************
* 以Apache的模块方式运?*
************************
如果事先启动了IIS之类的其他webserverQ请先停止那些服务(端口被占用会DApache安装p|Q?br />其他问题可以参考Apache的安装手册?br />q里假设安装目录为:%APACHE_HOME%
如果出现的是默认的欢q页面,那就没有问题了。否则请仔细查,重新安装?/p>
注意Q?/p>
q不一定非要放到?SVN_REPO_PARENT%”目录下Q我图方便而已。觉得不安全可以Ud另外地方?br />q两个文仉面具体内容的讄请参考第16?7步?/p>
q个文g是通过?APACHE_HOME%\bin\htpasswd.exe”自动生成的Q?/p>
如果q回的页面是?03 Forbidden”,可能是由于Apache2默认没有打开目录的浏览权限(Option IndexesQ参阅Apache2文档Q,但这q不影响使用?br />现在已经可以用客L(fng)导入目q开始用了?br />具体步骤Q请参阅W?0步?/p>
***********************************************
* 注意Q以下步?命o需要在装有SVN客户端的机器上执?*
* Windows下安装服务器端的时候已l同时安装了客户?*
* Linux下尚待查证?*
***********************************************
Q这Ҏ(gu)觉不是太方便Qؓ啥不做成import的时候有个选项Q本地目录可以自动生成版本信息呢Q)
Lȝ?/font>
它以插g的Ş式向Eclipse提供了SVN的支持?/p>
http://www-128.ibm.com/developerworks/cn/opensource/os-subversion/
http://www.javayou.com/showlog.jspe?log_id=972
]]>
]]>
------------产生验证码图片的文g-----image.jsp-------------------------------------------
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
Color getRandColor(int fc,int bc){//l定范围获得随机颜色
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
%>
<%
//讄面不缓?br />response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
// 在内存中创徏图象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取囑Ş上下?br />Graphics g = image.getGraphics();
//生成随机c?br />Random random = new Random();
// 讑֮背景?br />g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);
//讑֮字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
//画边?br />//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);
// 随机产生155条干扰线Q图象中的认证码不易被其它E序探测?br />g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}
// 取随Z生的认证?4位数?
String sRand="";
for (int i=0;i<4;i++){
String rand=String.valueOf(random.nextInt(10));
sRand+=rand;
// 认证码昄到图象中
g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近Q所以只能直接生?br /> g.drawString(rand,13*i+6,16);
}
// 认证码存入SESSION
session.setAttribute("rand",sRand);
// 图象生效
g.dispose();
// 输出图象到页?br />ImageIO.write(image, "JPEG", response.getOutputStream());
%>
---------------使用验证码图片的文g---------a.jsp------------------------------------
<%@ page contentType="text/html;charset=gb2312" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>认证码输入页?lt;/title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</head>
<body>
<form method=post action="check.jsp">
<table>
<tr>
<td align=left>pȝ产生的认证码Q?lt;/td>
<td><img border=0 src="image.jsp"></td>
</tr>
<tr>
<td align=left>输入上面的认证码Q?lt;/td>
<td><input type=text name=rand maxlength=4 value=""></td>
</tr>
<tr>
<td colspan=2 align=center><input type=submit value="提交?></td>
</tr>
</form>
</body>
</html>
-----------------验证的页?---------check.jsp
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<html>
<head>
<title>认证码验证页?lt;/title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</head>
<body>
<%
String rand = (String)session.getAttribute("rand");
String input = request.getParameter("rand");
%>
pȝ产生的认证码为: <%= rand %><br>
(zhn)输入的认证码ؓQ?<%= input %><br>
<br>
<%
if (rand.equals(input)) {
%>
<font color=green>输入相同Q认证成功!</font>
<%
} else {
%>
<font color=red>输入不同Q认证失败!</font>
<%
}
%>
</body>
</html>
]]>
EHCache 初步使用指南
]]>
2、抽象类java.text.DateFormat 和它的一个具体子c?java.text.SimpleDateFormat
3、抽象类java.util.Calendar 和它的一个具体子c?java.util.GregorianCalendar
//------------------------------------------------------
import java.util.Date;
{
public static void main(String[] args)
{
// Get the system date/time
Date date = new Date();
}
}
//------------------------------------------------------
import java.text.SimpleDateFormat;
import java.util.Date;
{
{
new SimpleDateFormat("EEEE-MMMM-dd-yyyy");
}
}
//------------------------------------------------------
import java.text.SimpleDateFormat;
import java.util.Date;
{
{
// Create a date formatter that can parse dates of
// the form MM-dd-yyyy.
SimpleDateFormat bartDateFormat =
new SimpleDateFormat("MM-dd-yyyy");
String dateStringToParse = "9-29-2001";
// Parse the text version of the date.
// We have to perform the parse method in a
// try-catch construct in case dateStringToParse
// does not contain a date in the format we are expecting.
Date date = bartDateFormat.parse(dateStringToParse);
// to the system output.
System.out.println(date.getTime());
}
catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
//------------------------------------------------------
import java.text.DateFormat;
import java.util.Date;
{
{
Date date = new Date();
DateFormat.getDateTimeInstance(
DateFormat.SHORT,
DateFormat.SHORT);
DateFormat.getDateTimeInstance(
DateFormat.MEDIUM,
DateFormat.MEDIUM);
DateFormat.getDateTimeInstance(
DateFormat.LONG,
DateFormat.LONG);
DateFormat.getDateTimeInstance(
DateFormat.FULL,
DateFormat.FULL);
System.out.println(mediumDateFormat.format(date));
System.out.println(longDateFormat.format(date));
System.out.println(fullDateFormat.format(date));
}
}
//------------------------------------------------------
9/29/01 8:44 PM
Sep 29, 2001 8:44:45 PM
September 29, 2001 8:44:45 PM EDT
Saturday, September 29, 2001 8:44:45 PM EDT
import java.util.GregorianCalendar;
import java.util.Date;
import java.text.DateFormat;
{
{
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);
GregorianCalendar cal = new GregorianCalendar();
// Set the date and time of our calendar
// to the system&s date and time
cal.setTime(new Date());
dateFormat.format(cal.getTime()));
cal.set(GregorianCalendar.DAY_OF_WEEK,
GregorianCalendar.FRIDAY);
System.out.println("After Setting Day of Week to Friday: " +
dateFormat.format(cal.getTime()));
while (friday13Counter <= 10)
{
cal.add(GregorianCalendar.DAY_OF_MONTH, 7);
// another Friday the 13th.
if (cal.get(GregorianCalendar.DAY_OF_MONTH) == 13)
{
friday13Counter++;
System.out.println(dateFormat.format(cal.getTime()));
}
}
}
}
//------------------------------------------------------
cal.set(GregorianCalendar.DAY_OF_WEEK,
GregorianCalendar.FRIDAY);
cal.add(GregorianCalendar.DAY_OF_MONTH, 7);
System Date: Saturday, September 29, 2001
当我们将它设|成星期五以后就成了: Friday, September 28, 2001
Friday, September 13, 2002
Friday, December 13, 2002
Friday, June 13, 2003
Friday, February 13, 2004
Friday, August 13, 2004
Friday, May 13, 2005
Friday, January 13, 2006
Friday, October 13, 2006
Friday, April 13, 2007
Friday, July 13, 2007
Friday, June 13, 2008
]]>
学习怎样创徏和用日?
概要
不管你是处理财务交易q是计划着下一步的行动Q你都要知道怎样在Java中徏立,使用和显C日期。这需要你单的查阅一下相应类的API参考:一个日期可以创?个相关类的对象。这文章告诉你你想要知道的内容。(3,000字)
作者:Robert Nielsen
译Q?/strong>Cocia Lin
Javal计?970q??日v的毫U的数量表示日期。也是_例如Q?970q??日,是在1?日后?6Q?00Q?00毫秒。同L(fng)Q?969q?2?1日是?970q??日前86Q?00Q?00毫秒。Java的DatecM用longcdU录q些毫秒?因ؓlong是有W号整数Q所以日期可以在1970q??日之前,也可以在q之后。Longcd表示的最大正值和最大负值可以轻杄表示290Q?00Q?00q的旉Q这适合大多Ch的时间要求?br />Date c?br /> Datecd以在java.util包中扑ֈQ用一个longcd的DCZ个指定的时刻。它的一个有用的构造函数是Date(),它创Z个表C创建时ȝ对象。getTime()Ҏ(gu)q回Date对象的long倹{在下面的程序中Q我使用Date()构造函数创Z个表C程序运行时ȝ对象Qƈ且利用getTime()Ҏ(gu)扑ֈq个日期代表的毫U数量:
import java.util.*;
public class Now {
public static void main(String[] args) {
Date now = new Date();
long nowLong = now.getTime();
System.out.println("Value is " + nowLong);
}
}
当我q行q个E序后,我得?72,568,255,150.快速确认一下这个数字,L(fng)在一个合理的范围Q它不到31q_q个数值相?970q??日到我写q篇文章的时间来_是合理的。计机是这个毫UDC时_Z可不愿意? 我将?96,321,998,34见到你?q运的是QJava提供了一个{换Date对象到字W串的途径Q表C成传统的Ş式。我们在下一节讨论DateFormatc,它直观的建立日期字符丌Ӏ?
DateFormatc?br /> DateFormatcȝ一个目标是建立一个h们能够识别的字符丌Ӏ然而,因ؓ语言的差别,不是所有的人希望看C格的相同格式的日期。法国h更喜Ƣ看?25 decembre 2000,",但是国Z惯看?December 25,2000."所以一个DateFormat的实例创Z后,q个对象包含了日期的昄格式的信息。如果用用L(fng)(sh)脑区域设|缺省的格式Q你可以象下面那P创徏DateFormat对象Q用getDateInstance()Ҏ(gu)Q?/p>
DateFormat df = DateFormat.getDateInstance();
DateFormatcdjava.text包中可以扑ֈ?br />转换成字W串
你可以用format()Ҏ(gu)转换Date对象Z个字W串。下面的CZE序说明了这个问题:
import java.util.*;
import java.text.*;
public class NowString {
public static void main(String[] args) {
Date now = new Date();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(now);
System.out.println("Today is " + s);
}
}
在上面的代码中,展示了没有参敎ͼ使用~省格式的getDateInstance()Ҏ(gu)。Javaq提供了几个选择日期格式Q你可以通过使用重蝲的getDateInstance(int style)获得。出于方便的原因QDateFormat提供了几U预|的帔RQ你可以使用q些帔R参数。下面是几个SHORT, MEDIUM, LONG, 和FULLcd的示例:
import java.util.*;
import java.text.*;
public class StyleDemo {
public static void main(String[] args) {
Date now = new Date();
DateFormat df = DateFormat.getDateInstance();
DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT);
DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM);
DateFormat df3 = DateFormat.getDateInstance(DateFormat.LONG);
DateFormat df4 = DateFormat.getDateInstance(DateFormat.FULL);
String s = df.format(now);
String s1 = df1.format(now);
String s2 = df2.format(now);
String s3 = df3.format(now);
String s4 = df4.format(now);
System.out.println("(Default) Today is " + s);
System.out.println("(SHORT) Today is " + s1);
System.out.println("(MEDIUM) Today is " + s2);
System.out.println("(LONG) Today is " + s3);
System.out.println("(FULL) Today is " + s4);
}
}
E序输出如下Q?/p>
(Default) Today is Nov 8, 2000
(SHORT) Today is 11/8/00
(MEDIUM) Today is Nov 8, 2000
(LONG) Today is November 8, 2000
(FULL) Today is Wednesday, November 8, 2000
同样的程序,在我的电(sh)脑上使用~省讄q行后,改变区域讄为瑞典,输出如下Q?/p>
(Default) Today is 2000-nov-08
(SHORT) Today is 2000-11-08
(MEDIUM) Today is 2000-nov-08
(LONG) Today is den 8 november 2000
(FULL) Today is den 8 november 2000
从这里,你能看到Q瑞典的月䆾不是大写的(虽然Novemberq是novemberQ?q有QLONG和FULL版本在瑞典语中是一L(fng)Q但是美国英语却不同。另外,有趣的是Q瑞典语单词的星期三,onsdagQ没有包含在FULL日期里,p却包括?
注意你能够用getDateInstance()Ҏ(gu)改变DateFormat实例的语U;但是Q在上面的例子中Q是通过改变Windows98的控刉板的区域讄做到的。不同的地方的区域设|不同,l果׃同,q样有好处,也有不QJavaE序员应该了解这些。一个好处是JavaE序员可以只写一行代码就可以昄日期Q而且世界不同地区的电(sh)脑运行同L(fng)E序会有不用的日期格式?但是q也是一个缺点,当程序员希望昄同一U格式的?-q也有可取之处,举例来说Q在E序中合输出文本和日期Q如果文本是英文Q我们就不希望日期格式是其他的格式,象d文或是西班牙文。如果程序员依靠日期格式~程Q日期格式将Ҏ(gu)q行E序所在电(sh)脑的区域讄不用而不同?
解析字符?/strong>
通过parse()Ҏ(gu)QDateFormat能够以一个字W串创立一个Date对象。这个方法能抛出ParseException异常Q所以你必须使用适当的异常处理技术。下面的例子E序通过字符串创建Date对象Q?/p>
import java.util.*;
import java.text.*;
public class ParseExample { GregorianCalendar(int year, int month, int date) GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17); GregorianCalendar firstFlight = new GregorianCalendar(1903, 11, 17); import java.util.*; public class Flight { public static void main(String[] args) { GregorianCalendar thisday = new GregorianCalendar(); import java.util.*; class Today { import java.util.*; public class World { import java.util.*; public class Mortgage { import java.util.*; public class ThreeDates { gc1.add(Calendar.YEAR, 1); DateFormat df = DateFormat.getDateInstance(); Date d1 = gc1.getTime(); String s1 = df.format(d1); System.out.println("gc1 is " + s1); import java.util.*; public class ReviewDates { ReviewDates(GregorianCalendar gcDate) { firstDay = new GregorianCalendar(year, month, date); oneDay.add(GregorianCalendar.DATE, 1); ReviewDates() { public void listDates() { String ss = df.format(startDate); System.out.println("Start date is " + ss); public GregorianCalendar[] getDates() { public GregorianCalendar getFirstDay() { public GregorianCalendar getOneDay() { public GregorianCalendar getOneWeek() { public GregorianCalendar getOneMonth() { public GregorianCalendar getOneQuarter() { public GregorianCalendar getOneYear() { import java.util.*; public class ShowDates { GregorianCalendar gc = new GregorianCalendar(2001, Calendar.JANUARY, 15);
public static void main(String[] args) {
String ds = "November 1, 2000";
DateFormat df = DateFormat.getDateInstance();
try {
Date d = df.parse(ds);
}
catch(ParseException e) {
System.out.println("Unable to parse " + ds);
}
}
}
在创Z个Q意的日期时parse()Ҏ(gu)很有用。我通过另一U方法创Z个Q意得日期。同Ӟ你将看到怎样q行基本日期计算Q例如计?0天后的另一天。你可以使用GregorianCalendarcL完成q个d?
GregorianCalendarc?/strong>
创徏一个代表Q意日期的一个途径使用GregorianCalendarcȝ构造函敎ͼ它包含在java.util包中Q?/p>
注意月䆾的表C,一月是0Q二月是1Q以此类推,?2月是11。因为大多数Z惯于使用单词而不是用数字来表示月䆾Q这L(fng)序也许更易读Q父cCalendar使用帔R来表C月份:JANUARY, FEBRUARY,{等。所以,创徏Wilbur ?Orville刉第一架动力飞机的日期QDecember 17, 1903Q,你可以用:
Z清楚的考虑Q你应该使用前面的Ş式。但是,你也应该学习怎样阅读下面的短格式。下面的例子同样表示December 17,1903Q记住,在短格式中,11表示DecemberQ?/p>
在上一节中Q你学习了{换Date对象到字W串。这里,你可以做同样的事情;但是首先Q你需要将GregorianCalendar对象转换到Date。要做到q一点,你可以用getTime()Ҏ(gu)Q从它得父类Calendarl承而来。GetTime()Ҏ(gu)q回GregorianCalendar相应的Date对象。你能够创徏GregorianCalendar对象Q{换到Date对象Q得到和输出相应的字W串q样一个过E。下面是例子Q?
import java.text.*;
GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17);
Date d = firstFlight.getTime();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(d);
System.out.println("First flight was " + s);
}
}
有时候创Z个代表当前时ȝGregorianCalendarcȝ实例是很有用的。你可以单的使用没有参数的GregorianCalendar构造函敎ͼ象这P
一个输Z天日期的例子E序Q用GregorianCalendar对象Q?/p>
import java.text.*;
public static void main(String[] args) {
GregorianCalendar thisday = new GregorianCalendar();
Date d = thisday.getTime();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(d);
System.out.println("Today is " + s);
}
}
注意刎ͼDate()构造函数和GregorianCalendar()构造函数很cMQ都创徏一个对象,条g单,代表今天?br />日期处理
GregorianCalendarcL供处理日期的Ҏ(gu)。一个有用的Ҏ(gu)是add().使用add()Ҏ(gu)Q你能够增加象年Q月敎ͼ天数到日期对象中。要使用add()Ҏ(gu)Q你必须提供要增加的字段Q要增加的数量。一些有用的字段是DATE, MONTH, YEAR, ?WEEK_OF_YEAR。下面的E序使用add()Ҏ(gu)计算未来80天的一个日期。在Jules?lt;环球80?gt;是一个重要的数字Q用这个程序可以计Phileas Fogg从出发的那一?872q?0?日后80天的日期Q?/p>
import java.text.*;
public static void main(String[] args) {
GregorianCalendar worldTour = new GregorianCalendar(1872, Calendar.OCTOBER, 2);
worldTour.add(GregorianCalendar.DATE, 80);
Date d = worldTour.getTime();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(d);
System.out.println("80 day trip will end " + s);
}
}
q个例子是想象的Q但在一个日期上增加天数是一个普遍的操作Q媄可以租3天,图书馆可以借书21天,商店l常需要将购买的物品在30天内卖出。下面的E序演示了用年计算Q?/p>
import java.text.*;
public static void main(String[] args) {
GregorianCalendar mortgage = new GregorianCalendar(1997, Calendar.MAY, 18);
mortgage.add(Calendar.YEAR, 15);
Date d = mortgage.getTime();
DateFormat df = DateFormat.getDateInstance();
String s = df.format(d);
System.out.println("15 year mortgage amortized on " + s); }
}
add()一个重要的副作用是它改变的原来的日期。有时候,拥有原始日期和修改后的日期很重要。不q的是,你不能简单的创徏一个GregorianCalendar对象Q设|它和原来的相等QequalQ。原因是两个变量指向同一个Date()对象地址。如果Date对象改变Q两个变量就指向改变后的日期对象。代替这U做法,应该创徏一个新对象。下面的E序C了这U做法:
import java.text.*;
public static void main(String[] args) {
GregorianCalendar gc1 = new GregorianCalendar(2000, Calendar.JANUARY, 1);
GregorianCalendar gc2 = gc1;
GregorianCalendar gc3 = new GregorianCalendar(2000, Calendar.JANUARY, 1);
//Three dates all equal to January 1, 2000
file://gc1 and gc2 are changed
Date d2 = gc2.getTime();
Date d3 = gc3.getTime();
String s2 = df.format(d2);
String s3 = df.format(d3);
System.out.println("gc2 is " + s2);
System.out.println("gc3 is " + s3);
}
}
E序q行后,gc1和gc2被变?001q_因ؓ两个对象指向同一个DateQ而Date已经被改变了Q。对象gc3指向一个单独的DateQ它没有被改变?br />计算复习日期
在这节,你将看到一个依据现实世界的例子。这个详l的E序计算q去一个具体的日期。例如,你阅读这文章,你想要记住一个印象深ȝ知识炏V如果你没有照片一L(fng)记忆力,你就要定期的复习q些新资料,q将帮助你记住它。关于复习系l,Kurt Hanks ?Gerreld L. Pulsipher在他们的< Five Secrets to Personal Productivity个h能力?个秘?gt;中有讨论Q徏议看q第一眼后马上回顾一下,然后?天后Q?个星期后Q?个月后,3个月后,1q后。我的这文章,你要马上回顾一下,从现在算P再就是明天,然后?个星期,1个月Q?个月Q?q后。我们的E序计这些日期?br />q个E序非常有用的,它将是PIM(Personal Information Manager个h信息理?的一个组成部分,q将定复习旉。在下面的程序中QgetDates()Ҏ(gu)对一个返回日期数l(复习日期Q的?sh)子软g很有用。另外,你可以返回单独的一个日期,使用getFirstDay(),getOneDay(),getOneWeek(),getOnMonth()和getOneYear().当时间范围超个PIM的ReviewDates的计范围时ReviewDatescLCZ怎样计算旉Dc现在,你可以容易的修改它用来处理你需要的旉D,象图书馆借书Q录影带U赁和抵D。首先,ReviewDatescLC在下面Q?/p>
import java.text.*;
private GregorianCalendar firstDay, oneDay, oneWeek, oneMonth, oneQuarter, oneYear;
final int dateArraySize = 6;
int year = gcDate.get(GregorianCalendar.YEAR);
int month = gcDate.get(GregorianCalendar.MONTH);
int date = gcDate.get(GregorianCalendar.DATE);
oneDay = new GregorianCalendar(year, month, date);
oneWeek = new GregorianCalendar(year, month, date);
oneMonth = new GregorianCalendar(year, month, date);
oneQuarter = new GregorianCalendar(year, month, date);
oneYear = new GregorianCalendar(year, month, date);
oneWeek.add(GregorianCalendar.DATE, 7);
oneMonth.add(GregorianCalendar.MONTH, 1);
oneQuarter.add(GregorianCalendar.MONTH, 3);
oneYear.add(GregorianCalendar.YEAR, 1);
}
this(new GregorianCalendar());
}
DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);
Date startDate = firstDay.getTime();
Date date1 = oneDay.getTime();
Date date2 = oneWeek.getTime();
Date date3 = oneMonth.getTime();
Date date4 = oneQuarter.getTime();
Date date5 = oneYear.getTime();
String ss1 = df.format(date1);
String ss2 = df.format(date2);
String ss3 = df.format(date3);
String ss4 = df.format(date4);
String ss5 = df.format(date5);
System.out.println("Following review dates are:");
System.out.println(ss1);
System.out.println(ss2);
System.out.println(ss3);
System.out.println(ss4);
System.out.println(ss5);
System.out.println();
}
GregorianCalendar[] memoryDates = new GregorianCalendar[dateArraySize];
memoryDates[0] = firstDay;
memoryDates[1] = oneDay;
memoryDates[2] = oneWeek;
memoryDates[3] = oneMonth;
memoryDates[4] = oneQuarter;
memoryDates[5] = oneYear;
return memoryDates;
}
return this.firstDay;
}
return this.oneDay;
}
return this.oneWeek;
}
return this.oneMonth;
}
return this.oneQuarter;
}
return this.oneYear;
}
}
下面是用ReviewDatescd出复习日期的例子E序Q?/p>
public static void main(String[] args) {
ReviewDates rd = new ReviewDates();
rd.listDates();
ReviewDates jan15 = new ReviewDates(gc);
jan15.listDates();
}
}
ȝ
q篇文章介绍了关于日期处理的3个重要的c:Date,DateFormat,GregorianCalendar.q些c让你创建日期,转换成字W串Q和计算日期基本元素。处理Java中的日期问题Q这文章只是冰׃角。可是,我在q里介绍的类和方法不仅仅是你学习高技术的xQ这些类和方法本w就可以处理很多通常的日期相关的d
]]>
try
{
url = new URL(urlStr);
httpConn = (HttpURLConnection) url.openConnection();
HttpURLConnection.setFollowRedirects(true);
// logger.info(httpConn.getResponseMessage());
in = httpConn.getInputStream();
out = new FileOutputStream(new File(outPath));
chByte = in.read();
while (chByte != -1)
{
out.write(chByte);
chByte = in.read();
}
}
catch (MalformedURLException e)
{
}
}
l过一D|间的研究和查找资料,发现是由于上面的代码~少了一些必要的信息DQ增加更加详l的属?br />
httpConn.setRequestMethod("GET");
httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");
完整代码如下Q?br /> public static void DownLoadPages(String urlStr, String outPath)
{
int chByte = 0;
URL url = null;
HttpURLConnection httpConn = null;
InputStream in = null;
FileOutputStream out = null;
try
{
url = new URL(urlStr);
httpConn = (HttpURLConnection) url.openConnection();
HttpURLConnection.setFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");
// logger.info(httpConn.getResponseMessage());
in = httpConn.getInputStream();
out = new FileOutputStream(new File(outPath));
chByte = in.read();
while (chByte != -1)
{
out.write(chByte);
chByte = in.read();
}
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
out.close();
in.close();
httpConn.disconnect();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
此外Q还有第二种Ҏ(gu)可以讉KGoogle的网站,是用apache的一个工具HttpClient 模仿一个浏览器来访问Google
Document document = null;
HttpClient httpClient = new HttpClient();
GetMethod getMethod = new GetMethod(url);
getMethod.setFollowRedirects(true);
int statusCode = httpClient.executeMethod(getMethod);
if (statusCode == HttpStatus.SC_OK)
{
InputStream in = getMethod.getResponseBodyAsStream();
InputSource is = new InputSource(in);
DOMParser domParser = new DOMParser(); //nekoHtml 取得的|页转换成dom
domParser.parse(is);
document = domParser.getDocument();
System.out.println(getMethod.getURI());
}
return document;
推荐使用W一U方式,使用HttpConnection 比较轻量U,速度也比W二UHttpClient 的快?/p>