JavaSE实战——API(下) System、Runtime、Math、Date、DateFormat、Calendar、日期格式解析

来源:互联网 发布:淘宝卖兽药 编辑:程序博客网 时间:2024/04/30 03:24

    转载请声明出处:http://blog.csdn.net/zhongkelee/article/details/46825897

前言

    看过本系列前面两篇博文后,我认为读者目前至少能够具备查阅API来获取自己需要的类及方法的技能。最后我们再来说几个实际开发中经常会用到的类,用以巩固查阅API文档的能力。

System类

    java.lang.System:全是静态的属性和行为,不能被实例化。

    属性
    out:标准输出流,默认对应设备显示器。
    in:标准输入流,默认的设备键盘。

    行为

    currentTimeMillis(); 返回以毫秒为单位的当前时间。可以用来计算程序用时。

    getProperties(); 获取到的系统信息都存储到了Properties键值集合中了。

    getProperty(); 获取指定键指示的系统属性。这其中最有用的就是获取不同系统上的文件分隔符、路径分隔符、行分隔符,它们的键值依次是:file.separator、path.separator、line.separator。

    示例代码如下:

package ustc.lichunchun.otherapi;import java.util.HashSet;import java.util.Properties;import java.util.Set;public class SystemDemo {private static final String FILE_SEPARATOR = System.getProperty("file.separator");private static final String LINE_SEPARATOR = System.getProperty("line.separator");public static void main(String[] args) {/* * System:全是静态的属性和行为。 * 属性: * out:标准输出流,默认对应设备显示器。 * in:标准输入流,默认的设备键盘。 *  *///返回以毫秒为单位的当前时间。可以用来计算程序用时。long time = System.currentTimeMillis();System.out.println(time);//System  getProperties();获取到的系统信息都存储到了Properties键值集合中了。Properties prop = System.getProperties();//如何取出属性集。Set<String> keySet = prop.stringPropertyNames();for(String key : keySet){String value = prop.getProperty(key);System.out.println(key+" --> "+value);}//获取class文件运行在那哪个操作系统上。System.out.println(prop.getProperty("os.name"));//跨平台。文件分隔符、路径分隔符、行分隔符。System.out.println("windows: c:\\abc\\1.txt");System.out.println("linux: root/chunchun/2.txt");System.out.println("jre: c:"+FILE_SEPARATOR+"abc"+FILE_SEPARATOR+"1.txt");System.out.println("hello\r\nworld");System.out.println("hello"+LINE_SEPARATOR+"world");//给系统属性信息集添加具体的属性信息System.setProperty("myname","毕老师"); //临时设置方式:运行jvm时,可以通过jvm的参数进行系统属性的临时设置,可以在java命令的后面加入 –D<name>=<value>  //用法:java –Dmyname=小明 类名。//想要知道该系统是否是该软件所支持的系统中的一个。String name = System.getProperty("os.name");//获取指定属性的信息Set<String> hs = new HashSet<String>();hs.add("Windows XP");hs.add("Windows 7");if(hs.contains(name))System.out.println("可以支持");elseSystem.out.println("不支持");}}

    这其中,通过stringPropertyNames()获得到的系统属性如下:

java.runtime.name --> Java(TM) SE Runtime Environmentsun.boot.library.path --> E:\JDK1.8\binjava.vm.version --> 25.31-b07java.vm.vendor --> Oracle Corporationjava.vendor.url --> http://java.oracle.com/path.separator --> ;java.vm.name --> Java HotSpot(TM) Client VMfile.encoding.pkg --> sun.iouser.script --> user.country --> CNsun.java.launcher --> SUN_STANDARDsun.os.patch.level --> Service Pack 1java.vm.specification.name --> Java Virtual Machine Specificationuser.dir --> E:\JavaSE_code\day20ejava.runtime.version --> 1.8.0_31-b13java.awt.graphicsenv --> sun.awt.Win32GraphicsEnvironmentjava.endorsed.dirs --> E:\JDK1.8\lib\endorsedos.arch --> x86java.io.tmpdir --> C:\Users\chunchun\AppData\Local\Temp\line.separator --> java.vm.specification.vendor --> Oracle Corporationuser.variant --> os.name --> Windows 7sun.jnu.encoding --> GBKjava.library.path --> E:\JDK1.8\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;E:/JDK1.8/bin/client;E:/JDK1.8/bin;E:/JDK1.8/lib/i386;E:\JDK1.8\bin;C:\Program Files\NVIDIA Corporation\PhysX\Common;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;E:\eclipse;;.java.specification.name --> Java Platform API Specificationjava.class.version --> 52.0sun.management.compiler --> HotSpot Client Compileros.version --> 6.1user.home --> C:\Users\chunchunuser.timezone --> java.awt.printerjob --> sun.awt.windows.WPrinterJobfile.encoding --> GBKjava.specification.version --> 1.8user.name --> chunchunjava.class.path --> E:\JavaSE_code\day20e\binjava.vm.specification.version --> 1.8sun.arch.data.model --> 32java.home --> E:\JDK1.8sun.java.command --> ustc.lichunchun.system.SystemDemojava.specification.vendor --> Oracle Corporationuser.language --> zhawt.toolkit --> sun.awt.windows.WToolkitjava.vm.info --> mixed modejava.version --> 1.8.0_31java.ext.dirs --> E:\JDK1.8\lib\ext;C:\Windows\Sun\Java\lib\extsun.boot.class.path --> E:\JDK1.8\lib\resources.jar;E:\JDK1.8\lib\rt.jar;E:\JDK1.8\lib\sunrsasign.jar;E:\JDK1.8\lib\jsse.jar;E:\JDK1.8\lib\jce.jar;E:\JDK1.8\lib\charsets.jar;E:\JDK1.8\lib\jfr.jar;E:\JDK1.8\classesjava.vendor --> Oracle Corporationfile.separator --> \java.vendor.url.bug --> http://bugreport.sun.com/bugreport/sun.cpu.endian --> littlesun.io.unicode.encoding --> UnicodeLittlesun.desktop --> windowssun.cpu.isalist --> pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86
Runtime类

    java.lang.Runtime类的底层实现类似于单例设计模式。用户无法创建自己的Runtime实例,但是可以通过静态方法getRuntime()获取。它可以应用在图形化界面中,一点按钮,某个程序就启动并打开某个文件。

    代码示例如下:

package ustc.lichunchun.otherapi;public class RuntimeDemo {public static void main(String[] args) throws Exception {/* * 单例模式的对象Runtime */Runtime r = Runtime.getRuntime();Process p = r.exec("notepad.exe E:\\JavaSE_code\\day20e\\集合框架_4.txt");//运行指定程序Thread.sleep(4000);p.destroy();  //杀掉进程}}

Math类

    顾名思义,java.lang.Math类就是数学工具类,它里面也都是静态成员,包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。这里面最常用到的静态方法就是random()方法,它返回带正号的double 值,该值大于等于0.0 且小于1.0

    代码示例如下,其中用两种方法实现了扔色子的功能。

package ustc.lichunchun.otherapi;import java.util.Random;public class MathDemo {public static void main(String[] args) {/* * Math:数学类,都是静态成员。 */double d1 = Math.ceil(12.34);//大于参数的最小整数double d2 = Math.floor(12.34);//小于参数的最大整数double d3 = Math.round(12.34);//四舍五入System.out.println("d1 = " + d1);System.out.println("d2 = " + d2);System.out.println("d3 = " + d3);System.out.println(Math.pow(10, 3));//次幂//扔色子一。for(int i = 0; i < 10; i++){int d = (int)Math.ceil(Math.random()*6);System.out.println("Math:"+d);}//扔色子二。Random r = new Random();//java.util.Randomfor(int i = 0; i < 10; i++){//double d = r.nextDouble();int d = r.nextInt(6)+1;System.out.println("Random:"+d);}}}
Date类

    注意,我这里讲解的是java.util.Date类,而不是java.sql.Date类。我们来演示一下Date对象。

    需求1: 将日期对象转换成日期格式的字符串-->DateFormat类中的format方法。日期格式器

package ustc.lichunchun.otherapi;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;public class DateDemo {public static void main(String[] args) {/* * 演示Date对象。 * 将日期对象转换成日期格式的字符串-->DateFormat类中的format方法。 * 日期的格式化。 */Date date = new Date();System.out.println(date);//Thu Jul 09 16:09:09 CST 2015/* * 想要把日期按照我们的习惯格式化一下。 * 找到了DateFormat。 *///通过DateFormat类中的静态工厂方法获取实例。DateFormat dateFormat = DateFormat.getDateInstance();//通过DateFormat的format方法对日期对象进行格式化。将日期对象转成日期格式的字符串。String str_date1 = dateFormat.format(date);System.out.println(str_date1);//2015-7-9//加入风格1。dateFormat = DateFormat.getDateInstance(DateFormat.SHORT);String str_date2 = dateFormat.format(date);System.out.println(str_date2);//FULL: 2015年7月9日 星期四//LONG: 2015年7月9日//MEDIUM: 2015-7-9//SHORT: 15-7-9//加入风格2。dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);String str_date3 = dateFormat.format(date);System.out.println(str_date3);//2015年7月9日 星期四 下午04时19分43秒 CST//2015年7月9日 下午04时33分30秒//2015-7-9 16:22:10//15-7-9 下午4:33//可不可以转成自定义风格。xxxx/xx/xx,只能自定义格式化风格的对象。只有子类可以做到。dateFormat = new SimpleDateFormat("yyyy/MM/dd kk:mm:ss");String str_date4 = dateFormat.format(date);System.out.println(str_date4);//2015/07/09 16:27:52}}
     这其中,通过SimpleDateFormat类自定义的日期格式,API提供了如下模式字母:


     需求2:将日期格式的字符串转成日期对象-->使用的就是DateFormat方法中的Date parse(String source)。日期的解析

package ustc.lichunchun.otherapi;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class DateDemo2 {public static void main(String[] args) throws ParseException {/* * 日期格式的字符串: "2013-07-17" * 将日期格式的字符串转成日期对象-->使用的就是DateFormat方法中的 Date parse(String source)。 * 日期的解析。 */String str_date1 = "2013-07-17";//字符串对象DateFormat dateFormat1 = DateFormat.getDateInstance();//日期格式器Date date1 = dateFormat1.parse(str_date1);//解析System.out.println(date1);//Wed Jul 17 00:00:00 CST 2013//解析自定义格式日期字符串,转成日期对象。String str_date2 = "2013/07/17 16:50:25";DateFormat dateFormat2 = new SimpleDateFormat("yyyy/MM/dd kk:mm:ss");//自定义日期格式器Date date2 = dateFormat2.parse(str_date2);//自定义解析System.out.println(date2);//Wed Jul 17 16:50:25 CST 2013//再转换一种日期格式输出。dateFormat2 = new SimpleDateFormat("yyyy/MM/dd, kk~mm~ss");//自定义日期格式器String str_date3 = dateFormat2.format(date2);//将日期自定义格式化为字符串System.out.println(str_date3);//2013/07/17, 16~50~25//再试一个。String str_date4 = "2012年3月24日";dateFormat2 = DateFormat.getDateInstance(DateFormat.LONG);date2 = dateFormat2.parse(str_date4);System.out.println(date2);//Sat Mar 24 00:00:00 CST 2012}}
     需求3日期对象和毫秒值的转换

    1.日期对象转成毫秒值。Date类中的getTime方法。
    2.如何将获取到的毫秒值转成具体的日期呢?Date类中的setTime方法。也可以通过构造函数。 

    好处:毫秒值可以相加减。

package ustc.lichunchun.otherapi;import java.text.DateFormat;import java.util.Date;public class DateDemo3 {public static void main(String[] args) {/* * 日期对象和毫秒之的转换。 * 1.日期对象转成毫秒值。Date类中的getTime方法。 * 2,如何将获取到的毫秒值转成具体的日期呢?Date类中的setTime方法。也可以通过构造函数。  * 好处:毫秒值可以相加减。 */long time1 = System.currentTimeMillis();System.out.println(time1);//1436433804133//毫秒值-->日期对象:构造函数 或者 setTime()方法。long time2 = 1336434265767l;//切勿忘掉结尾的l。Date date = new Date(time2);DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);String str_date = dateFormat.format(date);System.out.println(str_date);//2012年5月8日//日期对象-->毫秒值:Date对象的getTime()方法。long time3 = date.getTime();System.out.println(time3);//1336434265767}}
    练习:"2012-3-17" 到 "2015-4-6" 中间有多少天?

    思路:字符串-->日期对象-->毫秒值-->相减-->换算成天数。

package ustc.lichunchun.otherapi;import java.text.DateFormat;import java.text.ParseException;import java.util.Date;public class DateTest {private static final long MILLIS_ONE_DAY = 24 * 60 * 60 * 1000;public static void main(String[] args) throws ParseException {/* * 练习: "2012-3-17" 到 "2015-4-6" 中间有多少天? * 思路: * 两个日期相减即可。咋减呢? * 必须要有两个可以进行减法运算的数。 * 能减的可以是毫秒值。如何获取毫秒值?通过Date对象。 * 如何获取Date对象?可以将字符串转成Date对象。 *  * 字符串-->日期对象-->毫秒值 *  * 1.将日期格式的字符串转成Date对象。 * 2.将Date对象转成毫秒值。 * 3.相减,再变成天数。 */String str_date1 = "2012年3月17日";String str_date2 = "2015-4-6";int days = test(str_date1, str_date2);System.out.println(days);}public static int test(String str1, String str2) throws ParseException {//定义日期格式对象。DateFormat dateFormat1 = DateFormat.getDateInstance(DateFormat.LONG);DateFormat dateFormat2 = DateFormat.getDateInstance();//默认风格//dateFormat2 = new SimpleDateFormat("yyyy/MM/dd");//自定义风格//将日期字符串解析成日期对象。Date date1 = dateFormat1.parse(str1);Date date2 = dateFormat2.parse(str2);//通过日期对象获取毫秒值。long time1 = date1.getTime();long time2 = date2.getTime();long time = Math.abs(time1 - time2);//绝对值return (int) (time / MILLIS_ONE_DAY);}}
    Date总结

    Date --> String: myString = DateFormat.getDateInstance().format(myDate);

    String --> Date: myDate = DateFormat.getDateInstance().parse(myString);

    long --> Date: Date(long date) / void setTime(long time)已过时

    Date --> long: long getTime()

    自定义格式:SimpleDateFormat

Calendar类

    java.util.Calendar类中有很多字段,底层其实都是Map键值对形式的。这里面有两点我们需要注意:

    1.月份计算是0-11,代表的是1-12月

    2.月份是连续的,例如当下月份是9,当使用add(Calendar.MONTH, 4)的时候,循环成了1月。

    日历Calendar演示,其中包含日历对象的时间设置set 和偏移add :

package ustc.lichunchun.otherapi;import java.util.Calendar;import ustc.lichunchun.exception.NotWeekException;public class CalendarDemo {public static void main(String[] args) {/* * 演示日历。 * Calendar-->有很多字段,底层是Map键值对形式的。 */Calendar c = Calendar.getInstance();//System.out.println(c);//获取其中的所需日期。showDate(c);//2015年7月11日星期六//对日历对象其中的日期进行定义。//c.set(Calendar.YEAR, 2022);c.set(2018, 4, 1);//2018年5月1日星期二,月份是0-11,并且是连续的。showDate(c);//日期的偏移。c.add(Calendar.YEAR, 7);showDate(c);//2025年5月1日星期四c.add(Calendar.MONTH, 8);//-->证明时间是连续的。showDate(c);//2026年1月1日星期四}public static void showDate(Calendar c) {int year = c.get(Calendar.YEAR);int month = c.get(Calendar.MONTH) + 1;int day = c.get(Calendar.DAY_OF_MONTH);String week = getWeek(c.get(Calendar.DAY_OF_WEEK));System.out.println(year+"年"+month+"月"+day+"日"+week);}private static String getWeek(int i) {if(i>7 || 1<=0)throw new NotWeekException("没有对应的星期1-7");String[] weeks = {"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};return weeks[i];}}
     其中,直接打印日历对象,输出的是:
System.out.println(Calendar.getInstance());日历对象打印出来的格式:java.util.GregorianCalendar[time=1436442787518,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2015,MONTH=6,WEEK_OF_YEAR=28,WEEK_OF_MONTH=2,DAY_OF_MONTH=9,DAY_OF_YEAR=190,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=53,SECOND=7,MILLISECOND=518,ZONE_OFFSET=28800000,DST_OFFSET=0]

     使用到的异常实现(直接ctr+alt+s 自动生成代码,然后ctrl+1添加一个静态常量):

package ustc.lichunchun.exception;public class NotWeekException extends RuntimeException {private static final long serialVersionUID = 1L;public NotWeekException() {super();}public NotWeekException(String message, Throwable cause,boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}public NotWeekException(String message, Throwable cause) {super(message, cause);}public NotWeekException(String message) {super(message);}public NotWeekException(Throwable cause) {super(cause);}}
    练习1任意给定一年,确定2月有多少天?

    思路:三月一日的前一天就是。

package ustc.lichunchun.otherapi;import java.util.Calendar;public class CalendarTest1 {public static void main(String[] args) {/* * 任意给定一年,确定2月有多少天? * 思路:三月一日的前一天就是。 */int year = 2014;int daysOfFeb = test(year);System.out.println(daysOfFeb);}public static int test(int year) {Calendar c = Calendar.getInstance();c.set(year, 2, 1);//注意,月份是0-11c.add(Calendar.DAY_OF_MONTH, -1);//向前偏移一天return c.get(Calendar.DAY_OF_MONTH);}}
    练习2获取昨天的此时此刻

    思路:同理,我们只需使用时间偏移add()方法,让Calendar.DAY_OF_YEAR偏移-1即可。

package ustc.lichunchun.otherapi;import java.text.DateFormat;import java.util.Calendar;import java.util.Date;public class CalendarTest2 {public static void main(String[] args) {/* * 获取昨天的此时此刻。 */yesterday();}public static void yesterday() {Calendar c = Calendar.getInstance();c.add(Calendar.DAY_OF_YEAR, -1);Date date = c.getTime();System.out.println(DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG).format(date));//2015年7月10日 下午09时54分38秒(程序运行时,时间为7月11日)}}


    好了,本系列最后一部分关于API的讲解,到此告一段落。接下来,我们开始着手研究 IO 流。

  有任何问题,欢迎和我联系:lichunchun4.0@gmail.com

    转载请声明出处:http://blog.csdn.net/zhongkelee/article/details/46825897

    源码下载

0 0
原创粉丝点击