关闭

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

标签: SystemRuntimeMathDateCalendar
655人阅读 评论(0) 收藏 举报
分类:

    转载请声明出处: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("可以支持");
		else
			System.out.println("不支持");
	}
}

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

java.runtime.name --> Java(TM) SE Runtime Environment
sun.boot.library.path --> E:\JDK1.8\bin
java.vm.version --> 25.31-b07
java.vm.vendor --> Oracle Corporation
java.vendor.url --> http://java.oracle.com/
path.separator --> ;
java.vm.name --> Java HotSpot(TM) Client VM
file.encoding.pkg --> sun.io
user.script --> 
user.country --> CN
sun.java.launcher --> SUN_STANDARD
sun.os.patch.level --> Service Pack 1
java.vm.specification.name --> Java Virtual Machine Specification
user.dir --> E:\JavaSE_code\day20e
java.runtime.version --> 1.8.0_31-b13
java.awt.graphicsenv --> sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs --> E:\JDK1.8\lib\endorsed
os.arch --> x86
java.io.tmpdir --> C:\Users\chunchun\AppData\Local\Temp\
line.separator --> 

java.vm.specification.vendor --> Oracle Corporation
user.variant --> 
os.name --> Windows 7
sun.jnu.encoding --> GBK
java.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 Specification
java.class.version --> 52.0
sun.management.compiler --> HotSpot Client Compiler
os.version --> 6.1
user.home --> C:\Users\chunchun
user.timezone --> 
java.awt.printerjob --> sun.awt.windows.WPrinterJob
file.encoding --> GBK
java.specification.version --> 1.8
user.name --> chunchun
java.class.path --> E:\JavaSE_code\day20e\bin
java.vm.specification.version --> 1.8
sun.arch.data.model --> 32
java.home --> E:\JDK1.8
sun.java.command --> ustc.lichunchun.system.SystemDemo
java.specification.vendor --> Oracle Corporation
user.language --> zh
awt.toolkit --> sun.awt.windows.WToolkit
java.vm.info --> mixed mode
java.version --> 1.8.0_31
java.ext.dirs --> E:\JDK1.8\lib\ext;C:\Windows\Sun\Java\lib\ext
sun.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\classes
java.vendor --> Oracle Corporation
file.separator --> \
java.vendor.url.bug --> http://bugreport.sun.com/bugreport/
sun.cpu.endian --> little
sun.io.unicode.encoding --> UnicodeLittle
sun.desktop --> windows
sun.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.Random
		for(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-11
		c.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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:69045次
    • 积分:1065
    • 等级:
    • 排名:千里之外
    • 原创:50篇
    • 转载:0篇
    • 译文:0篇
    • 评论:23条
    小便签
    2017 小伙子,加油干!
    欢迎联系我
    最新评论