â€È®€˜q°â€?/font>
Subversion是近期在开æºç¤¾åŒÞZ¸éžå¸¸‹¹è¡Œçš„一‹Æ„¡‰ˆæœ¬æŽ§åˆ¶èÊYä»Óž¼Œå®ƒæ˜¯CVS的替代äñ”物ã€?/p>
它的主è¦ç‰¹å¾æœ‰ï¼š
å…¶ä»–˜q˜æœ‰äº›é›¶æ˜Ÿçš„ž®åŠŸèƒ½ï¼Œå…·ä½“å¯ä»¥å‚阅åQ?http://subversion.tigris.org/roadmap.html
˜q™é‡Œè§£é‡Šä¸€ä¸?æ•°æ®ä»“库 的概念:
一个数æ®ä»“库对应的å¯ä»¥æ˜¯ä¸€ä¸ªé¡¹ç›®ï¼Œä¹Ÿå¯ä»¥æ˜¯å¤šä¸ª™å¹ç›®ã€‚SVN是基于数æ®ä»“库进行管ç†çš„ã€?br />æŒ‰ç…§ç”¨æˆ·ä¹ æƒ¯åQŒå¯ä»¥åªåœ¨æ¯ä¸ªæ•°æ®ä»“库内仅放¾|®ä¸€ä¸ªé¡¹ç›®çš„内容ã€?/p>
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>
下é¢è¯´ä¸€ä¸‹å®‰è£…,分两¿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.ç”¨å‘½ä»¤è¡Œæ¥æµ‹è¯•å®‰è£…ç»“æžœæ˜¯å¦æ£¼‹®ï¼š
如果˜q”回˜q™æ ·çš„错误信æ¯ï¼šâ€svnadmin.exe - Unable To Locate DLLâ€ï¼Œé‚£å°±éœ€è¦å°è¯•一下æ¥éª¤çš„ä¸çš„一¿Uæˆ–å‡ ç§åQ?br />安装VC++ 6.0åQˆä¸»è¦æ˜¯å®‰è£…VCçš„è¿è¡Œåº“åQ?br />或者直接从别的机器上拷è´ä¸€ä¸ªâ€msvcp60.dllâ€æ–‡ä»¶åˆ°æœ¬æœºçš„â€?SystemRoot%\system32″下
4.使用以下命ä×o创å¾ä¸€ä¸ªæ•°æ®ä»“库,用æ¥å˜æ”¾™å¹ç›®çš„æºä»£ç 和其他文ä»Óž¼š
5.å…¶ä¸%SVN_REPO_PARENT%æ˜¯åŒ…å«æ‰€æœ‰æ•°æ®ä»“库的目录åQ?PROJECT_NAME%是所创å¾çš„æ•°æ®ä»“库对应的™å¹ç›®åã€?/p>
*************************
* �Stand-alone 模弘q行 *
*************************
6.从命令行å¯åЍSVN ServeråQ?/p>
注æ„里é¢çš„傿•?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>
注愘q™é‡Œå¯†ç æ˜¯æ˜Žæ–‡å˜æ”„¡š„åQŒæ‰€ä»¥ä¹Ÿæ˜¯è¿™¿Uæ–¹å¼çš„ä¸èƒö之处ã€?/p>
8.在â€?SVN_REPO_PARENT%\%PROJECT_NAME%\confâ€ç›®å½•下扑ֈ°˜q™ä¸ªâ€svnserve.confâ€æ–‡ä»Óž¼Œç”¨ä“Q何文本编辑器打开åQŒäؓ刚æ‰åˆ›å¾çš„那些用æˆäh·»åŠ è¯»å†™æƒé™ï¼š
里é¢çš„â€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>
具体æ¥éª¤å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>
完æˆä¹‹åŽçœ‹è“væ¥åº”该是˜q™æ ·åQ?/p>
å¦å¤–在这行下é¢å†æ·ÕdŠ ä¸¤è¡ŒåQˆè¯·æ³¨æ„把èµ\径ä¸çš„â€\â€æ›¿æ¢æˆâ€?â€ï¼‰åQ?/p>
ç‰¹åˆ«éœ€è¦æ³¨æ„的是:ç”׃ºŽæ¨¡å—ä¾èµ–关系åQŒè¿™ä¸‰è¡Œçš„出现顺åºåƒä¸‡ä¸èƒ½é¢ å€?/font>ã€?/p>
14.冿¥é…置一下â€httpd.confâ€çš„其他部分åQŒå‘Šè¯‰Apache2 SVN的数æ®ä»“库所在ã€?br />åQˆäØ“é¿å…ä¸å¿…è¦çš„éºÈƒ¦åQŒæ‰€æœ‰èµ\径ä¸çš„â€\â€éƒ½è¯äh›¿æ¢æˆâ€?â€ï¼‰
注æ„åQ?/p>
æ·ÕdŠ ä¸‹è¿°å†…å®¹åQ?/p>
˜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â€æ–‡ä»¶çš„内容
å…¶ä¸åQ?/p>
ä½ å¯ä»¥æ ¹æ®éœ€è¦æ¥è®‘Ö®šä¸åŒçš„æƒé™ï¼Œæ›´è¯¦¾l†çš„说明˜q˜éœ€è¦å‚考SVN文档ä¸çš„æƒé™è®„¡½®ç« 节ã€?/p>
17.â€?SVN_REPO_PARENT%/passwdâ€æ–‡ä»¶çš„内容
˜q™ä¸ªæ–‡äšg是通过â€?APACHE_HOME%\bin\htpasswd.exeâ€è‡ªåŠ¨ç”Ÿæˆçš„åQ?/p>
æ¤æ—¶ç”¨æ–‡æœ¬ç¼–辑器打开â€?SVN_REPO_PARENT%/passwdâ€ï¼Œå¯ä»¥çœ‹åˆ°é‡Œé¢å†…å®¹æ˜¯ç±»ä¼ÆD¿™æ ïLš„åQ?/p>
18.把SVN自带的XSLTæ–‡äšg拯‚´åˆ°ç½‘ç«™æ ¹ç›®å½•åQ?br />ç„¶åŽè®„¡½®åˆç†æƒé™åQˆwindowsòq›_°åˆ™ä¸å¿…考虑åQ?/p>
19. é‡å¯Apache2æœåŠ¡åQ?/p>
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‰ï¼š
或者(Apache2 moduleåQ‰ï¼š
å…¶ä¸å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Ÿï¼‰
注æ„åQ?br />“coâ€æ˜¯â€checkoutâ€çš„一个别å?br />那个点[.]代表当å‰ç›®å½•åQŒcheckout出æ¥çš„æ–‡ä»¶ä¼šè‡ªåŠ¨æ”‘Öˆ°˜q™ä¸ªç›®å½•下。也å¯ä»¥æ”¹äØ“æŸä¸ª¾l对路径ã€?/p>
23.对于å‘SVN Sererå¢žåŠ åQŒç§»åŠ¨ï¼Œåˆ é™¤åQŒæˆ–è€…ä¿®æ”¹åŽæäº¤æŸäº›æ–‡äšgåQŒå‚考ä‹É用以下命令:
对于上é¢çš„客æˆïL«¯æ“作åQŒå¦‚果安装了TortoiseSVNåQŒä¸€åˆ‡å°±å˜å¾—½Ž€å•多了ã€?br />ä¸è¿‡˜q™ä¸ªž®Þp¦æŠ“图æ¥è¯´æ˜Žäº†ã€‚ç‰æœ‰ç©ºçš„æ—¶å€™å†æ”¾ä¸Šæ¥ã€?/p>
使用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
  一般验è¯ç 属于数å—型的å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§ç®‹åˆ›é€ ï¼
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¾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Œè¿™é€‚åˆå¤§å¤šæ•îChçš„æ—¶é—´è¦æ±‚ã€?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Š¡