第27讲
API
API即应用程序编程接口,英文全称Application Programming Interface。
API是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
日期是API的一种。
JDK7以前的时间类
- 多线程环境下可能会导致数据安全问题
标准时间
世界标准时间 | 中国标准时间 | 标准基准时间 |
---|---|---|
格林威治时间:GMT | 世界标准时间+8h | 1970年1月1日00:00:00 GMT |
原子钟:UTC |
1 Date 时间类
Date
类代表了一个特定的时间,以毫秒为精度。
导包 java.util.Date
1.1 构造方法
构造方法 | 说明 |
---|---|
public Date() | 创建一个Date对象并对其进行初始化,表示当前系统时间,毫秒为单位。 |
public Date(long date) | 创建一个Date对象,初始化为从标准基准时间起过了指定毫秒数后的时间。 |
1.2 常用方法
成员方法 | 说明 |
---|---|
public long getTime() | 获取从标准基准时间到时间对象的毫秒值(用于计算、比较) |
public void setTime(long time) | 设置时间对象的毫秒值,单位:毫秒值 |
import.java.util.Date;
public class Demo {
public static void main(String[] args) {
//空参构造
Date d1 = new Date();
System.out.println(d1); // 当前时间
//带参构造
Date d2 = new Date(0L);
System.out.println(d2); // Thu Jan 01 08:00:00 CST 1970 // 中国在东八区,有时差
//利用set方法修改时间对象的毫秒值
long time = 1000 * 60 * 60;
d2.setTime(time);
System.out.println(d2); // Thu Jan 01 09:00:00 CST 1970
//利用get方法获取从1970年1月1日00:00:00到时间对象的毫秒值
long t = d2.getTime();
System.out.println(t); // 3600000
}
}
2 SimpleDateFormat 解析与格式化
SimpleDateFormat
是一个具体的类。
作用:
- 格式化(日期->文本);
- 解析(文本->日期);
- 规范化日期。
导包 java.text.SimpleDateFormat
2.1 构造方法
构造方法 | 说明 |
---|---|
public SimpleDateFormat() | 使用默认的样式格式化日期 |
public SimpleDateFormat(String pattern) | 使用指定的样式格式化日期 |
2.2 常用方法
成员方法 | 说明 |
---|---|
public final String format(Date date) | 将给定日期对象格式化为字符串 |
public Date parse(String source) | 将给定字符串解析为日期对象 |
2.3 格式化和解析
格式化的时间形式的常用模式对应关系
2020-07-23 9:13:23
-> yyyy-MM-dd HH:mm:ss
模式字母 | 对应 |
---|---|
y | 年 |
M | 月 |
d | 日 |
H | 时 |
m | 分 |
s | 秒 |
E | 周几(星期几) |
a | 显示上/下午 |
格式化输出日期: 从 Date 到 String
import java.util.Date;
import java.text.SimpleDateFormat;
public class SimpleDateFormatDemo1 {
public static void main(String[] args) {
//带参构造
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d = new Date(0L);
// 格式化输出
String s = sdf.format(d);
System.out.println(s);// 1970年01月01日 08:00:00
}
}
解析日期: 从 String 到 Date
import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException; //异常
public class SimpleDateFormatDemo2 {
public static void main(String[] args) throws ParseException {
String s = "2059年5月12日 10:44:20";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// 要解析的字符串的格式 要与 对象的格式 相匹配
Date d = sdf.parse(s);
System.out.println(d); // Mon May 12 10:44:20 CST 2059
}
}
应用:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
//将字符串日期2000-11-11转换为字符串日期2000年11月11日
public class SimpleDateFormatDemo2 {
public static void main(String[] args) throws ParseException {
//1.解析
String date = "2000-11-11";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf1.parse(date);
System.out.println(d); // Sat Nov 11 00:00:00 CST 2000
//2.格式化
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
String result = sdf2.format(d);
System.out.println(result); // 2000年11月11日
}
}
3 Calendar 日历类
Calendar
是一个抽象类,不能直接获得对象。
作用:
- 将某特定时间与日历字段之间的转换;
- 操作日历字段(例如获得下星期的日期)。
导包 java.util.Calendar
3.1 获取日历对象
public static Calendar getInstance()
//获取日历对象。
方法注意:
-
底层原理:会根据操作系统的不同时区获取日历对象,默认表示当前时间。
-
对象里有一个数组,用来储存当前时间的纪元、年、月、日、时、分、秒、星期等信息。
-
数组中,月份的范围是0~11,即获取到1,表示的是2月。
星期的开始是星期日,即获取到1,表示的是星期日。 -
Calendar类中将数组中的索引所对应的信息封装成了常量。
get(Calendar.YEAR)
表示年
3.2 常用方法
方法 | 说明 |
---|---|
public abstract void add(int field, int amount) | 根据日历的规则,将指定的字段添加/减去amount |
public int get(int field) | 获取给定日历对象中指定的字段(年月日等)的值 |
public final void set(int field, int value) | 设置当前日历中指定的字段为value |
public final Date getTime() | 获取Date(日期)对象 |
public final setTime(Date date) | 根据日期对象设置日历对象 |
public long getTimeInMillis() | 获取日历对象的时间毫秒值 |
public void setTimeInMillis(long millis) | 设置时间毫秒值 |
3.3 应用
get(int field)
的使用
获取当前日期
import java.util.Calendar;
public class Demo {
public static void main(String[] args) {
// 多态的形式创建对象
Calendar c = Calendar.getInstance();
// 获取日期值
int year = c.get(Calendar.YEAR); //年
int month = c.get(Calendar.MONTH) + 1; //月是从0开始算的,所以要 +1
int date = c.get(Calendar.DATE); //日
System.out.println(year + ", " + month + ", " + date);
}
}
add(int field, int amount)
的使用
获取十年后的五天前
import java.util.Calendar;
public class Demo {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
c.add(Calendar.YEAR, 10); //十年后
c.add(Calendar.DATE, -5); //五天前
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int date = c.get(Calendar.DATE);
System.out.println(year + ", " + month + ", " + date);
}
}
案例: 一年的二月有多少天
import java.util.Calendar;
import java.util.Scanner;
public class CalendarTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份:");
int year = sc.nextInt();
// 设置日历对象的为 输入的年、3月、1日
Calendar c = Calendar.getInstance();
c.set(year, 2, 1);
// 3月1日往前推一天,就是2月的最后一天
c.add(Calendar.DATE, -1);
//获取这一天输出
int date = c.get(Calendar.DATE);
System.out.println(year + "年的2月份有" + date + "天");
}
}