ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一区二区三区欧美,国产精品18久久久,国产福利视频一区二区三区http://www.aygfsteel.com/fisher/category/18300.html天行健,君子以自å¼ÞZ¸æ¯ã€‚地势坤åQŒå›å­ä»¥åŽšå¯d载物ã€?/description>zh-cnTue, 27 Feb 2007 12:37:59 GMTTue, 27 Feb 2007 12:37:59 GMT60Subversion(SVN)安装使用指南 (è½?http://www.aygfsteel.com/fisher/articles/98232.htmlFisherFisherTue, 06 Feb 2007 04:13:00 GMThttp://www.aygfsteel.com/fisher/articles/98232.htmlhttp://www.aygfsteel.com/fisher/comments/98232.htmlhttp://www.aygfsteel.com/fisher/articles/98232.html#Feedback0http://www.aygfsteel.com/fisher/comments/commentRss/98232.htmlhttp://www.aygfsteel.com/fisher/services/trackbacks/98232.html

Subversion(SVN)安装使用指南

â€È®€˜q°â€?/font>

Subversion是近期在开源社åŒÞZ¸­éžå¸¸‹¹è¡Œçš„一‹Æ„¡‰ˆæœ¬æŽ§åˆ¶èÊYä»Óž¼Œå®ƒæ˜¯CVS的替代äñ”物ã€?/p>

它的主要特征有:

  • CVS大部分的功能ã€?
  • 支持“目录”çñ”别的版本½Ž¡ç†åQŒåƈ且解决了CVS中迟˜qŸæœªèƒ½è§£å†³çš„æ–‡äšg重命名和¿UÕdЍ½{‰é—®é¢˜ã€‚甚臛_¯¹æ–‡äšg或文件夹的属性都提供了版本管理ã€?
  • “提交(commitåQ‰â€å®žçŽîCº†çœŸæ­£æ„ä¹‰ä¸Šçš„原子操作。也ž®±æ˜¯¾cÖM¼¼æ•°æ®åº“中的事务的功能ã€?
  • 版本号依据每‹Æ¡æäº¤è€Œæ”¹å˜ï¼Œä¸å†é’ˆå¯¹æ¯ä¸ªæ–‡äšg。日志信息也是针å¯Òޝ‹Æ¡æäº¤è€Œè®¾¾|®ã€‚所以看到版本号是几百或者几千也不用太惊è®Óž¼Œè¡¨ç¤ºæ–¹å¼ä¸ä¸€æ ïLŞ了ã€?
  • 通过WebDAV/DeltaV协议åQŒå¯ä»¥ä¸ŽApache的网¾lœæœåŠ¡æ— ¾~è¡”接(通过Apache来运行)。这样就能提供一些额外的功能åQŒä¾‹å¦‚:认证åQŒåŽ‹¾~©ä¼ è¾“,以及数据仓库åQˆRepositoryåQŒè§ä¸‹ï¼‰çš„æµè§ˆç­‰ã€?
  • 也可以作为独立服务器˜qè¡ŒåQŒä½†˜q™æ ·çš„话提供的功能较为简单薄弱ã€?
  • 两种˜qè¡Œæ¨¡å¼éƒ½æ”¯æŒSSHåQˆå½“焉™œ€è¦å„自的支持和配¾|®ï¼‰
  • 降低了分支(BranchåQ‰å’Œæ ‡ç­¾åQˆtagåQ‰ä¸Šçš„æ—¶é—´æ¶ˆè€—。底层设计理念和实现上的不同åQŒä¸¾l†è¯´äº†ã€?
  • æ—‰™—´æ¶ˆè€—依据的是文件改变部分的大小åQŒè€Œä¸æ˜¯æ•°æ®æ€»é‡ã€?
  • 创徏数据仓库æ—Óž¼Œç”¨æˆ·å¯ä»¥æŒ‡å®šæ˜¯ä‹É用内嵌的 BerkeleyDB 数据库,˜q˜æ˜¯ç‰¹å®šæ ¼å¼çš„æ–‡ä»¶ç³»¾lŸã€?

å…¶ä»–˜q˜æœ‰äº›é›¶æ˜Ÿçš„ž®åŠŸèƒ½ï¼Œå…·ä½“å¯ä»¥å‚é˜…åQ?http://subversion.tigris.org/roadmap.html

˜q™é‡Œè§£é‡Šä¸€ä¸?数据仓库 的概念:
一个数据仓库对应的可以是一个项目,也可以是多个™å¹ç›®ã€‚SVN是基于数据仓库进行管理的ã€?br />按照用户习惯åQŒå¯ä»¥åªåœ¨æ¯ä¸ªæ•°æ®ä»“库内仅放¾|®ä¸€ä¸ªé¡¹ç›®çš„内容ã€?/p>

â€ÖM¸‹è½½â€?/font>

Subversion 1.2.3:
http://subversion.tigris.org/project_packages.html
åQˆSVNçš„Server端,分不同操作系¾lŸçš„版本åQŒè¿™é‡Œæˆ‘下蝲的是for windows及for linux的)

TortoiseSVN:
http://tortoisesvn.tigris.org/download.html
åQˆwindows下的SVN客户端,以shell方式集成在系¾lŸå³é”®èœå•中åQ?/p>

Apache 2.0.55:
http://httpd.apache.org/download.cgi
åQˆè§†æ“ä½œ¾pȝ»Ÿè€Œä¸‹åQ?/p>

â€Õd®‰è£…ä‹É用â€?/font>

下面说一下安装,分两¿Uåã^収ͼˆwindowsåQŒlinuxåQ‰åŠä¸¤ç§æ¨¡å¼åQˆä¸ŽApache¾l‘定 vs. Stand-aloneåQ?br />具体在Apache上的配置倒是大同ž®å¼‚ã€?/p>

另外åQŒSVN是支持SSL的,但是˜q™ä¸ªé…ç½®ç‰‰|¶‰åˆ°å…¶ä»–太多东西,本文ž®×ƒ¸˜q‡å¤šæ¶‰åŠäº†ã€‚真的有需要可以参考SVN的手册(英文åQ‰ã€?/p>

方便赯‚§åQŒç”¨å‡ ä¸ªå˜é‡ä»£è¡¨å…·ä½“çš„å€û|¼Œè¯¯‚‡ªè¡ŒåŠ ä»¥è°ƒæ•ß_¼š

%SystemRoot% â€?windows的系¾lŸæ‰€åœ¨ç›®å½•ï¼Œä¸€èˆ¬ç±»ä¼ÆD¿™æ øP¼šC:\WINNT
%SVN_HOME% â€?SVN的安装目å½?br />%SVN_REPO_PARENT% â€?SVN所有数据仓库的根目录(ž®±æ˜¯å­˜æ”¾å…¨éƒ¨ç‰ˆæœ¬æ–‡äšgçš„æ€È›®å½•)
%PROJECT_NAME% â€?™å¹ç›®åï¼Œä¸¥æ ¼çš„æ¥è¯´å®ƒå¯¹åº”的是一个数据仓库,但是˜q™é‡Œéµä»Žç”¨æˆ·ä¹ æƒ¯åQŒä»¥™å¹ç›®åç§°æ–¹å¼æ¥å‘½åã€?br />%SERVER_NAME_OR_IP% â€?服务器名或IP地址
%APACHE_HOME% â€?Apache2的安装èµ\å¾?/p>

另外åQŒå®‰è£…过½E‹é»˜è®¤ä‹É用文件系¾lŸåšåŽå°æ•°æ®åº“,文中不再加以说明。如需使用BerkeleyDBåQŒè¯·è‡ªè¡Œå‚考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.用命令行来测试安装结果是否正¼‹®ï¼š

  1. cmd
  2. svnadmin

如果˜q”回˜q™æ ·çš„错误信息:”svnadmin.exe - Unable To Locate DLL”,那就需要尝试一下步骤的中的一¿Uæˆ–几种åQ?br />安装VC++ 6.0åQˆä¸»è¦æ˜¯å®‰è£…VC的运行库åQ?br />或者直接从别的机器上拷贝一个”msvcp60.dll”文件到本机的â€?SystemRoot%\system32″下

4.使用以下命ä×o创徏一个数据仓库,用来存放™å¹ç›®çš„æºä»£ç å’Œå…¶ä»–æ–‡ä»Óž¼š

  1. cmd
  2. svnadmin   create %SVN_REPO_PARENT %\ %PROJECT_NAME %

5.其中%SVN_REPO_PARENT%是包含所有数据仓库的目录åQ?PROJECT_NAME%是所创徏的数据仓库对应的™å¹ç›®åã€?/p>


*************************
* ä»?Stand-alone 模式˜qè¡Œ *
*************************

6.从命令行启动SVN ServeråQ?/p>

  1. cmd
  2. svnserve - d - r   %SVN_REPO_PARENT %

注意里面的参�r 限定了浏览全部数据仓库的根目�/p>

当然如果觉得每次˜q™æ ·å¯åŠ¨å¤ªéº»çƒ¦çš„è¯ï¼Œä¹Ÿæœ‰SVN Serveice的包装程序(http://dark.clansoft.dk/~mbn/svnservice/åQ‰ã€‚通过它能够以windows service的方式运行SVN ServeråQˆå…¶æœ¬è´¨˜q˜æ˜¯Stand-aloneåQ‰ï¼Œ˜qè¡Œèµäh¥ç›¸å¯¹æ¯”较方便ã€?/p>

7.创徏用户数据库(其实ž®±æ˜¯ä¸€ä¸ªtxt文本åQŒå°±å«å®ƒâ€users.conf”吧åQŒä½ ä¹Ÿå¯ä»¥æ”¹åï¼‰åQŒä¿å­˜åˆ°
%SVN_REPO_PARENT%\%PROJECT_NAME%\conf
目录åQˆé‚£ä¸ªconf子文件夹在创建数据仓库时已被自动创徏好)åQŒç„¶åŽåœ¨˜q™ä¸ªæ–‡äšg内添加需要的用户名和密码。基本的样例如下åQ?/p>

  1. [ users ]
  2. your_username = your_password

注意˜q™é‡Œå¯†ç æ˜¯æ˜Žæ–‡å­˜æ”„¡š„åQŒæ‰€ä»¥ä¹Ÿæ˜¯è¿™¿Uæ–¹å¼çš„不èƒö之处ã€?/p>

8.在â€?SVN_REPO_PARENT%\%PROJECT_NAME%\conf”目录下扑ֈ°˜q™ä¸ªâ€svnserve.conf”文ä»Óž¼Œç”¨ä“Q何文本编辑器打开åQŒäؓ刚才创徏的那些用æˆäh·»åŠ è¯»å†™æƒé™ï¼š

  1. [ general ]
  2. anon - access = none               # 匿名讉K—®æƒé™
  3. auth - access = write              # 认证用户的权�/span>
  4. password - db = users . conf         # 认证用户数据�/span>
  5. realm = Anything   you want , but generally we use " %PROJECT_NAME% "    # 在用戯‚®¤è¯ç•Œé¢ä¸Šå‡ºçŽ°çš„æ½Cø™¯­å?/span>

里面的”users.conf”就是刚才在½W?步创建的用户文äšgã€?/p>

9.最后,重启SVN ServeråQˆä»€ä¹ˆï¼Ÿä½ ä¸çŸ¥é“怎么重启åQŸå…³æŽ‰çª—口再重新用命令行启动啦;包装成Service的话么就更加½Ž€å•了åQ?/p>

现在已经可以使用客户端来˜qžæŽ¥SVN ServeråQŒè¿›è¡Œimport½{‰æ“ä½œäº†ã€?br />˜qžæŽ¥Serverçš„URLåº”è¯¥æ˜¯ç±»ä¼ÆD¿™æ ïLš„åQ?/p>

  1. svn :// %SERVER_NAME_OR_IP %/ %PROJECT_NAME %

具体步骤åQŒè¯·å‚阅½W?0æ­¥ã€?/p>


************************
* 以Apache的模块方式运�*
************************

10.首先要了解的是SVN设计的时候只考虑了兼容Apache2.xåQŒæ‰€ä»¥åœ¨Apache1.x下是不能正常工作的ã€?/p>

11.安装Apache2
如果事先启动了IIS之类的其他webserveråQŒè¯·å…ˆåœæ­¢é‚£äº›æœåŠ¡ï¼ˆç«¯å£è¢«å ç”¨ä¼šå¯ÆD‡´Apache安装å¤ÞpÓ|åQ‰ã€?br />其他问题可以参考Apache的安装手册ã€?br />˜q™é‡Œå‡è®¾å®‰è£…目录为:%APACHE_HOME%

12.‹‚€æŸ¥Apache2的安装是否成åŠ?br />打开‹¹è§ˆå™¨ï¼Œè®‰K—®åQ?http://localhost/
如果出现的是默认的欢˜qŽé¡µé¢ï¼Œé‚£å°±æ²¡æœ‰é—®é¢˜äº†ã€‚否则请仔细‹‚€æŸ¥ï¼Œé‡æ–°å®‰è£…ã€?/p>

13.打开Apache的配¾|®æ–‡ä»Óž¼š â€?APACHE_HOME%\conf\httpd.confâ€?br />查找”LoadModule”这个关键字åQŒæ‰¾åˆ°å¯¼å…¥æ¨¡å—的区块åQˆsectionåQ?br />反注释掉下面˜q™æ ·åQŒä»Žè€ŒåŠ è½½Subversion所需要的DAV模块åQ?/p>

  1. # LoadModule dav_module modules/mod_dav.so

完成之后看è“v来应该是˜q™æ ·åQ?/p>

  1. LoadModule dav_module modules / mod_dav . so

另外在这行下面再æ·ÕdŠ ä¸¤è¡ŒåQˆè¯·æ³¨æ„æŠŠèµ\径中的”\”替换成â€?”)åQ?/p>

  1. LoadModule dav_svn_module %SVN_HOME %/ bin / mod_dav_svn . so
  2. LoadModule   authz_svn_module %SVN_HOME %/ bin / mod_authz_svn . so

特别需要注意的是:ç”׃ºŽæ¨¡å—依赖关系åQŒè¿™ä¸‰è¡Œçš„出现顺序千万不能颠å€?/font>ã€?/p>

14.再来配置一下”httpd.conf”的其他部分åQŒå‘Šè¯‰Apache2 SVN的数据仓库所在ã€?br />åQˆäؓ避免不必要的éºÈƒ¦åQŒæ‰€æœ‰èµ\径中的”\”都è¯äh›¿æ¢æˆâ€?”)
注意åQ?/p>

  • 按照下述配置åQŒæ‰€æœ‰æ•°æ®ä»“库将å…׃ín密码文äšg及权限文ä»?
  • å¦‚æžœéœ€è¦äØ“æ¯ä¸ªæ•°æ®ä»“åº“åˆ›å¾ç‹¬ç«‹çš„è®¾¾|®ï¼Œè¯ähŸ¥é˜…SVN的文档(”Authorization Option”章节)

æ·ÕdŠ ä¸‹è¿°å†…å®¹åQ?/p>

  1. < Location / svn>
  2.   DAV svn
  3.   SVNParentPath %SVN_REPO_PARENT%
  4.   #讄¡½®é€šè¿‡‹¹è§ˆå™¨è®¿é—®Repositoryæ—¶çš„XML格式文äšgåQŒå¯ä»¥çœç•?/span>
  5.   SVNIndexXSLT " /s vnindex . xsl "
  6.   # 存取权限控制文äšg所在地
  7.   AuthzSVNAccessFile %SVN_REPO_PARENT%/AccessFile
  8.    
  9.   # 先尝试匿名操作,如有必要再è{向用戯‚®¤è¯?/span>
  10.   Satisfy Any
  11.   Require valid-user
  12.    
  13.   # 如何验证用户
  14.   AuthType Basic
  15.   AuthName " Anything   you want , but generally we use %PROJECT_NAME % "
  16.   AuthUserFile %SVN_REPO_PARENT%/passwd
  17.   #输出时调用Apacheçš„Deflate模块åQŒå¿…™åÀLœ‰å¯ç”¨æ­¤æ¨¡å—才能这样配åQŒå¦åˆ™åˆ é™¤æ­¤è¡?/span>
  18.   SetOutputFilter DEFLATE
  19. </Location>

˜q™é‡Œæ¶‰åŠåˆîC¸¤ä¸ªæ–‡ä»? â€?SVN_REPO_PARENT%/AccessFileâ€?å?â€?SVN_REPO_PARENT%/passwdâ€?
òq¶ä¸ä¸€å®šéžè¦æ”¾åˆ°â€?SVN_REPO_PARENT%”目录下åQŒæˆ‘图方便而已。觉得不安全可以¿UÕdˆ°å¦å¤–地方ã€?br />˜q™ä¸¤ä¸ªæ–‡ä»‰™‡Œé¢å…·ä½“内容的讄¡½®è¯·å‚考第16å’?7æ­¥ã€?/p>

15.保存”httpd.confâ€åÆˆé€€å‡ºï¼Œ˜q™é‡ŒApache2的配¾|®å‘Šä¸€ŒDµè½ã€?/p>

16.�SVN_REPO_PARENT%/AccessFile”文件的内容

  1. [ / ]
  2. * = r
  3. user1 = rw
  4. user2 = r
  5. admin = rw
  6. [ %PROJECT_NAME %:/ src / test ]
  7. user2 = rw

其中åQ?/p>

  • [/] æŒ‡ä»£æ‰€æœ‰æ•°æ®ä»“åº“çš„æ ¹ç›®å½•ï¼ŒåŒ¿åç”¨æˆ·é»˜è®¤çš„æƒé™äØ“åªè¯»ã€?
  • 对于”user1‛_’Œâ€admin”,他们å¯Òމ€æœ‰æ•°æ®ä»“库都有读写权限ã€?
  • 对于”user2※I¼Œå®ƒå¯¹æ‰€æœ‰æ•°æ®ä»“库仅有只è¯ÀLƒé™ã€‚但是下方又额外指定了他对â€?PROJECT_NAME%:/src/test”目录具有读写权限ã€?
  • ¾lég¸ŠåQŒä»–对’test’目录及其子目录åQˆè‡ªåЍç‘ô承,除非特别指定åQ?å…ähœ‰è¯Õd†™æƒé™åQŒå…¶ä»–åˆ™å‡äØ“åªè¯»æƒé™ã€?

你可以根据需要来讑֮šä¸åŒçš„æƒé™ï¼Œæ›´è¯¦¾l†çš„说明˜q˜éœ€è¦å‚考SVN文档中的权限讄¡½®ç« èŠ‚ã€?/p>

17.�SVN_REPO_PARENT%/passwd”文件的内容
˜q™ä¸ªæ–‡äšg是通过â€?APACHE_HOME%\bin\htpasswd.exe”自动生成的åQ?/p>

  1. cmd
  2. cd / D %APACHE_HOME%\bin
  3. # 参数c仅在½W¬ä¸€‹Æ¡è¿è¡Œæ—¶ä½¿ç”¨åQŒç”¨æ¥åˆ›å»ÞZ¸€ä¸ªæ–°æ–‡äšg
  4. htpasswd –cm %SVN_REPO_PARENT%\passwd user1
  5. # 以后æ·ÕdŠ ç”¨æˆ·å¯ç”¨æ­¤å‘½ä»¤ï¼Œå‚æ•°m表明需要加å¯?/span>
  6. htpasswd –m %SVN_REPO_PARENT%\passwd user2

此时用文本编辑器打开â€?SVN_REPO_PARENT%/passwdâ€ï¼Œå¯ä»¥çœ‹åˆ°é‡Œé¢å†…å®¹æ˜¯ç±»ä¼ÆD¿™æ ïLš„åQ?/p>

  1. admin : $apr1$HLWV7 /.. $upZwVGvge 0 sc28fEp7mGM0
  2. user1 : $apr1$8 sbRo ... $hNMdkTvO4t8POVmOkV3Vg .
  3. user2 : $apr1$ZXzcE /.. $5 Ir0V8VQQtNYTNnnOp . EU1

18.把SVN自带的XSLTæ–‡äšg拯‚´åˆ°ç½‘站根目录åQ?br />然后讄¡½®åˆç†æƒé™åQˆwindowsòq›_°åˆ™ä¸å¿…考虑åQ?/p>

  1. #˜q™é‡Œå‡è®¾ä½ çš„¾|‘站根目录是  /var/www/html
  2. mv / tmp /s ubversion - 1.2.3 / tools / xslt / svnindex * / var / www / html
  3. chown   apache : apache / var / www / html / svnindex *
  4. chmod   644 / var / www / html / svnindex *
  5. #讄¡½®æ‰€æœ‰è€…和权限(ž®†æƒé™èµ‹¾l™apache˜qè¡Œçš„用戯‚ínä»?
  6. chown - R   apache : apache %SVN_REPO_PARENT %
  7. chmod - R   766 %SVN_REPO_PARENT %

19. 重启Apache2服务åQ?/p>

  1. cmd
  2. net   stop Apache2
  3. net   start Apache2

20.打开‹¹è§ˆå™¨ï¼Œè®‰K—®åQšhttp://%SERVER_NAME_OR_IP%/svn/
如果˜q”回的页面是â€?03 Forbidden”,可能是由于Apache2默认没有打开目录的浏览权限(Option IndexesåQŒå‚阅Apache2文档åQ‰ï¼Œä½†è¿™òq¶ä¸å½±å“ä½¿ç”¨ã€?br />现在已经可以用客æˆïL«¯å¯¼å…¥™å¹ç›®òq¶å¼€å§‹ä‹É用了ã€?br />具体步骤åQŒè¯·å‚阅½W?0æ­¥ã€?/p>


***********************************************
* 注意åQšä»¥ä¸‹æ­¥éª?命ä×o需要在装有SVN客户端的机器上执è¡?*
* Windows下安装服务器端的时候已¾låŒæ—¶å®‰è£…了客户ç«?*
* Linux下尚待查证�*
***********************************************

21.å’ŒCVSä¸€æ øP¼ŒSVN在最初的时候需要将已有™å¹ç›®å¯¼å…¥åˆ°æ•°æ®åº“中ã€?br />从命令行执行以下命ä×oåQˆStand-aloneåQ‰ï¼š

  1. svn import c :\ temp \ myproject svn :// %SERVER_NAME_OR_IP %/ %PROJECT_NAME % - m " initial import " -- username your_username -- password your_password

或者(Apache2 moduleåQ‰ï¼š

  1. svn import c :\ temp \ myproject http :// %SERVER_NAME_OR_IP %/ svn / %PROJECT_NAME % - m " initial import " -- username your_username -- password your_password

其中å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ˆè¿™ç‚ÒŽ„Ÿè§‰ä¸æ˜¯å¤ªæ–¹ä¾¿åQŒäؓ啥不做成import的时候有个选项åQŒæœ¬åœ°ç›®å½•可以自动生成版本信息呢åQŸï¼‰

  1. cmd
  2. cd / D anywhere_you_want_to_put_your_versioned_project_files
  3. svn co svn: / / myserver / myproject / trunk . -- username   your_username -- password your_password

注意åQ?br />“co”是”checkout”的一个别å?br />那个点[.]代表当前目录åQŒcheckout出来的文件会自动攑ֈ°˜q™ä¸ªç›®å½•ä¸‹ã€‚ä¹Ÿå¯ä»¥æ”¹äØ“æŸä¸ª¾lå¯¹è·¯å¾„ã€?/p>

23.对于向SVN Serer增加åQŒç§»åŠ¨ï¼Œåˆ é™¤åQŒæˆ–者修改后提交某些文äšgåQŒå‚考ä‹É用以下命令:

  1. Add :    svn add src / myfile . java - m " adding a file "
  2. Move :    svn   move src / myfile . java src / mynewfile . java - m " moved myfile.java to mynewfile.java "
  3. Delete :    svn   delete src / myfile . java - m " removing a file "
  4. Commit :    svn   commit src / myfile . java - m " the message "

对于上面的客æˆïL«¯æ“ä½œåQŒå¦‚果安装了TortoiseSVNåQŒä¸€åˆ‡å°±å˜å¾—½Ž€å•多了ã€?br />不过˜q™ä¸ªž®Þp¦æŠ“图来说明了。等有空的时候再放上来ã€?/p>

â€ÀL€È»“â€?/font>

使用Eclipse的朋友还可以参考这里: http://subclipse.tigris.org/
它以插äšgçš„åŞ式向Eclipse提供了SVN的支持ã€?/p>

另外åQŒå…·ä½“的讄¡½®åQŒå‚数说明等˜q˜æ˜¯éœ€è¦è‡ªå·±åŽ»æŸ¥é˜…SVN的文档(在安装server端的时候已¾lé™„带)

参考文献及资料åQ?br />_________________________________________

http://subversion.tigris.org/
http://www-128.ibm.com/developerworks/cn/opensource/os-subversion/
http://www.javayou.com/showlog.jspe?log_id=972



]]>
破解囄¡‰‡éªŒè¯ç é™åˆ¶çš„一般思èµ\http://www.aygfsteel.com/fisher/articles/93619.htmlFisherFisherSat, 13 Jan 2007 08:59:00 GMThttp://www.aygfsteel.com/fisher/articles/93619.htmlhttp://www.aygfsteel.com/fisher/comments/93619.htmlhttp://www.aygfsteel.com/fisher/articles/93619.html#Feedback0http://www.aygfsteel.com/fisher/comments/commentRss/93619.htmlhttp://www.aygfsteel.com/fisher/services/trackbacks/93619.html  验证码分为如下几¾c»ï¼šæ•°å­—型、字½W¦åž‹ã€ç¬¦å·åž‹ã€ç»¼åˆåž‹ã€?/p>

  一般验证码属于数字型的å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.最后频率最高的ž®±æ˜¯éªŒè¯ç äº†!

  接下来要做的ž®±æ˜¯åšä¸ªpost½E‹åºäº†ï¼Œ˜q™ä¸ªå¤ªç®€å•了åQŒä»£ç ä½ ž®Þp‡ªå·±å†™å§ï¼ä¸è¿‡ä¹Ÿè¦åšåˆ°å¦‚下¾l†èŠ‚åQšåšæˆå¤š¾U¿ç¨‹½E‹åº˜q›è¡Œå‘è„“åQŒä¸ç„¶ç¨‹åºä¼šå¤±åŽ»å“åº”çš„ã€‚æœ€å¥½æ˜¯å¯ä»¥å¯¼å…¥å¤§é‡çš„ä»£ç†IP的,然后ž®±æ˜¯å‘脓的内å®ÒŽœ€åŽåŠ ä¸Šå‡ ä¸ªéšæœºå­—½W¦ï¼Œ˜q™æ ·å¯ä»¥é˜²æ­¢é‡å¤è´´çš„˜q‡æ×oåQæœ€é‡è¦çš„ï¼Œåªæ˜¯åšæµ‹è¯•ï¼Œå‘è„“é‡ä¸è¦å¤ªå¤šã€ä¸è¦äØ•å‘å¹¿å‘Šè„“åQ?/p>

  其实上述æ–ÒŽ³•已经不是只是寚wªŒè¯ç ˜q›è¡Œè¯†åˆ«äº†ï¼Œå®Œå…¨å¯ä»¥ç”¨åˆ°çŽ°å®žç”Ÿæ´»ä¸­åŽ»åQŒæ¯”如说手写体识别、èžR牌识别等½{‰ï¼Œä½†æ˜¯çŽ°å®žç”Ÿæ´»ä¸­æˆ‘ä»¬è¿˜è¦è¿›è¡Œæ›´å¤šçš„åŠ å·¥åQŒæ¯”如说圆åÅž‹‚€‹¹‹ï¼Œå¤šè¾¹å½¢æ£€‹¹‹ç­‰½{‰ã€‚所以说从网¾lœå®‰å…¨æŠ€æœ¯ä¸­åQŒä¹Ÿæœ‰å¾ˆå¤šä¸œè¥¿èƒ½é€ ç¦½C¾ä¼šåQŒè¿˜½{‰å¾…我们¾l§ç®‹åˆ›é€ ï¼



]]>
JSP彩色验证ç ?/title><link>http://www.aygfsteel.com/fisher/articles/93590.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Sat, 13 Jan 2007 05:04:00 GMT</pubDate><guid>http://www.aygfsteel.com/fisher/articles/93590.html</guid><wfw:comment>http://www.aygfsteel.com/fisher/comments/93590.html</wfw:comment><comments>http://www.aygfsteel.com/fisher/articles/93590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fisher/comments/commentRss/93590.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fisher/services/trackbacks/93590.html</trackback:ping><description><![CDATA[生成æœ?ä¸ªéšæœºæ•°å­—å’Œæ‚äØ•èƒŒæ™¯çš„å›¾ç‰‡ï¼Œæ•°å­—å’ŒèƒŒæ™¯é¢œè‰²ä¼šæ”¹å˜åQŒæœåŠ¡å™¨ç«¯åˆ·æ–ŽÍ¼ˆç”¨history.go(-1)也会变)<br />原型参考ALIBABA  <a target="_blank">http://china.alibaba.com/member/showimage</a><br /><br />------------产生验证码图片的文äšg-----image.jsp-------------------------------------------<br /><br /><%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %><br /><%!<br />Color getRandColor(int fc,int bc){//¾l™å®šèŒƒå›´èŽ·å¾—éšæœºé¢œè‰²<br />        Random random = new Random();<br />        if(fc>255) fc=255;<br />        if(bc>255) bc=255;<br />        int r=fc+random.nextInt(bc-fc);<br />        int g=fc+random.nextInt(bc-fc);<br />        int b=fc+random.nextInt(bc-fc);<br />        return new Color(r,g,b);<br />        }<br />%><br /><%<br />//讄¡½®™åµé¢ä¸ç¼“å­?br />response.setHeader("Pragma","No-cache");<br />response.setHeader("Cache-Control","no-cache");<br />response.setDateHeader("Expires", 0);<br /><br />// 在内存中创徏图象<br />int width=60, height=20;<br />BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);<br /><br />// 获取囑ÖŞ上下æ–?br />Graphics g = image.getGraphics();<br /><br />//生成随机¾c?br />Random random = new Random();<br /><br />// 讑֮šèƒŒæ™¯è‰?br />g.setColor(getRandColor(200,250));<br />g.fillRect(0, 0, width, height);<br /><br />//讑֮šå­—体<br />g.setFont(new Font("Times New Roman",Font.PLAIN,18));<br /><br />//画边æ¡?br />//g.setColor(new Color());<br />//g.drawRect(0,0,width-1,height-1);<br /><br /><br />// 随机产生155条干扰线åQŒä‹É图象中的认证码不易被其它½E‹åºæŽ¢æµ‹åˆ?br />g.setColor(getRandColor(160,200));<br />for (int i=0;i<155;i++)<br />{<br />        int x = random.nextInt(width);<br />        int y = random.nextInt(height);<br />        int xl = random.nextInt(12);<br />        int yl = random.nextInt(12);<br />        g.drawLine(x,y,x+xl,y+yl);<br />}<br /><br />// 取随æœÞZñ”生的认证ç ?4位数å­?<br />String sRand="";<br />for (int i=0;i<4;i++){<br />    String rand=String.valueOf(random.nextInt(10));<br />    sRand+=rand;<br />    // ž®†è®¤è¯ç æ˜„¡¤ºåˆ°å›¾è±¡ä¸­<br />    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);<br />}<br /><br />// ž®†è®¤è¯ç å­˜å…¥SESSION<br />session.setAttribute("rand",sRand);<br /><br /><br />// 图象生效<br />g.dispose();<br /><br />// 输出图象到页é?br />ImageIO.write(image, "JPEG", response.getOutputStream());<br /><br /><br />%> <br /><br />---------------使用验证码图片的文äšg---------a.jsp------------------------------------<br /><br /><%@ page contentType="text/html;charset=gb2312" %><br /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><br /><html><br /><head><br /><title>认证码输入页é?lt;/title><br /><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br /><META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Expires" CONTENT="0"> <br /></head><br /><body><br /><form method=post action="check.jsp"><br /><table><br /><tr><br /><td align=left>¾pȝ»Ÿäº§ç”Ÿçš„认证码åQ?lt;/td><br /><td><img border=0 src="image.jsp"></td><br /></tr><br /><tr><br /><td align=left>输入上面的认证码åQ?lt;/td><br /><td><input type=text name=rand maxlength=4 value=""></td><br /></tr><br /><tr><br /><td colspan=2 align=center><input type=submit value="提交‹‚€‹¹?></td><br /></tr><br /></form><br /></body><br /></html><br /><br />-----------------验证的页é?---------check.jsp<br /><br /><%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %><br /><html><br /><head><br /><title>认证码验证页é?lt;/title><br /><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br /><META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Expires" CONTENT="0"> <br /></head><br /><br /><body><br /><% <br />String rand = (String)session.getAttribute("rand");<br />String input = request.getParameter("rand");<br />%><br />¾pȝ»Ÿäº§ç”Ÿçš„认证码为: <%= rand %><br><br />æ‚¨è¾“å…¥çš„è®¤è¯ç äØ“åQ?<%= input %><br><br /><br><br /><%<br />  if (rand.equals(input)) {<br />%><br /><font color=green>输入相同åQŒè®¤è¯æˆåŠŸï¼</font><br /><%<br />  } else {<br />%><br /><font color=red>输入不同åQŒè®¤è¯å¤±è´¥ï¼</font><br /><%<br />  }<br />%><br /></body><br /></html><img src ="http://www.aygfsteel.com/fisher/aggbug/93590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fisher/" target="_blank">Fisher</a> 2007-01-13 13:04 <a href="http://www.aygfsteel.com/fisher/articles/93590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EHCache 初步使用指南 http://www.aygfsteel.com/fisher/articles/93225.htmlFisherFisherThu, 11 Jan 2007 09:46:00 GMThttp://www.aygfsteel.com/fisher/articles/93225.htmlhttp://www.aygfsteel.com/fisher/comments/93225.htmlhttp://www.aygfsteel.com/fisher/articles/93225.html#Feedback0http://www.aygfsteel.com/fisher/comments/commentRss/93225.htmlhttp://www.aygfsteel.com/fisher/services/trackbacks/93225.html EHCache 初步使用指南   
Cc.Net BLoG 写的比较初çñ”,后箋ž®†åŠ å…¥å¯¹é…ç½®æ–‡äšg,内存/¼‚ç›˜å­˜å‚¨,优化,虚拟机宕æœ?日志½{‰çš„说明
1. EHCache 的特点,¾pȝ»Ÿè¦æ±‚及安è£?br />是一个纯Java ,˜q‡ç¨‹ä¸­ï¼ˆä¹Ÿå¯ä»¥ç†è§£æˆæ’入式)¾~“存实现
Hibernate2.1,Spring支持EHcache嵌入,自我感觉Hibernate2.1 + EHCache 很过瘾。。(‹¹‹è¯•¾l“果比Hibernate+JCS 好多了)
支持多CPU服务å™?br />其版本发布前˜q›è¡Œäº†äñ”品çñ”‹¹‹è¯•
支持åQšè¿è¡ŒçŽ¯å¢ƒjdk1.2åˆ?版本åQˆæºä»£ç ¾~–译需1.4æˆ?.5 版本åQ?br />jdk1.4å’?.5 版本,需加入apache çš?commons-logging¾cÕdº“ http://jakarta.apache.org/commons/logging.html
jdk1.2�.3 版本,需加入commons-collections 2.1 版本 http://jakarta.apache.org/commons/collections.html
�xerces (xml-apis.jar and xercesImpl.jar), 2.5 版本 http://xml.apache.org/xerces2-j/

如果˜qè¡ŒçŽ¯å¢ƒä¸ºIBM JDK1.4版本上的IBM Websphere 5.1,也需加入 commons-collections ¾cÕdº“(如需è¦?

单独安装Ehcache åQŒéœ€æŠŠehcache-X.X.jar 和相关类库方到classpath中ã€?br />如项目已安装了Hibernate2.1 ,则不需要做什么。。直接可以ä‹É用Ehcache

Cache 存储方式 åQšå†…存或¼‚ç›˜

2. 单独使用 EHCache

使用CacheManager 创徏òq¶ç®¡ç†Cache
使用默认配置文äšg创徏
CacheManager manager = CacheManager.create();
使用指定配置文äšg创徏
CacheManager manager = CacheManager.create("src/config/ehcache.xml");
从classpathq扑֯»é…ç½®æ–‡äšgòq¶åˆ›å»?
URL url = getClass().getResource("/anothername.xml");
CacheManager manager = CacheManager.create(url);
通过输入‹¹åˆ›å»?br />InputStream fis = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());
try {
manager = CacheManager.create(fis);
} finally {
fis.close();
}

卸蝲CacheManager ,关闭Cache

manager.shutdown();

使用Caches

取得配置文äšg中预å…?定义的sampleCache1讄¡½®,生成一个Cache
Cache cache = manager.getCache("sampleCache1");


讄¡½®ä¸€ä¸ªåä¸ºtest 的新cache,testå±žæ€§äØ“é»˜è®¤
CacheManager manager = CacheManager.create();
manager.addCache("test");

讄¡½®ä¸€ä¸ªåä¸ºtest 的新cache,òq¶å®šä¹‰å…¶å±žæ€?
CacheManager manager = CacheManager.create();
Cache cache = new Cache("test", 1, true, false, 5, 2);
manager.addCache(cache);


往cache中加入元�br />Element element = new Element("key1", "value1");
cache.put(new Element(element);


从cache中取得元�br />Element element = cache.get("key1");



3. �Hibernate 中运用EHCache

hibernate.cfg.xml中需讄¡½®å¦‚下åQ?br />2.1版本加入
<property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.Provider</property>
2.1以下版本加入
<property name="hibernate.cache.provider_class">net.sf.hibernate.cache.EhCache</property>

åœ?Hibernate 映射文äšg的每个需要Cacheçš„Domainä¸?br /><hibernate-mapping>
<class
name="com.somecompany.someproject.domain.Country"
table="ut_Countries"
dynamic-update="false"
dynamic-insert="false"
>
...

</hibernate-mapping>
加入¾cÖM¼¼å¦‚下格式信息åQ?br /><cache usage="read-write|nonstrict-read-write|read-only" />
比如åQ?br /><cache usage="read-write" />

然后在ehcache.xml中加�br /><ehcache>
<cache name="com.somecompany.someproject.domain.Country"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
overflowToDisk="false"
/>
</ehcache>


]]>
Java中一些关于日期、日期格式、日期的解析和日期的计算[转脓]http://www.aygfsteel.com/fisher/articles/91765.htmlFisherFisherThu, 04 Jan 2007 07:30:00 GMThttp://www.aygfsteel.com/fisher/articles/91765.htmlhttp://www.aygfsteel.com/fisher/comments/91765.htmlhttp://www.aygfsteel.com/fisher/articles/91765.html#Feedback0http://www.aygfsteel.com/fisher/comments/commentRss/91765.htmlhttp://www.aygfsteel.com/fisher/services/trackbacks/91765.html

Java中一些关于日期、日期格式、日期的解析和日期的计算

Java 语言的Calendar(日历),Date(日期), å’ŒDateFormat(日期格式)¾l„成了Java标准的一个基本但是非帔R‡è¦çš„部分. 日期是商业逻辑计算一个关键的部分. 所有的开发者都应该能够计算未来的日æœ? 定制日期的显½Cºæ ¼å¼? òq¶å°†æ–‡æœ¬æ•°æ®è§£æžæˆæ—¥æœŸå¯¹è±? 我们写了两篇文章, ˜q™æ˜¯½W¬ä¸€½‹? 我们ž®†å¤§æ¦‚的学习日期, 日期格式, 日期的解析和日期的计½Ž?

我们ž®†è®¨è®ÞZ¸‹é¢çš„¾c?

1、具体类(和抽象类相对)java.util.Date
2、抽象类java.text.DateFormat 和它的一个具体子¾c?java.text.SimpleDateFormat
3、抽象类java.util.Calendar 和它的一个具体子¾c?java.util.GregorianCalendar

具体¾cÕd¯ä»¥è¢«å®žä¾‹åŒ? 但是抽象¾cÕd´ä¸èƒ½. 你首先必™åÕd®žçŽ°æŠ½è±¡ç±»çš„ä¸€ä¸ªå…·ä½“å­¾c?

Date ¾cÖM»ŽJava 开发包(JDK) 1.0 ž®±å¼€å§‹è¿›åŒ? 当时它只包含了几个取得或者设¾|®ä¸€ä¸ªæ—¥æœŸæ•°æ®çš„各个部分的方æ³? 比如说月, æ—? 和年. ˜q™äº›æ–ÒŽ³•çŽ°åœ¨é­åˆ°äº†æ‰¹è¯„åÆˆä¸”å·²¾lè¢«è½¬ç§»åˆîCº†Calendar¾c»é‡ŒåŽÖMº†, 我们ž®†åœ¨æœ¬æ–‡ä¸­è¿›ä¸€æ­¥è®¨è®ºå®ƒ. ˜q™ç§æ”¹è¿›æ—¨åœ¨æ›´å¥½çš„处理日期数据的国际化格å¼? ž®Þp±¡åœ¨JDK 1.1中一æ ? Date ¾cÕd®žé™…上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林ž®¼æ²»æ ‡å‡†æ—‰™—´)1970òq? 1 æœ?1æ—?0:00:00˜q™ä¸€åˆÖM¹‹å‰æˆ–者是之后¾låŽ†çš„æ¯«¿U’æ•°.

一、创å»ÞZ¸€ä¸ªæ—¥æœŸå¯¹è±?

让我们看一个ä‹É用系¾lŸçš„当前日期和时间创å»ÞZ¸€ä¸ªæ—¥æœŸå¯¹è±¡åƈ˜q”回一个长整数的简单例å­? ˜q™ä¸ªæ—‰™—´é€šå¸¸è¢«ç§°ä¸ºJava 虚拟æœ?JVM)ä¸ÀLœºçŽ¯å¢ƒçš„ç³»¾lŸæ—¶é—?
//------------------------------------------------------
import java.util.Date;

public class DateExample1
{
public static void main(String[] args)
{
// Get the system date/time
Date date = new Date();

System.out.println(date.getTime());
}
}
//------------------------------------------------------

在星期六, 2001òq?æœ?9æ—? 下午大约æ˜?:50的样å­? 上面的例子在¾pȝ»Ÿè¾“出讑֤‡ä¸Šæ˜¾½Cºçš„¾l“æžœæ˜?1001803809710. 在这个例子中,值得注意的是我们使用了Date 构造函数创å»ÞZ¸€ä¸ªæ—¥æœŸå¯¹è±? ˜q™ä¸ªæž„造函数没有接受ä“Q何参æ•? 而这个构造函数在内部使用了System.currentTimeMillis() æ–ÒŽ³•来从¾pȝ»ŸèŽ·å–æ—¥æœŸ.

那么, 现在我们已经知道了如何获取从1970òq?æœ?日开始经历的毫秒æ•îCº†. 我们如何才能以一¿Uç”¨æˆäh˜Žç™½çš„æ ¼å¼æ¥æ˜¾½Cø™¿™ä¸ªæ—¥æœŸå‘¢? 在这里类java.text.SimpleDateFormat 和它的抽象基¾c?java.text.DateFormat ž®±æ´¾å¾—上用场äº?

二、日期数据的定制格式

假如我们希望定制日期数据的格å¼? 比方星期å…?9æœ?29æ—?2001òq? 下面的例子展½CÞZº†å¦‚何完成˜q™ä¸ªå·¥ä½œ:

//------------------------------------------------------
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateExample2
{

public static void main(String[] args)
{

SimpleDateFormat bartDateFormat =
new SimpleDateFormat("EEEE-MMMM-dd-yyyy");

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" 调用SimpleDateFormat¾c? 但是˜q™ä¸€‹Æ? 我们使用格式化解析而不是生成一个文本日期数æ? 我们的例å­? 昄¡¤ºåœ¨ä¸‹é? ž®†è§£æžæ–‡æœ¬å­—½W¦ä¸²"9-29-2001"òq¶åˆ›å»ÞZ¸€ä¸ªå€égØ“001736000000 的日期对è±?

//------------------------------------------------------
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateExample3
{

public static void main(String[] args)
{
// Create a date formatter that can parse dates of
// the form MM-dd-yyyy.
SimpleDateFormat bartDateFormat =
new SimpleDateFormat("MM-dd-yyyy");

// Create a string containing a text date to be parsed.
String dateStringToParse = "9-29-2001";

try {
// 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);

// Now send the parsed date as a long value
// to the system output.
System.out.println(date.getTime());
}
catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
//------------------------------------------------------

四、ä‹É用标准的日期格式化过½E?

既然我们已经可以生成和解析定制的日期格式äº? 让我们来看一看如何ä‹É用内建的格式化过½E? æ–ÒŽ³• DateFormat.getDateTimeInstance() 让我们得以用几种不同的方法获得标准的日期格式化过½E? 在下面的例子ä¸? 我们获取了四个内建的日期格式化过½E? 它们包括一个短çš? 中等çš? é•¿çš„, 和完整的日期格式.

//------------------------------------------------------
import java.text.DateFormat;
import java.util.Date;

public class DateExample4
{

public static void main(String[] args)
{
Date date = new Date();

DateFormat shortDateFormat =
DateFormat.getDateTimeInstance(
DateFormat.SHORT,
DateFormat.SHORT);

DateFormat mediumDateFormat =
DateFormat.getDateTimeInstance(
DateFormat.MEDIUM,
DateFormat.MEDIUM);

DateFormat longDateFormat =
DateFormat.getDateTimeInstance(
DateFormat.LONG,
DateFormat.LONG);

DateFormat fullDateFormat =
DateFormat.getDateTimeInstance(
DateFormat.FULL,
DateFormat.FULL);

System.out.println(shortDateFormat.format(date));
System.out.println(mediumDateFormat.format(date));
System.out.println(longDateFormat.format(date));
System.out.println(fullDateFormat.format(date));
}
}
//------------------------------------------------------

注意我们在对 getDateTimeInstance的每‹Æ¡è°ƒç”¨ä¸­éƒ½ä¼ é€’了两个å€? ½W¬ä¸€ä¸ªå‚数是日期风格, 而第二个参数是时间风æ ? 它们都是基本数据¾cÕdž‹int(æ•´åž‹). 考虑到可è¯ÀL€? 我们使用了DateFormat ¾cÀLä¾›çš„帔R‡: SHORT, MEDIUM, LONG, å’?FULL. 要知道获取时间和日期格式化过½E‹çš„æ›´å¤šçš„æ–¹æ³•和选项, è¯ïLœ‹Sun 公司Web 站点上的解释.

˜qè¡Œæˆ‘们的例子程序的时å€? å®ƒå°†å‘æ ‡å‡†è¾“å‡ø™®¾å¤‡è¾“å‡ÞZ¸‹é¢çš„内容:
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

五、Calendar ¾c?

æˆ‘ä»¬çŽ°åœ¨å·²ç»èƒ½å¤Ÿæ ¼å¼åŒ–åÆˆåˆ›å¾ä¸€ä¸ªæ—¥æœŸå¯¹è±¡äº†, 但是我们如何才能讄¡½®å’ŒèŽ·å–æ—¥æœŸæ•°æ®çš„ç‰¹å®šéƒ¨åˆ†å‘? 比如说小æ—? æ—? 或者分é’? 我们又如何在日期的这些部分加上或者减åŽÕd€¼å‘¢? ½{”案是ä‹É用Calendar ¾c? ž®±å¦‚我们前面提到的那æ ? Calendar ¾cÖM¸­çš„æ–¹æ³•替代了Date ¾cÖM¸­è¢«ähå”ùNª‚的方æ³?

假设你想要设¾|? 获取, 和操¾Uµä¸€ä¸ªæ—¥æœŸå¯¹è±¡çš„各个部分, 比方一个月的一天或者是一个星期的一å¤? ä¸ÞZº†æ¼”示˜q™ä¸ª˜q‡ç¨‹, 我们ž®†ä‹É用具体的子类 java.util.GregorianCalendar. 考虑下面的例å­? 它计½Ž—å¾—åˆîC¸‹é¢çš„½W¬åä¸ªæ˜ŸæœŸäº”æ˜?3å?

//------------------------------------------------------
import java.util.GregorianCalendar;
import java.util.Date;
import java.text.DateFormat;

public class DateExample5
{

public static void main(String[] args)
{
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);

// Create our Gregorian Calendar.
GregorianCalendar cal = new GregorianCalendar();

// Set the date and time of our calendar
// to the system&s date and time
cal.setTime(new Date());

System.out.println("System Date: " +
dateFormat.format(cal.getTime()));

// Set the day of week to FRIDAY
cal.set(GregorianCalendar.DAY_OF_WEEK,
GregorianCalendar.FRIDAY);
System.out.println("After Setting Day of Week to Friday: " +
dateFormat.format(cal.getTime()));

int friday13Counter = 0;

while (friday13Counter <= 10)
{

// Go to the next Friday by adding 7 days.
cal.add(GregorianCalendar.DAY_OF_MONTH, 7);

// If the day of month is 13 we have
// 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);

set æ–ÒŽ³•能够让我们通过½Ž€å•的讄¡½®æ˜ŸæœŸä¸­çš„å“ªä¸€å¤©è¿™ä¸ªåŸŸæ¥å°†æˆ‘ä»¬çš„æ—¶é—´è°ƒæ•´äØ“æ˜ŸæœŸäº? 注意到这里我们ä‹É用了帔R‡ DAY_OF_WEEK å’?FRIDAY来增å¼ÞZ»£ç çš„可读æ€? add æ–ÒŽ³•让我们能够在日期上加上数å€? 润年的所有复杂的计算都由˜q™ä¸ªæ–ÒŽ³•自动处理.

我们˜q™ä¸ªä¾‹å­çš„输出结果是:
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

六、时间掌握在你的手里



]]>
计算Java日期http://www.aygfsteel.com/fisher/articles/91763.htmlFisherFisherThu, 04 Jan 2007 07:27:00 GMThttp://www.aygfsteel.com/fisher/articles/91763.htmlhttp://www.aygfsteel.com/fisher/comments/91763.htmlhttp://www.aygfsteel.com/fisher/articles/91763.html#Feedback0http://www.aygfsteel.com/fisher/comments/commentRss/91763.htmlhttp://www.aygfsteel.com/fisher/services/trackbacks/91763.html 计算Java日期
学习怎样创徏和ä‹É用日æœ?
概要
    不管你是处理财务交易˜q˜æ˜¯è®¡åˆ’着下一步的行动åQŒä½ éƒ½è¦çŸ¥é“怎样在Java中徏立,使用和显½Cºæ—¥æœŸã€‚这需要你½Ž€å•的查阅一下相应类的API参考:一个日期可以创å»?个相关类的对象。这½‹‡æ–‡ç« å‘Šè¯‰ä½ ä½ æƒ³è¦çŸ¥é“的内容。(3,000字)
作者:Robert Nielsen
¾˜»è¯‘åQ?/strong>Cocia Lin

    Java¾lŸè®¡ä»?970òq?æœ?æ—¥è“v的毫¿U’的数量表示日期。也ž®±æ˜¯è¯ß_¼Œä¾‹å¦‚åQ?970òq?æœ?日,是在1æœ?日后çš?6åQ?00åQ?00毫秒。同æ ïLš„åQ?969òq?2æœ?1日是åœ?970òq?æœ?日前86åQ?00åQ?00毫秒。Javaçš„Date¾cÖM‹É用long¾cÕdž‹¾Uªå½•˜q™äº›æ¯«ç§’å€?因䨓long是有½W¦å·æ•´æ•°åQŒæ‰€ä»¥æ—¥æœŸå¯ä»¥åœ¨1970òq?æœ?日之前,也可以在˜q™ä¹‹åŽã€‚Long¾cÕdž‹è¡¨ç¤ºçš„æœ€å¤§æ­£å€¼å’Œæœ€å¤§è´Ÿå€¼å¯ä»¥è½»æ„¡š„表示290åQ?00åQ?00òq´çš„æ—‰™—´åQŒè¿™é€‚合大多æ•îCh的时间要求ã€?br />Date ¾c?br />   Date¾cÕd¯ä»¥åœ¨java.util包中扑ֈ°åQŒç”¨ä¸€ä¸ªlong¾cÕdž‹çš„倯D¡¨½CÞZ¸€ä¸ªæŒ‡å®šçš„æ—¶åˆ»ã€‚它的一个有用的构造函数是Date(),它创å»ÞZ¸€ä¸ªè¡¨½Cºåˆ›å»ºæ—¶åˆÈš„对象。getTime()æ–ÒŽ³•˜q”回Date对象的long倹{€‚在下面的程序中åQŒæˆ‘使用Date()构造函数创å»ÞZ¸€ä¸ªè¡¨½Cºç¨‹åºè¿è¡Œæ—¶åˆÈš„对象åQŒåƈ且利用getTime()æ–ÒŽ³•扑ֈ°˜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 åœ¨ä¸€ä¸ªåˆç†çš„范围åQšå®ƒä¸åˆ°31òqß_¼Œ˜q™ä¸ªæ•°å€¼ç›¸å¯?970òq?æœ?日到我写˜q™ç¯‡æ–‡ç« çš„æ—¶é—´æ¥è¯ß_¼Œæ˜¯åˆç†çš„。计½Ž—机是这个毫¿U’倯D¡¨½Cºæ—¶é—ß_¼ŒäºÞZ»¬å¯ä¸æ„¿æ„è¯? 我将åœ?96,321,998,34见到你ã€?òq¸è¿çš„æ˜¯åQŒJava提供了一个è{换Date对象到字½W¦ä¸²çš„途径åQŒè¡¨½Cºæˆä¼ ç»Ÿçš„åŞ式。我们在下一节讨论DateFormat¾c»ï¼Œå®ƒç›´è§‚的建立日期字符丌Ӏ?
DateFormat¾c?br /> DateFormat¾cȝš„一个目标是建立一个äh们能够识别的字符丌Ӏ‚ç„¶è€Œï¼Œå› äØ“è¯­è¨€çš„å·®åˆ«ï¼Œä¸æ˜¯æ‰€æœ‰çš„äººå¸Œæœ›çœ‹åˆîC¸¥æ ¼çš„相同格式的日期。法国ähæ›´å–œ‹Æ¢çœ‹åˆ?25 decembre 2000,",但是¾ŸŽå›½äºÞZ¹ æƒ¯çœ‹åˆ?December 25,2000."所以一个DateFormat的实例创å»ÞZ»¥åŽï¼Œ˜q™ä¸ªå¯¹è±¡åŒ…含了日期的昄¡¤ºæ ¼å¼çš„信息。如果ä‹É用用æˆïL”µè„‘区域设¾|®ç¼ºçœçš„æ ¼å¼åQŒä½ å¯ä»¥è±¡ä¸‹é¢é‚£æ øP¼Œåˆ›å¾DateFormat对象åQŒä‹É用getDateInstance()æ–ÒŽ³•åQ?/p>

DateFormat df = DateFormat.getDateInstance();  

DateFormat¾cÕdœ¨java.text包中可以扑ֈ°ã€?br />转换成字½W¦ä¸²
你可以ä‹É用format()æ–ÒŽ³•转换Date对象ä¸ÞZ¸€ä¸ªå­—½W¦ä¸²ã€‚下面的½CÞZ¾‹½E‹åºè¯´æ˜Žäº†è¿™ä¸ªé—®é¢˜ï¼š

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()æ–ÒŽ³•。Java˜q˜æä¾›äº†å‡ ä¸ªé€‰æ‹©æ—¥æœŸæ ¼å¼åQŒä½ å¯ä»¥é€šè¿‡ä½¿ç”¨é‡è²çš„getDateInstance(int style)获得。出于方便的原因åQŒDateFormat提供了几¿Ué¢„¾|®çš„帔R‡åQŒä½ å¯ä»¥ä½¿ç”¨˜q™äº›å¸”R‡å‚数。下面是几个SHORT, MEDIUM, LONG, å’ŒFULL¾cÕdž‹çš„示例:

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

同样的程序,在我的电脑上使用¾~ºçœè®„¡½®˜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Œç‘žå…¸çš„æœˆä†¾ä¸æ˜¯å¤§å†™çš„(虽然November˜q˜æ˜¯novemberåQ?˜q˜æœ‰åQŒLONGå’ŒFULL版本在瑞典语中是一æ ïLš„åQŒä½†æ˜¯ç¾Žå›½è‹±è¯­å´ä¸åŒã€‚另外,有趣的是åQŒç‘žå…¸è¯­å•词的星期三,onsdagåQŒæ²¡æœ‰åŒ…含在FULL日期里,è‹Þp¯­å´åŒ…括ã€?
注意你能够ä‹É用getDateInstance()æ–ÒŽ³•改变DateFormat实例的语¿Uï¼›ä½†æ˜¯åQŒåœ¨ä¸Šé¢çš„例子中åQŒæ˜¯é€šè¿‡æ”¹å˜Windows98的控刉™¢æ¿çš„区域讄¡½®åšåˆ°çš„。不同的地方的区域设¾|®ä¸åŒï¼Œ¾l“æžœž®×ƒ¸åŒï¼Œ˜q™æ ·æœ‰å¥½å¤„,也有不èƒöåQŒJava½E‹åºå‘˜åº”该了解这些。一个好处是Java½E‹åºå‘˜å¯ä»¥åªå†™ä¸€è¡Œä»£ç å°±å¯ä»¥æ˜„¡¤ºæ—¥æœŸåQŒè€Œä¸”世界不同地区的电脑运行同æ ïLš„½E‹åºä¼šæœ‰ä¸ç”¨çš„æ—¥æœŸæ ¼å¼ã€?但是˜q™ä¹Ÿæ˜¯ä¸€ä¸ªç¼ºç‚¹ï¼Œå½“程序员希望昄¡¤ºåŒä¸€¿Uæ ¼å¼çš„æ—?-˜q™ä¹Ÿæœ‰å¯å–之处,举例来说åQŒåœ¨½E‹åºä¸­æØœåˆè¾“出文本和日期åQŒå¦‚果文本是英文åQŒæˆ‘们就不希望日期格式是其他的格式,象å¯d文或是西班牙文。如果程序员依靠日期格式¾~–程åQŒæ—¥æœŸæ ¼å¼å°†æ ÒŽ®˜qè¡Œ½E‹åºæ‰€åœ¨ç”µè„‘的区域讄¡½®ä¸ç”¨è€Œä¸åŒã€?
解析字符�/strong>
 通过parse()æ–ÒŽ³•åQŒDateFormat能够以一个字½W¦ä¸²åˆ›ç«‹ä¸€ä¸ªDate对象。这个方法能抛出ParseException异常åQŒæ‰€ä»¥ä½ å¿…须使用适当的异常处理技术。下面的例子½E‹åºé€šè¿‡å­—符串创建Date对象åQ?/p>

import java.util.*;
import java.text.*;

public class ParseExample {
   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()æ–ÒŽ³•很有用。我ž®†é€šè¿‡å¦ä¸€¿Uæ–¹æ³•创å»ÞZ¸€ä¸ªä“Q意得日期。同æ—Óž¼Œä½ å°†çœ‹åˆ°æ€Žæ ·˜q›è¡ŒåŸºæœ¬æ—¥æœŸè®¡ç®—åQŒä¾‹å¦‚计½Ž?0天后的另一天。你可以使用GregorianCalendar¾cÀL¥å®Œæˆ˜q™ä¸ªä»ÕdŠ¡ã€?
GregorianCalendar¾c?/strong>
 创徏一个代表ä“Q意日期的一个途径使用GregorianCalendar¾cÈš„æž„造函敎ͼŒå®ƒåŒ…含在java.util包中åQ?/p>

GregorianCalendar(int year, int month, int date)

注意月䆾的表½Cºï¼Œä¸€æœˆæ˜¯0åQŒäºŒæœˆæ˜¯1åQŒä»¥æ­¤ç±»æŽ¨ï¼Œæ˜?2月是11。因为大多数äºÞZ¹ æƒ¯äºŽä½¿ç”¨å•词而不是ä‹É用数字来表示月䆾åQŒè¿™æ ïL¨‹åºä¹Ÿè®¸æ›´æ˜“读åQŒçˆ¶¾c»Calendar使用帔R‡æ¥è¡¨½Cºæœˆä»½ï¼šJANUARY, FEBRUARY,½{‰ç­‰ã€‚所以,创徏Wilbur å’?Orville刉™€ ç¬¬ä¸€æž¶åŠ¨åŠ›é£žæœºçš„æ—¥æœŸåQˆDecember 17, 1903åQ‰ï¼Œä½ å¯ä»¥ä‹É用:

GregorianCalendar firstFlight = new GregorianCalendar(1903, Calendar.DECEMBER, 17); 
å‡ÞZºŽæ¸…楚的考虑åQŒä½ åº”该使用前面的åŞ式。但是,你也应该学习怎样阅读下面的短格式。下面的例子同样表示December 17,1903åQˆè®°ä½ï¼Œåœ¨çŸ­æ ¼å¼ä¸­ï¼Œ11表示DecemberåQ?/p>

GregorianCalendar firstFlight = new GregorianCalendar(1903, 11, 17);  

在上一节中åQŒä½ å­¦ä¹ äº†è{换Date对象到字½W¦ä¸²ã€‚这里,你可以做同样的事情;但是首先åQŒä½ éœ€è¦å°†GregorianCalendar对象转换到Date。要做到˜q™ä¸€ç‚¹ï¼Œä½ å¯ä»¥ä‹É用getTime()æ–ÒŽ³•åQŒä»Žå®ƒå¾—父类Calendar¾l§æ‰¿è€Œæ¥ã€‚GetTime()æ–ÒŽ³•˜q”回GregorianCalendar相应的Date对象。你能够创徏GregorianCalendar对象åQŒè{换到Date对象åQŒå¾—到和输出相应的字½W¦ä¸²˜q™æ ·ä¸€ä¸ªè¿‡½E‹ã€‚下面是例子åQ?

import java.util.*;
import java.text.*;

public class Flight {

   public static void main(String[] args) {
      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¸€ä¸ªä»£è¡¨å½“前时åˆÈš„GregorianCalendar¾cȝš„实例是很有用的。你可以½Ž€å•的使用没有参数的GregorianCalendar构造函敎ͼŒè±¡è¿™æ øP¼š

GregorianCalendar thisday = new GregorianCalendar();

一个输å‡ÞZ»Šå¤©æ—¥æœŸçš„例子½E‹åºåQŒä‹É用GregorianCalendar对象åQ?/p>

import java.util.*;
import java.text.*;

class Today {
   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()构造函数很¾cÖM¼¼åQšéƒ½åˆ›å¾ä¸€ä¸ªå¯¹è±¡ï¼Œæ¡äšg½Ž€å•,代表今天ã€?br />日期处理
GregorianCalendar¾cÀLä¾›å¤„理日期的æ–ÒŽ³•。一个有用的æ–ÒŽ³•是add().使用add()æ–ÒŽ³•åQŒä½ èƒ½å¤Ÿå¢žåŠ è±¡å¹´åQŒæœˆæ•ŽÍ¼Œå¤©æ•°åˆ°æ—¥æœŸå¯¹è±¡ä¸­ã€‚要使用add()æ–ÒŽ³•åQŒä½ å¿…须提供要增加的字段åQŒè¦å¢žåŠ çš„æ•°é‡ã€‚ä¸€äº›æœ‰ç”¨çš„å­—æ®µæ˜¯DATE, MONTH, YEAR, å’?WEEK_OF_YEAR。下面的½E‹åºä½¿ç”¨add()æ–ÒŽ³•计算未来80天的一个日期。在Julesçš?lt;环球80å¤?gt;是一个重要的数字åQŒä‹É用这个程序可以计½Ž—Phileas Fogg从出发的那一å¤?872òq?0æœ?日后80天的日期åQ?/p>

import java.util.*;
import java.text.*;

public class World {
   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.util.*;
import java.text.*;

public class Mortgage {
   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Œè®¾¾|®å®ƒå’ŒåŽŸæ¥çš„ç›¸ç­‰åQˆequalåQ‰ã€‚原因是两个变量指向同一个Date()对象地址。如果Date对象改变åQŒä¸¤ä¸ªå˜é‡å°±æŒ‡å‘改变后的日期对象。代替这¿Uåšæ³•,应该创徏一个新对象。下面的½E‹åº½Cø™Œƒäº†è¿™¿Uåšæ³•:

import java.util.*;
import java.text.*;

public class ThreeDates {
   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

      gc1.add(Calendar.YEAR, 1);
      file://gc1 and gc2 are changed

      DateFormat df = DateFormat.getDateInstance();

      Date d1 = gc1.getTime();
      Date d2 = gc2.getTime();
      Date d3 = gc3.getTime();

      String s1 = df.format(d1);
      String s2 = df.format(d2);
      String s3 = df.format(d3);

      System.out.println("gc1 is " + s1);
      System.out.println("gc2 is " + s2);
      System.out.println("gc3 is " + s3);
   }
}

    ½E‹åº˜qè¡ŒåŽï¼Œgc1å’Œgc2被变æˆ?001òqß_¼ˆå› äؓ两个对象指向同一个DateåQŒè€ŒDate已经被改变了åQ‰ã€‚对象gc3指向一个单独的DateåQŒå®ƒæ²¡æœ‰è¢«æ”¹å˜ã€?br />计算复习日期
在这节,你将看到一个依据现实世界的例子。这个详¾l†çš„½E‹åºè®¡ç®—˜q‡åŽ»ä¸€ä¸ªå…·ä½“çš„æ—¥æœŸã€‚ä¾‹å¦‚ï¼Œä½ é˜…è¯»è¿™½‹‡æ–‡ç« ï¼Œä½ æƒ³è¦è®°ä½ä¸€ä¸ªå°è±¡æ·±åˆÈš„知识炏V€‚如果你没有照片一æ ïLš„记忆力,你就要定期的复习˜q™äº›æ–°èµ„料,˜q™å°†å¸®åŠ©ä½ è®°ä½å®ƒã€‚å…³äºŽå¤ä¹ ç³»¾lŸï¼ŒKurt Hanks å’?Gerreld L. Pulsipher在他们的< Five Secrets to Personal Productivity个äh能力çš?个秘å¯?gt;中有讨论åQŒå¾è®®çœ‹˜q‡ç¬¬ä¸€çœ¼åŽé©¬ä¸Šå›žé¡¾ä¸€ä¸‹ï¼Œç„¶åŽæ˜?天后åQ?个星期后åQ?个月后,3个月后,1òq´åŽã€‚我的这½‹‡æ–‡ç« ï¼Œä½ è¦é©¬ä¸Šå›žé¡¾ä¸€ä¸‹ï¼Œä»ŽçŽ°åœ¨ç®—èµøP¼Œå†å°±æ˜¯æ˜Žå¤©ï¼Œç„¶åŽæ˜?个星期,1个月åQ?个月åQ?òq´åŽã€‚我们的½E‹åºž®†è®¡½Ž—这些日期ã€?br />˜q™ä¸ª½E‹åºéžå¸¸æœ‰ç”¨çš„,它将是PIM(Personal Information Manager个äh信息½Ž¡ç†å™?的一个组成部分,òq¶å°†¼‹®å®šå¤ä¹ æ—‰™—´ã€‚在下面的程序中åQŒgetDates()æ–ÒŽ³•对一个返回日期数¾l„(复习日期åQ‰çš„电子软äšg很有用。另外,你可以返回单独的一个日期,使用getFirstDay(),getOneDay(),getOneWeek(),getOnMonth()å’ŒgetOneYear().å½“æ—¶é—´èŒƒå›´è¶…å‡ø™¿™ä¸ªPIMçš„ReviewDates的计½Ž—范围时ReviewDates¾cÀL¼”½CÞZº†æ€Žæ ·è®¡ç®—æ—‰™—´ŒDüc€‚现在,你可以容易的修改它用来处理你需要的旉™—´ŒDµï¼Œè±¡å›¾ä¹¦é¦†å€Ÿä¹¦åQŒå½•影带¿UŸèµå’ŒæŠµæŠÆD®¡½Ž—。首先,ReviewDates¾cÀL˜¾½Cºåœ¨ä¸‹é¢åQ?/p>

import java.util.*;
import java.text.*;

public class ReviewDates {
   private GregorianCalendar firstDay, oneDay, oneWeek, oneMonth, oneQuarter, oneYear;
   final int dateArraySize = 6;

   ReviewDates(GregorianCalendar gcDate) {
      int year = gcDate.get(GregorianCalendar.YEAR);
      int month = gcDate.get(GregorianCalendar.MONTH);
      int date = gcDate.get(GregorianCalendar.DATE);

      firstDay = new GregorianCalendar(year, month, 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);

      oneDay.add(GregorianCalendar.DATE, 1);
      oneWeek.add(GregorianCalendar.DATE, 7);
      oneMonth.add(GregorianCalendar.MONTH, 1);
      oneQuarter.add(GregorianCalendar.MONTH, 3);
      oneYear.add(GregorianCalendar.YEAR, 1);
   }

   ReviewDates() {
      this(new GregorianCalendar());
   }

   public void listDates() {
      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 ss =  df.format(startDate);
      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("Start date is " + ss);
      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();
   }

   public GregorianCalendar[] getDates() {
      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;
   }

   public GregorianCalendar getFirstDay() {
      return this.firstDay;
   }

   public GregorianCalendar getOneDay() {
      return this.oneDay;
   }

   public GregorianCalendar getOneWeek() {
      return this.oneWeek;
   }

   public GregorianCalendar getOneMonth() {
      return this.oneMonth;
   }

   public GregorianCalendar getOneQuarter() {
      return this.oneQuarter;
   }

   public GregorianCalendar getOneYear() {
      return this.oneYear;
   }
} 

下面是ä‹É用ReviewDates¾cÕdˆ—出复习日期的例子½E‹åºåQ?/p>

import java.util.*;

public class ShowDates {
   public static void main(String[] args) {
      ReviewDates rd = new ReviewDates();
      rd.listDates();

      GregorianCalendar gc = new GregorianCalendar(2001, Calendar.JANUARY, 15);
      ReviewDates jan15 = new ReviewDates(gc);
      jan15.listDates();
   }
}

æ€È»“
 ˜q™ç¯‡æ–‡ç« ä»‹ç»äº†å…³äºŽæ—¥æœŸå¤„理的3个重要的¾c»ï¼šDate,DateFormat,GregorianCalendar.˜q™äº›¾c»è®©ä½ åˆ›å»ºæ—¥æœŸï¼Œè½¬æ¢æˆå­—½W¦ä¸²åQŒå’Œè®¡ç®—日期基本元素。处理Java中的日期问题åQŒè¿™½‹‡æ–‡ç« åªæ˜¯å†°å±×ƒ¸€è§’。可是,我在˜q™é‡Œä»‹ç»çš„类和方法不仅仅是你学习高çñ”技术的è·Ïx¿åQŒè¿™äº›ç±»å’Œæ–¹æ³•本íw«å°±å¯ä»¥å¤„理很多通常的日期相关的ä»ÕdŠ¡



]]>
关于java模拟ie 讉K—®web¾|‘站的解å†Ïx–¹æ³?/title><link>http://www.aygfsteel.com/fisher/articles/86926.html</link><dc:creator>Fisher</dc:creator><author>Fisher</author><pubDate>Mon, 11 Dec 2006 07:55:00 GMT</pubDate><guid>http://www.aygfsteel.com/fisher/articles/86926.html</guid><wfw:comment>http://www.aygfsteel.com/fisher/comments/86926.html</wfw:comment><comments>http://www.aygfsteel.com/fisher/articles/86926.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/fisher/comments/commentRss/86926.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/fisher/services/trackbacks/86926.html</trackback:ping><description><![CDATA[ <p>在用Javaçš„HttpURLConnection 来下载网™åµï¼Œå‘现讉K—®google的网站时åQŒä¼šè¢«google拒绝掉ã€?br /><br />       try<br />        {<br />            url = new URL(urlStr);<br />            httpConn = (HttpURLConnection) url.openConnection();<br />            HttpURLConnection.setFollowRedirects(true);</p> <p>            // logger.info(httpConn.getResponseMessage());<br />            in = httpConn.getInputStream();<br />            out = new FileOutputStream(new File(outPath));</p> <p>            chByte = in.read();<br />            while (chByte != -1)<br />            {<br />                out.write(chByte);<br />                chByte = in.read();<br />            }<br />        }<br />        catch (MalformedURLException e)<br />        {<br />         }<br />        }<br /><br /><br /><br />¾lè¿‡ä¸€ŒD‰|—¶é—´çš„研究和查找资料,发现是由于上面的代码¾~ºå°‘äº†ä¸€äº›å¿…è¦çš„ä¿¡æ¯å¯ÆD‡´åQŒå¢žåŠ æ›´åŠ è¯¦¾l†çš„属æ€?br /><br />            httpConn.setRequestMethod("GET"); <br />            httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)"); <br /><br />完整代码如下åQ?br />   public static void DownLoadPages(String urlStr, String outPath)<br />    {<br />        int chByte = 0;<br />        URL url = null;<br />        HttpURLConnection httpConn = null;<br />        InputStream in = null;<br />        FileOutputStream out = null;</p> <p>        try<br />        {<br />            url = new URL(urlStr);<br />            httpConn = (HttpURLConnection) url.openConnection();<br />            HttpURLConnection.setFollowRedirects(true);<br />            httpConn.setRequestMethod("GET"); <br />            httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)"); <br />            <br />            // logger.info(httpConn.getResponseMessage());<br />            in = httpConn.getInputStream();<br />            out = new FileOutputStream(new File(outPath));</p> <p>            chByte = in.read();<br />            while (chByte != -1)<br />            {<br />                out.write(chByte);<br />                chByte = in.read();<br />            }<br />        }<br />        catch (MalformedURLException e)<br />        {<br />            e.printStackTrace();<br />        }<br />        catch (IOException e)<br />        {<br />            e.printStackTrace();<br />        }<br />        finally<br />        {<br />            try<br />            {<br />                out.close();<br />                in.close();<br />                httpConn.disconnect();<br />            }<br />            catch (Exception ex)<br />            {<br />                ex.printStackTrace();<br />            }<br />        }<br />    }<br /><br />此外åQŒè¿˜æœ‰ç¬¬äºŒç§æ–ÒŽ³•可以讉K—®Google的网站,ž®±æ˜¯ç”¨apache的一个工具HttpClient 模仿一个浏览器来访问Google<br /><br />        Document document = null;<br />        HttpClient httpClient = new HttpClient();<br />        <br />        GetMethod getMethod = new GetMethod(url);<br />        getMethod.setFollowRedirects(true);<br />        int statusCode = httpClient.executeMethod(getMethod);<br />        <br />        if (statusCode == HttpStatus.SC_OK)<br />        {<br />            InputStream in = getMethod.getResponseBodyAsStream();<br />            InputSource is = new InputSource(in);</p> <p>            DOMParser domParser = new DOMParser();   //nekoHtml ž®†å–å¾—çš„¾|‘页转换成dom<br />            domParser.parse(is);<br />            document = domParser.getDocument();<br />            <br />            System.out.println(getMethod.getURI());<br />            <br />        }<br />        return document;<br /><br />推荐使用½W¬ä¸€¿Uæ–¹å¼ï¼Œä½¿ç”¨HttpConnection 比较轻量¾U§ï¼Œé€Ÿåº¦ä¹Ÿæ¯”½W¬äºŒ¿UHttpClient 的快ã€?/p> <img src ="http://www.aygfsteel.com/fisher/aggbug/86926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/fisher/" target="_blank">Fisher</a> 2006-12-11 15:55 <a href="http://www.aygfsteel.com/fisher/articles/86926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> Ö÷Õ¾Ö©Öë³ØÄ£°å£º <a href="http://" target="_blank">Íâ»ã</a>| <a href="http://" target="_blank">ÑÓÊÙÏØ</a>| <a href="http://" target="_blank">×ÏÑôÏØ</a>| <a href="http://" target="_blank">³¤ÊÙÇø</a>| <a href="http://" target="_blank">³Ç²½</a>| <a href="http://" target="_blank">ÉÏÓÝÊÐ</a>| <a href="http://" target="_blank">ÏÌ·áÏØ</a>| <a href="http://" target="_blank">ƽÏçÏØ</a>| <a href="http://" target="_blank">ÐÝÄþÏØ</a>| <a href="http://" target="_blank">ÔÀÑôÏØ</a>| <a href="http://" target="_blank">µÂ²ýÏØ</a>| <a href="http://" target="_blank">×ó¹±ÏØ</a>| <a href="http://" target="_blank">Èô¶û¸ÇÏØ</a>| <a href="http://" target="_blank">±±íÕÇø</a>| <a href="http://" target="_blank">Í­ÁêÊÐ</a>| <a href="http://" target="_blank">ºø¹ØÏØ</a>| <a href="http://" target="_blank">¸ßÒØÏØ</a>| <a href="http://" target="_blank">ɽÎ÷Ê¡</a>| <a href="http://" target="_blank">ÔÆÁúÏØ</a>| <a href="http://" target="_blank">ÑÎÍ¤ÏØ</a>| <a href="http://" target="_blank">ÒÇÕ÷ÊÐ</a>| <a href="http://" target="_blank">´ó³§</a>| <a href="http://" target="_blank">´óÎòÏØ</a>| <a href="http://" target="_blank">ÉäÑôÏØ</a>| <a href="http://" target="_blank">Î÷ÄþÊÐ</a>| <a href="http://" target="_blank">ÓÀÖÝÊÐ</a>| <a href="http://" target="_blank">ºù«µºÊÐ</a>| <a href="http://" target="_blank">À¼Æº</a>| <a href="http://" target="_blank">ÒÁ´¨ÏØ</a>| <a href="http://" target="_blank">äü¹ØÏØ</a>| <a href="http://" target="_blank">Ì«²ÖÊÐ</a>| <a href="http://" target="_blank">²©ÂÞÏØ</a>| <a href="http://" target="_blank">¶«Ïç×å×ÔÖÎÏØ</a>| <a href="http://" target="_blank">ÎÚº£ÊÐ</a>| <a href="http://" target="_blank">Ñô¹ÈÏØ</a>| <a href="http://" target="_blank">Î÷ÁÖÏØ</a>| <a href="http://" target="_blank">ÇɼÒÏØ</a>| <a href="http://" target="_blank">ÐËÈÊÏØ</a>| <a href="http://" target="_blank">ÓÀÖÝÊÐ</a>| <a href="http://" target="_blank">¾£ÖÝÊÐ</a>| <a href="http://" target="_blank">ÒË»ÆÏØ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>