﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;b&gt;&lt;font size='4'&gt;无名的博客&lt;/font&gt;&lt;/b&gt;-随笔分类-J2SE</title><link>http://www.blogjava.net/cnyanhai/category/3902.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 08:20:41 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 08:20:41 GMT</pubDate><ttl>60</ttl><item><title>Java中一些关于日期、日期格式、日期的解析和日期的计算</title><link>http://www.blogjava.net/cnyanhai/archive/2005/10/28/17142.html</link><dc:creator>十三郎</dc:creator><author>十三郎</author><pubDate>Fri, 28 Oct 2005 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/cnyanhai/archive/2005/10/28/17142.html</guid><wfw:comment>http://www.blogjava.net/cnyanhai/comments/17142.html</wfw:comment><comments>http://www.blogjava.net/cnyanhai/archive/2005/10/28/17142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cnyanhai/comments/commentRss/17142.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cnyanhai/services/trackbacks/17142.html</trackback:ping><description><![CDATA[<P><FONT face=Verdana color=#000000 size=2>&nbsp;&nbsp;&nbsp; &nbsp;Java 语言的Calendar(日历),Date(日期), 和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分. 日期是商业逻辑计算一个关键的部分. 所有的开发者都应该能够计算未来的日期, 定制日期的显示格式, 并将文本数据解析成日期对象. </FONT></P>
<P><FONT face=Verdana color=#000000 size=2>&nbsp;&nbsp;&nbsp; Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数. </FONT></P>
<P><FONT face=Verdana color=#000000 size=2>一、创建一个日期对象<BR></FONT><FONT face=Verdana color=#000000 size=2>&nbsp;&nbsp;&nbsp; 使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子. 这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间. <BR><BR></FONT><FONT face=Verdana color=#ff0000 size=2>Date date = new Date(); <BR></FONT><FONT face=Verdana color=#000000 size=2><FONT color=#ff0000>System.out.println(date.getTime());</FONT> <BR><BR></FONT><FONT face=Verdana color=#000000 size=2>&nbsp;&nbsp;&nbsp; 上面的例子在系统输出设备上显示的结果是 1001803809710. 在这个例子中,值得注意的是我们使用了Date 构造函数创建一个日期对象, 这个构造函数没有接受任何参数. 而这个构造函数在内部使用了System.currentTimeMillis() 方法来从系统获取日期. <BR></FONT><FONT face=Verdana color=#000000 size=2>二、日期数据的定制格式 <BR></FONT><FONT face=Verdana color=#000000 size=2>&nbsp;&nbsp;&nbsp; 定制日期数据的格式, 比方星期六-9月-29日-2001年. 下面的例子展示了如何完成这个工作: <BR></FONT><FONT face=Verdana color=#ff0000 size=2><BR>SimpleDateFormat bartDateFormat = new SimpleDateFormat("EEEE-MMMM-dd-yyyy"); <BR></FONT><FONT face=Verdana color=#ff0000 size=2>Date date = new Date(); <BR></FONT><FONT face=Verdana color=#000000 size=2><FONT color=#ff0000>System.out.println(bartDateFormat.format(date));</FONT> </FONT></P>
<P><FONT face=Verdana color=#000000 size=2>&nbsp;&nbsp;&nbsp; 只要通过向SimpleDateFormat 的构造函数传递格式字符串"EEE-MMMM-dd-yyyy", 我们就能够指明自己想要的格式. 你应该可以看见, 格式字符串中的ASCII 字符告诉格式化函数下面显示日期数据的哪一个部分. EEEE是星期, MMMM是月, dd是日, yyyy是年. 字符的个数决定了日期是如何格式化的.传递"EE-MM-dd-yy"会显示 Sat-09-29-01. <BR>&nbsp;&nbsp;&nbsp; 下面是一些格式：<BR>
<TABLE cellSpacing=3 cellPadding=0 summary="Examples of date and time patterns interpreted in the U.S. locale" border=0>
<TBODY>
<TR bgColor=#ccccff>
<TH align=left>Date and Time Pattern 
<TH align=left>Result 
<TR>
<TD><CODE>"yyyy.MM.dd G 'at' HH:mm:ss z"</CODE> 
<TD><CODE>2001.07.04 AD at 12:08:56 PDT</CODE> 
<TR bgColor=#eeeeff>
<TD><CODE>"EEE, MMM d, ''yy"</CODE> 
<TD><CODE>Wed, Jul 4, '01</CODE> 
<TR>
<TD><CODE>"h:mm a"</CODE> 
<TD><CODE>12:08 PM</CODE> 
<TR bgColor=#eeeeff>
<TD><CODE>"hh 'o''clock' a, zzzz"</CODE> 
<TD><CODE>12 o'clock PM, Pacific Daylight Time</CODE> 
<TR>
<TD><CODE>"K:mm a, z"</CODE> 
<TD><CODE>0:08 PM, PDT</CODE> 
<TR bgColor=#eeeeff>
<TD><CODE>"yyyyy.MMMMM.dd GGG hh:mm aaa"</CODE> 
<TD><CODE>02001.July.04 AD 12:08 PM</CODE> 
<TR>
<TD><CODE>"EEE, d MMM yyyy HH:mm:ss Z"</CODE> 
<TD><CODE>Wed, 4 Jul 2001 12:08:56 -0700</CODE> 
<TR bgColor=#eeeeff>
<TD><CODE>"yyMMddHHmmssZ"</CODE> 
<TD><CODE>010704120856-0700</CODE> </TD></TR></TBODY></TABLE><BR><BR></FONT><FONT face=Verdana color=#000000 size=2>三、将文本数据解析成日期对象<BR></FONT><FONT face=Verdana color=#000000 size=2>&nbsp;&nbsp;&nbsp; 假设我们有一个文本字符串包含了一个格式化了的日期对象, 而我们希望解析这个字符串并从文本日期数据创建一个日期对象. 我们将再次以格式化字符串"MM-dd-yyyy" 调用SimpleDateFormat类, 但是这一次, 我们使用格式化解析而不是生成一个文本日期数据. 我们的例子, 显示在下面, 将解析文本字符串"9-29-2001"并创建一个值为001736000000 的日期对象. </FONT></P>
<P><FONT face=Verdana color=#ff0000 size=2>SimpleDateFormat bartDateFormat = new SimpleDateFormat("MM-dd-yyyy"); <BR></FONT><FONT face=Verdana color=#ff0000 size=2>String dateStringToParse = "9-29-2001"; <BR></FONT><FONT face=Verdana color=#ff0000 size=2>try { <BR>Date date = bartDateFormat.parse(dateStringToParse); <BR></FONT><FONT face=Verdana color=#ff0000 size=2>System.out.println(date.getTime()); <BR>} catch (Exception ex) { <BR>System.out.println(ex.getMessage()); <BR>} <BR><BR></FONT><FONT face=Verdana color=#000000 size=2>四、使用标准的日期格式化过程 </FONT></P>
<P><FONT face=Verdana color=#000000 size=2>既然我们已经可以生成和解析定制的日期格式了, 让我们来看一看如何使用内建的格式化过程. 方法 DateFormat.getDateTimeInstance() 让我们得以用几种不同的方法获得标准的日期格式化过程. 在下面的例子中, 我们获取了四个内建的日期格式化过程. 它们包括一个短的, 中等的, 长的, 和完整的日期格式. </FONT></P>
<P><FONT face=Verdana color=#ff0000 size=2>Date date = new Date(); </FONT></P>
<P><FONT face=Verdana color=#ff0000 size=2>DateFormat shortDateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);<BR></FONT><FONT color=#ff0000><FONT face=Verdana size=2>DateFormat mediumDateFormat =DateFormat.getDateTimeInstance( DateFormat.MEDIUM, teFormat.MEDIUM);<BR></FONT><FONT face=Verdana size=2>DateFormat longDateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG); </FONT><FONT face=Verdana size=2>DateFormat fullDateFormat = DateFormat.getDateTimeInstance( DateFormat.FULL, DateFormat.FULL); </FONT></FONT></P>
<P><FONT face=Verdana color=#000000 size=2><FONT color=#ff0000>System.out.println(shortDateFormat.format(date)); <BR>System.out.println(mediumDateFormat.format(date)); <BR>System.out.println(longDateFormat.format(date)); <BR>System.out.println(fullDateFormat.format(date)); <BR></FONT></FONT><FONT face=Verdana color=#000000 size=2><BR>注意我们在对 getDateTimeInstance的每次调用中都传递了两个值. 第一个参数是日期风格, 而第二个参数是时间风格. 它们都是基本数据类型int(整型). 考虑到可读性, 我们使用了DateFormat 类提供的常量: SHORT, MEDIUM, LONG, 和 FULL. <BR></FONT><FONT face=Verdana color=#000000 size=2>运行例子程序的时候, 它将向标准输出设备输出下面的内容: <BR>9/29/01 8:44 PM <BR>Sep 29, 2001 8:44:45 PM <BR>September 29, 2001 8:44:45 PM EDT <BR>Saturday, September 29, 2001 8:44:45 PM EDT</FONT></P>
<P><FONT face=Verdana color=#000000 size=2>五、Calendar 类 </FONT></P>
<P><FONT face=Verdana color=#000000 size=2>假设你想要设置, 获取, 和操纵一个日期对象的各个部分, 比方一个月的一天或者是一个星期的一天. 为了演示这个过程, 我们将使用具体的子类 java.util.GregorianCalendar. 考虑下面的例子, 它计算得到下面的第十个星期五是13号. </FONT></P>
<P><FONT face=Verdana color=#000000 size=2><BR><FONT color=#ff0000>DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL); <BR><BR></FONT></FONT><FONT face=Verdana color=#ff0000 size=2>GregorianCalendar cal = new GregorianCalendar(); <BR></FONT><FONT face=Verdana size=2><BR><FONT color=#ff0000>cal.setTime(new Date()); <BR></FONT></FONT><FONT face=Verdana color=#ff0000 size=2>System.out.println("System Date: " + dateFormat.format(cal.getTime())); </FONT></P>
<P><FONT face=Verdana color=#ff0000 size=2>// Set the day of week to FRIDAY <BR>cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY); <BR>System.out.println("After Setting Day of Week to Friday: " + <BR>dateFormat.format(cal.getTime())); </FONT></P>
<P><FONT face=Verdana color=#ff0000 size=2>int friday13Counter = 0; </FONT></P>
<P><FONT face=Verdana color=#ff0000 size=2>while (friday13Counter &lt;= 10) <BR>{ </FONT></P>
<P><FONT face=Verdana color=#ff0000 size=2>// Go to the next Friday by adding 7 days. <BR>cal.add(GregorianCalendar.DAY_OF_MONTH, 7); </FONT></P>
<P><FONT face=Verdana color=#ff0000 size=2>// If the day of month is 13 we have <BR>// another Friday the 13th. <BR>if (cal.get(GregorianCalendar.DAY_OF_MONTH) == 13) <BR>{ <BR>friday13Counter++; <BR>System.out.println(dateFormat.format(cal.getTime())); <BR>} <BR>} </FONT></P>
<P><FONT face=Verdana color=#000000 size=2>在这个例子中作了有趣的函数调用: <BR>cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY); <BR></FONT><FONT face=Verdana color=#000000 size=2>和 <BR>cal.add(GregorianCalendar.DAY_OF_MONTH, 7); </FONT></P>
<P><FONT face=Verdana color=#000000 size=2>set 方法能够让我们通过简单的设置星期中的哪一天这个域来将我们的时间调整为星期五. 注意到这里我们使用了常量 DAY_OF_WEEK 和 FRIDAY来增强代码的可读性. add 方法让我们能够在日期上加上数值. 润年的所有复杂的计算都由这个方法自动处理. </FONT></P>
<P><FONT color=#000000><FONT face=Verdana size=2>我们这个例子的输出结果是: <BR>System Date: Saturday, September 29, 2001 <BR>当我们将它设置成星期五以后就成了: Friday, September 28, 2001 <BR>Friday, September 13, 2002 <BR>Friday, December 13, 2002 <BR>Friday, June 13, 2003 <BR>Friday, February 13, 2004 <BR>Friday, August 13, 2004 <BR>Friday, May 13, 2005 <BR>Friday, January 13, 2006 <BR>Friday, October 13, 2006 <BR>Friday, April 13, 2007 <BR>Friday, July 13, 2007 <BR>Friday, June 13, 2008 <BR><BR>GregorianCalendar类提供处理日期的方法。一个有用的方法是<FONT color=#ff0000>add().</FONT>使用add()方法，你能够增加象年，月数，天数到日期对象中。要使用add()方法，你必须提供要增加的字段，要增加的数量。一些有用的字段是DATE, MONTH, YEAR, 和 WEEK_OF_YEAR。下面的程序使用add()方法计算未来80天的一个日期。在Jules的&lt;环球80天&gt;是一个重要的数字，使用这个程序可以计算Phileas Fogg从出发的那一天1872年10月2日后80天的日期：<BR><BR></FONT><FONT face=Verdana color=#ff0000 size=2>GregorianCalendar worldTour = new GregorianCalendar(1872, Calendar.OCTOBER, 2);<BR>worldTour.add(GregorianCalendar.DATE, 80);<BR>Date d = worldTour.getTime();<BR>DateFormat df = DateFormat.getDateInstance();<BR>String s = df.format(d);<BR>System.out.println("80 day trip will end " + s);<BR><BR></P>
<P align=justify><FONT color=#000000>五、实现日期以天数的加减：<BR>/* 将当前日期加减n天数。 <BR>* 如传入字符型"-5" 意为将当前日期减去5天的日期<BR>* 如传入字符型"5" 意为将当前日期加上5天后的日期<BR>* 返回字串 例(1999-02-03)<BR>*/</FONT><BR>public String dateAdd(String to)<BR>{<BR>//日期处理模块 (将日期加上某些天或减去天数)返回字符串<BR>int strTo;<BR>try {<BR>&nbsp;&nbsp;&nbsp;strTo = Integer.parseInt(to);}<BR>catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;System.out.println("日期标识转换出错! : \n:::" + to + "不能转为数字型");<BR>&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;strTo = 0;<BR>}<BR>Calendar strDate = Calendar.getInstance(); //java.util包,设置当前时间<BR>strDate.add(strDate.DATE, strTo); //日期减 如果不够减会将月变动 //生成 (年-月-日)<BR>String meStrDate = strDate.get(strDate.YEAR) + "-" +String.valueOf(strDate.get(strDate.MONTH)+1) + "-" + strDate.get(strDate.DATE);<BR>return meStrDate;<BR>}</P></FONT></FONT><img src ="http://www.blogjava.net/cnyanhai/aggbug/17142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cnyanhai/" target="_blank">十三郎</a> 2005-10-28 11:00 <a href="http://www.blogjava.net/cnyanhai/archive/2005/10/28/17142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在JSP中执行dos命令 </title><link>http://www.blogjava.net/cnyanhai/archive/2005/10/18/15782.html</link><dc:creator>十三郎</dc:creator><author>十三郎</author><pubDate>Tue, 18 Oct 2005 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/cnyanhai/archive/2005/10/18/15782.html</guid><wfw:comment>http://www.blogjava.net/cnyanhai/comments/15782.html</wfw:comment><comments>http://www.blogjava.net/cnyanhai/archive/2005/10/18/15782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cnyanhai/comments/commentRss/15782.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cnyanhai/services/trackbacks/15782.html</trackback:ping><description><![CDATA[<P><FONT face=Verdana color=#000000 size=2>&nbsp;&nbsp;&nbsp;&nbsp; 在JSP中我们经常要调用服务器端的一些dos命令，已达到一些特殊的效果，但同时调用服务器端的dos命令也存在着一些安全隐患，因此需要慎重使用。</FONT></P>
<P><FONT face=Verdana color=#000000 size=2>&nbsp;&nbsp;&nbsp;&nbsp; 以下以一个例子来说明用jsp执行dos的过程，比如在服务器端每天都会自动生成一个目录（目录名称为当天的日期），再此目录下会生成一些当天的新闻文件，管理员会把这些文件几个月作一次备份，备份完后在把这些文件删除。</FONT></P>
<P><FONT face=Verdana color=#000000 size=2>&nbsp;&nbsp;&nbsp;&nbsp; 如果在服务器上，我们可以在dos下直接执行c:\j2sdk\jar cf d:\bak\200502.jar d:\news\20050101&nbsp;命令， 然后再把20050101目录删除即可。</FONT></P>
<P><FONT face=Verdana color=#000000 size=2>&nbsp;&nbsp;&nbsp;&nbsp; 在JSP中我们应当这么来写</FONT></P>
<P><FONT face=Verdana color=#000000 size=2>&lt;%<BR>//执行dos命令<BR>String commandstr = "c:/j2sdk/jar cf d:/bak/200502.jar d:/news/20050101";<BR>Process p ;<BR>try {<BR>&nbsp;&nbsp;&nbsp;p = Runtime.getRuntime().exec(commandstr);<BR>//等待刚刚执行的命令的结束&nbsp;&nbsp; <BR>while (true){&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(p.waitFor() == 0)&nbsp;&nbsp;&nbsp;break;<BR>&nbsp; &nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;out.println(e.toString());<BR>&nbsp;&nbsp;&nbsp;}</FONT></P>
<P><FONT face=Verdana color=#000000 size=2>//删除已经打包的文件及其目录<BR>File f = new File("d:/news/20020101");<BR>String[] allFiles = f.list();<BR>for (int i = 0; i &lt; allFiles.length; i++) {<BR>&nbsp;&nbsp; File delF = new File("d:/news/20050101/"+allFiles[i]);<BR>&nbsp;&nbsp; delF.delete();<BR>}<BR>File delD = new File("d:/news/20050101");<BR>delD.delete();<BR>%&gt;</FONT></P>
<P><FONT face=Verdana color=#000000 size=2>&nbsp;&nbsp;&nbsp;&nbsp; 在jsp中以下代码必须执行，如果没有该代码，则由于删除文件的速度快于打包的速度，因此当压缩包还没有打包完成，一些文件已经被删除，加入下面的代码，会在此一直做循环，一直p.waitFor()（这个方法的说明是：等待子进程的结束，如果已经结束，一般返回0）返回0为止才会接着执行后面的代码<BR>while (true){&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(p.waitFor() == 0)&nbsp;&nbsp;&nbsp;break;<BR>&nbsp; &nbsp;}&nbsp;</FONT></P><img src ="http://www.blogjava.net/cnyanhai/aggbug/15782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cnyanhai/" target="_blank">十三郎</a> 2005-10-18 10:27 <a href="http://www.blogjava.net/cnyanhai/archive/2005/10/18/15782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>