Java常用API(Date、DateFormat、 Calendar、System、StringBuilder、Math、基本数据类型包装类)
1.java.util.Date
Date类:表示一个特定的瞬间,精确到毫秒(很多方法都被Canlendar类替代了)
构造方法:
Date()
生成一个代表当前系统时间的Date对象
Date(long date)
根据指定的long类型的参数生成一个Date对象。该构造器参数表示创建的Date对象与时间原点(epic:1970年1月1日)到现在的时间差,参数单位为“毫秒”
static void method(){
//获取系统当前时间
Date date = new Date();
System.out.println(date);
//Java的时间原点:1970年1月1号 0时0分0秒(GMT:0经度线)
//获取从时间原点到1000ms的时间
Date date1 = new Date(1000L);
System.out.println(date1);
}
常用成员方法:
public long getTime()
获取时间原点到现在的毫秒值 (通过日期获得毫秒值)
public void setTime(long time)
根据指定的毫秒数,设置时间
eg:long time = date.getTime();
date.setTime(2000); //时间原点后两秒 System.out.println(date);
把一个毫秒值转换为日期:用构造方法2 Date(long date)
2.DateFormat类:是日期/时间格式化子类的抽象类,不能创建对象。
日期/时间格式化子类(如SimpleDateFormat)允许进行:
格式化:Date类型的时间->字符串类型的时间
解析:把字符串类型的时间->Date类型的:1970年1月1日00:00 00-》>Date
软件产品是给普通用户使用的,由于Date生成的时间(如:Thu Jan 01 08:00:02 CST 1970)受到用户知识水平差异,大部分用户难以阅读,而人们输入的日期常规写法(如:2018-09-09;2018/09/09等)计算机又不认识,所以Java提供了 java.text.SimpleDateFormat这个类解决这一问题,顾名思义,SimpleDateFormat即为简单的时间格式化。
SimpleDateFormat类
构造方法:
SimpleDateFormat()
SimpleDateFormat(String pattern)
pattern:日期和时间的格式
成员方法:
从Date->String
public final String format(Date date)
将系统时间格式化为字符串类型
Date date = new Date();
System.out.println(date);
//格式化 我们看的懂得格式 -> xx 年 X月X日 X时X分X秒
// -> xx -X-X- X:X:X
// -> xx/X/X X时X分X秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日,HH时mm分ss秒");
String format = sdf.format(date);
System.out.println(format);
从String ->Date
public Date parse(String source)
:将字符串类型解析为Date日期类型(转换时,该String要符合指定规则,否则不能 转换)
public static void main(String[] args) throws ParseException {
//给定一个String类型的时间
String time = "2019-09-10";
//参数要与给定的时间格式相同,否则会抛出ParseException
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//抛出异常
Date parse = sdf.parse(time);
System.out.println(parse);
}
一般在公司,很多常用的功能都封装成了一个工具类,会调用就行。
※ DateFormat作用:即可以将一个Date对象转换为一个符合指定格式的字符串,也可以将一个符合指定格式的字符串转换为一个Date对象
指定格式---->即SimpleDateFormat(String pattern)构造方法的形参;
public abstract class DateFormat extends Format
/*DateFormat类是一个抽象类,其本身内部提供了可以直接为其实例化的操作。
得到日期的DateFormat对象:
public static final DateFormat getDateInstance()
得到日期时间的DateFormat对象:
public static final DateFormat getDateTimeInstance()
直接使用DateFormat类完成Date类的转换功能:*/
public final String format(Date date)
import java.text.DateFormat ;
import java.util.Date ;
public class Test{
public static void main(String args[]){
DateFormat df1 = null ; // 声明一个DateFormat
DateFormat df2 = null ; // 声明一个DateFormat
df1 = DateFormat.getDateInstance() ; // 得到日期的DateFormat对象
df2 = DateFormat.getDateTimeInstance() ; // 得到日期时间的DateFormat对象
System.out.println("DATE:" + df1.format(new Date())) ; // 按照日期格式化
System.out.println("DATETIME:" + df2.format(new Date())) ; // 按照日期时间格式化
}
};
通过此类可以直接将Date类的显示进行合理的格式化操作。此时采用的是默认的格式化操作,也可以通过Locale对象指定要显示的区域。如指定的区域是中国:
import java.text.DateFormat ;
import java.util.Date ;
import java.util.Locale ;
public class Test{
public static void main(String args[]){
DateFormat df1 = null ; // 声明一个DateFormat
DateFormat df2 = null ; // 声明一个DateFormat
df1 = DateFormat.getDateInstance(DateFormat.YEAR_FIELD,new Locale("zh","CN")) ; // 得到日期的DateFormat对象
df2 = DateFormat.getDateTimeInstance(DateFormat.YEAR_FIELD,DateFormat.ERA_FIELD,new Locale("zh","CN")) ; // 得到日期时间的DateFormat对象
System.out.println("DATE:" + df1.format(new Date())) ; // 按照日期格式化
System.out.println("DATETIME:" + df2.format(new Date())) ; // 按照日期时间格式化
}
};
SimpleDateFormat类代码:此类的功能是完成日期的显示格式化的,例如,在开发中,可能会将一种日期格式变为另一种日期格式,如下所示:
import java.util.* ;
public class Test{
public static void main(String args[]){
String strDate = "2008-10-19 10:11:30.345" ;
// 准备第一个模板,从字符串中提取出日期数字
String pat1 = "yyyy-MM-dd HH:mm:ss.SSS" ;
// 准备第二个模板,将提取后的日期数字变为指定的格式
String pat2 = "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒" ;
SimpleDateFormat sdf1 = new SimpleDateFormat(pat1) ; // 实例化模板对象
SimpleDateFormat sdf2 = new SimpleDateFormat(pat2) ; // 实例化模板对象
Date d = null ;
try{
d = sdf1.parse(strDate) ; // 将给定的字符串中的日期提取出来
}catch(Exception e){ // 如果提供的字符串格式有错误,则进行异常处理
e.printStackTrace() ; // 打印异常信息
}
System.out.println(sdf2.format(d)) ; // 将日期变为新的格式
}
};
例子:你活了多少天了?
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class LiveDayDemo {
public static void main(String[] args) throws ParseException {
//1. 获取你的生日 (String) -> Date -> getTime
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的生日(yyyy-MM-dd):");
String birthString = sc.nextLine();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date birthDate = sdf.parse(birthString);
long birthTime = birthDate.getTime();
//2. 获取系统当前时间 new Date().getTime();
long currentTime = new Date().getTime();
//3. 当前时间 - 你的生日 (毫秒值)
long day = (currentTime - birthTime) / 1000 / 3600 / 24;
System.out.println("你活了" + day + "天");
}
}
3.java.util.Calendar 表示日历的类
Calendar类 :抽象类,不能new,其方法都是静态方法,它为特定瞬间与一组诸如YEAR、MONTH 、DAY_OF_MONTH等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期)提供了一些方法。
Calendar类可以精确的得到每一个日历字段,如果你想得到年月日,时分秒这样的数据,就可以把日历字段做拼接
1)Calendar提供了一个静态方法(不用创建对象,节约资源),可以直接获取当地日历
创建对象:
Calendar c = Calendar.GetInstance()
//根据系统信息获取当地的日历对象
或者用子类创建对象:
Calendar c = new GregorianCalendar()
;
但这样获取的信息非常多,所以Calendar提供了get()方法获取具体的日历,参数为Calendar提供的很多常量值。
private static void method2() {
Calendar c = Calendar.getInstance();
//c.getYear(); 获取年份,可以替换为下面的方式
int year = c.get(Calendar.YEAR);
// 获取月分,获取的是0--11月,不符合实际生活,所以+1
int month = c.get(Calendar.MONTH) + 1;
//获取天(几号)
int day = c.get(Calendar.DAY_OF_MONTH);
System.out.println(year + "-" + month + "-" + day);
}
public int get(int field)
返回给定日历字段的值
eg:int year = rightNow.get(Calendar.YEAR);
int second = rightNow.get(Calendar.SECOND);显示的是5,而不是05
所以在输出秒的时候可以用.append(second>9?second:“0”+second);
注意:三元运算符返回连个不同类型的值,如果大于9,则返回int类型;否则,返回字符串类型
成员方法:
1.abstract void add(int field,int amout);根据字段名称和偏移量,修改时间
field字段值:Calendar.YEAR amout 偏移量
2.int get (int field):返回日历字段的值,
3.Date getTime():返回一个表示此Calendar时间值的Date对象
4.void set(int field,int value):将给定的日历字段值设置为给定值
5.void set(int year,int month,int date,int hourOfDay,int minute,int second)
6.void setTime(Date date):
在Calendar 类中,月份的表示以0-11 表示1-12月,西方的周日,中国的周一
Calendar c = Calendar.getInstance();
// 在 天数添加 30天
c.add(Calendar.DAY_OF_MONTH,30);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1; // 0 ~11
int day = c.get(Calendar.DAY_OF_MONTH);
System.out.println(year + "-" + month + "-" + day);
public class Test{
public static void main(String args[]){
Calendar calendar = new GregorianCalendar(); // 实例化Calendar类对象
System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
System.out.println("MONTH: " + (calendar.get(Calendar.MONTH) + 1));
System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
}
};
//注:在取得月份的时候要特别注意,需要加1。
// 如果按照此方法取得,则很麻烦,最好的做法是将Date进行一些相关的格式化操作。
4.System类:系统类
a.final修饰,不让继承 b.私有化构造,不让实例化 c.所有属性和方法都是static
System从一开始接触Java就已经接触到:System.out.println System.in等
提供了静态成员供我们使用
1)public static void gc()
运行JVM中的垃圾回收器,完成内村长垃圾的清除
2)public static void exit(int status)
用于结束正在运行的Java程序。参数传入一个数字即可。通常传入0记为正常状态,其他为异常状态
public static long currentTimeMills()
获取当前系统时间与时间原点的毫秒差值
而new Date().getTime()得底层正是这个:所以可以直接使用currentTimeMillis方法获取,效率更高
public Date(){
this(System.currentTimeMillis());
}
可以用来计算一段程序执行所需的时间
long start = System.currentTimeMills();
…程序
long end = System.currentTimeMills();
end - start
4)getProperty(String key)
用来获取指定键(字符串名称)中所记录的系统属性信息
public static void arraycopy(Object src,int srcPOS,Object dest,int destPos,int length)
用来实现将源数组部分元素复制到目标数组的指定位置(源数组,源数组起始位置,目标数组,目标数组起始位置,长度)
这个数组复制功能在JDK源码中用的多,实际使用中用的少
/* 参数含义
* @param src 源数组
* @param srcPos 源数组起始位置
* @param dest 目标数组
* @param destPos 目标数组的起始位置
* @param length 被复制的元素个数
*/
int[] src = {1,2,3,4,5};
int[] dest = {6,7,8,9,0};
System.arraycopy(src,2,dest,0,3);
System.out.println(Arrays.toString(dest)); //[3, 4, 5, 9, 0]
例子:现有一个字符数组{‘e’,‘r’,‘r’,‘o’,‘a’},请使用System类中的arraycopy()方法在控制台输出“error”
char[] array1 = {'e','r','r','o','a'};
System.arraycopy(array1,1, array1,array1.length-1,1);
System.out.println(array1);
5.StringBuilder
String被final修饰,所以本身不可变,每次对String进行操作,都会产生很多新的对象,很浪费资源,影响效率;
StringBuilder继承自AbstractStringBuilder,每个对象都有一定的缓冲区,在缓冲区范围内操作, 不会产生新(临时)的对象。
StringBuilder拼接字符串可用append("…")拼接
StringBuilder append = sb.append("1").append(2).append("3").append(4).append(5).append(6);
System.out.println(append);
为什么要用StringBuilder:
例:分别使用String的+=和StringBuilder的append()方法对字符串做100000次拼接,计算String拼接100000次花费时间与StringBuilder拼接100000次花费时间并打印。
6.Math类
数学的类,用来进行基本的数学运算
注意向上取整方法:Math.ceil(double i)
;可以用来做分页;
7.基本数据包装类型
注意:基本类型与包装类匹配,否则运行时报错
可以把基本类型转成对象,也可以把对象转成基本类型,也可以基本数据类型转成字符串
1.把基本类型转成对象
第一种构造方法:包装类 i = new 包装类(基本类型);或者包装类 i = new 包装类(“基本类型”)
第二种方法:通过包装类的valueOf方法
包装类的构造方法:Interger inter = new Integer(50)
;
package com.oracle.demo02;
public class demo02 {
public static void main(String[] args) {
//基本数据类型和包装类之间的转换
//第一种 通过构造方法
Integer in = new Integer(44); //deprecated
Integer in2 = new Integer("44");
//第二种 通过包装类的valueof方法
Integer in3 = Integer.valueOf(33);
Integer in4 = Integer.valueOf("33");
}
}
2.把对象转成基本数据类型
包装类对象的方法:inter.intValue()
;
package com.oracle.demo02;
public class demo02 {
public static void main(String[] args) {
Integer in = new Integer(44);//将包装类对象转为基本数据类型
int i = in.intValue();
System.out.println(i+1);
}
}
3.把基本数据类型转成字符串 :第一种与 ""相连;第二种valueOf; 第三种:toString(基本数据类型);
包装类的方法:inter.toString()
;
package com.oracle.demo02;
public class demo01 {
public static void main(String[] args) {//将基本数据类型转为字符串
//第一种与""相连
System.out.println(12+""+1);
//第二种 valueof
System.out.println(String.valueOf(12)+6);
//toString(基本数据类型)
System.out.println(Integer.toString(12)+9);
}
}
4.把字符串转成基本数据类型, 包装类.parseXXX(String s)
;
[parsenXXX]一般为静态方法,因此直接用类名访问[parse:解析]
包装类的方法:Integer.parseInt(“1234”);
5.把基本数据类型转成包装类型
包装类的方法:Integer.valueOf(55);
-
自动装箱:把基本类型的数据,自动转换成 包装类型的对象;
-
自动拆箱:把包装类型的对象 自动 转成 基本类型的数据;
package com.oracle.demo02; public class demo03 { public static void main(String[] args) { //自动装箱 基本类型 =》包装类 Integer i = 2; //自动拆箱 包装类 =》基本类型 int sum = i+2; } }
原文:https://blog.csdn.net/u013905744/article/details/44538469
https://blog.csdn.net/weixin_38816084/article/details/82620084