努力努力再努力
JDK8之前日期时间API
java.lang.System类
- System类中的currentTimeMillis();
- 返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差,称为时间戳
//System类中的currentTimeMillis()
long time = System.currentTimeMillis();
System.out.println(time);//1624128362975
//返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差
//称为时间戳
Date类
java.util.Date (父类)
java.sql.Date (子类)
-
两个构造器的使用
- 构造器一:Date():创建一个对应当前时间的Date对象
- 构造器二:创建指定毫秒数的Date对象
-
两个方法的使用
- toString():显示当前的年、月、日、时、分、秒
- getTime():获取当前Date对象对应的毫秒数,即时间戳。
//构造器一:Date():创建一个对应当前时间的Date对象
Date date1 = new Date();
System.out.println(date1.toString());//Sun Jun 20 02:54:06 GMT+08:00 2021
System.out.println(date1.getTime());//1624128846330
//构造器二:创建指定毫秒数的Date对象
Date date2 = new Date(1624128346618L);
System.out.println(date2.toString());//Sun Jun 20 02:45:46 GMT+08:00 2021
-
java.sql.Date 对应着数据库中的日期类型的变量
- 实例化:
//创建java.sql.Date对象
java.sql.Date date3 = new java.sql.Date(1550998346618L);
System.out.println(date3.toString());//2019-02-24
- 如何将java.util.Date对象转换成java.sql.Date对象
//情况一:
Date date4 = new java.sql.Date(1550988346618L);//多态;子类对象指向父类
java.sql.Date date5 = (java.sql.Date)date4;//强转
//情况二:
Date date6 = new Date();
java.sql.Date date7 = new java.sql.Date(date6.getTime());
System.out.println(date7.toString());//2021-06-20
SimpleDateFormat类的使用
SimpleDateFormat 对日期Date类的格式化和解析
- 格式化:日期 --> 字符串
- 解析:格式化的逆过程,字符串 --> 日期
//不是静态的类,所以要创建对象
SimpleDateFormat sdf = new SimpleDateFormat();//使用默认的构造器
Date date = new Date();
System.out.println(date);//Tue Jun 22 14:05:37 GMT+08:00 2021
//格式化:日期 --> 字符串
String format = sdf.format(date);
System.out.println(format);//21-6-22 下午2:05
//解析:格式化的逆过程,字符串 --> 日期
String str="19-2-24 下午11:05";
Date date1 = sdf.parse(str);//不按照格式会抛出异常ParseException
System.out.println(date1);
按照指定的方式 格式化和解析:调用带参的构造器
- 这些A——Z,a——z这些字母(不被单引号包围的)会被特殊处理替换为对应的日期时间,其他的字符串还是原样输出。日期和时间模式(注意大小写,代表的含义是不同的)
yyyy:年
MM:月
dd:日
hh:1~12小时制(1-12)
HH:24小时制(0-23)
mm:分
ss:秒
S:毫秒
E:星期几
D:一年中的第几天
F:一月中的第几个星期(会把这个月总共过的天数除以7)
w:一年中的第几个星期
W:一月中的第几星期(会根据实际情况来算)
a:上下午标识
k:和HH差不多,表示一天24小时制(1-24)。
K:和hh差不多,表示一天12小时制(0-11)。
z:表示时区
//按照指定的方式 格式化和解析:调用带参的构造器
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
//格式化
String format1 = sdf1.format(date);
System.out.println(format1);
//解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),否则跑异常
Date date2 = sdf1.parse("2021-06-22 14:52:09");
System.out.println(date2);
练习
一、字符串"2020-09-08"转换为java.sql.Date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse("2020-09-08");
//System.out.println(date);Tue Sep 08 00:00:00 GMT+08:00 2020
long time = date.getTime();
System.out.println(time);//1599494400000
java.sql.Date date1=new java.sql.Date(time);
System.out.println(date1);//2020-09-08
二、三天打鱼两天晒网:1990-01-01 在某一天打渔还是晒网
求总天数:举例:2019-02-24
总天数%5 == 1,2,3:打渔
总天数%5 == 4,0:晒网
总天数计算?
一、(date.getTime()-date1.getTime())/(1000 * 60 * 60 * 24)+1
二、1990-01-01 -->2018-12-31 + 2019-01-01 --> 2019-02-24
- 方式一
public static void main(String[] args) throws ParseException {
String date1 = "1990-1-1";
String date2 = "2019-02-24";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d1 = sdf.parse(date1);
Date d2 = sdf.parse(date2);
System.out.println(d1);
System.out.println(d2);
long time = d2.getTime() - d1.getTime();
int day = (int) (time/1000/3600/24) + 1;
System.out.println("第"+day+"天");
if(day%5==4 || day%5==0) {
System.out.println("在晒网");
}
else {
System.out.println("在打鱼");
}
}
- 方式二
package com.dateTime;
import java.util.*;
import java.util.regex.Pattern;
public class TestDemo02 {
//将闰、平年的每月天数写入静态数组,并在最后加上一年的总数
static int[] leapYear= {31,29,31,30,31,30,31,31,30,31,30,31,366};
static int[] commonYear= {31,28,31,30,31,30,31,31,30,31,30,31,365};
// 判断日期格式是否正确,并判断输入日期是否符合现实
void dateJudge(String d) throws Exception{
//判断输入日期格式是否异常
if(!Pattern.matches("\\d{4}-\\d{2}-\\d{2}", d)) {
throw new Exception("输入日期格式错误!");
}
//将日期分割,各部分构成字符串数组a
String [] a=d.split("-");
//将数组元素转为int型,依次赋给year,month,day三个变量
int year=Integer.parseInt(a[0]);
int month=Integer.parseInt(a[1]);
int day=Integer.parseInt(a[2]);
//判断年月日的数字是否合理
if(year<1990) {
throw new Exception("输入年份早于2010年!");
}
if(month<1||month>12) {
throw new Exception("输入月份不在1~12范围!");
}
if((year%4==0&&year%100!=0)||year%400==0) {
if(day<0||day>leapYear[month-1]) {
throw new Exception("输入天数不符合当月天数范围!");
}
}else {
if(day<0||day>commonYear[month-1]) {
throw new Exception("输入天数不符合当月天数范围!");
}
}
}
// 计算从1990年10月1日到指定日期的总天数
int dayTotal(String d) {
//接收日期判断时出现的错误并做出处理
try {
dateJudge(d);
}catch (Exception e) {
e.printStackTrace();
return -1;
}
int totalday=0;
int startYear=1990;
//分割日期字符串,并将数字部分解析成int型供后方计算
String[] a=d.split("-");
int year=Integer.parseInt(a[0]);
int month=Integer.parseInt(a[1]);
int day=Integer.parseInt(a[2]);
//计算1990年1月1日到指定日期前一年的总天数
for(int i=startYear;i<year;i++) {
if((i%4==0&&i%100!=0)||i%400==0) {
totalday=totalday+leapYear[12];
}else {
totalday=totalday+commonYear[12];
}
}
//计算1990年1月1日到指定日期前一月的总天数
if((year%4==0&&year%100!=0)||year%400==0) {
for(int i=0;i<month-1;i++) {
totalday=totalday+leapYear[i];
}
}else {
for(int i=0;i<month-1;i++) {
totalday=totalday+commonYear[i];
}
}
//计算1990年1月1日到指定日期的总天数
totalday=totalday+day;
return totalday;
}
//主方法,具体判断这天距离1990年1月1日天数,
//并做出“打鱼”还是“晒网”的判断
public static void main(String[] args) {
System.out.println("请输入查询日期(格式范例:2020-02-27):");
Scanner s=new Scanner(System.in);
String d=s.next();
TestDemo02 f=new TestDemo02();
int day=f.dayTotal(d);
//判断指定日期是在打鱼还是晒网
if(day!=-1) {
System.out.println("从1990年1月1日开始第"+day+"天了");
if(day%5==1||day%5==2||day%5==3) {
System.out.println("这天在打鱼!");
}else {
System.out.println("这天在晒网!");
}
}
}
}
Calendar日历类(抽象类)的使用
实例化:
- 方式一:创建其子类(GregorianCalendar)的对象
- 方式二:调用其静态方法getInstacne()
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getClass());//calendar对象是GregorianCalendar的对象
常用方法
//get()
int days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);//22
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));//173
//set()
calendar.set(Calendar.DAY_OF_MONTH,24);//calendar可变,set对其本身修改
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//24
//add()
calendar.add(Calendar.DAY_OF_MONTH,3);//加
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
calendar.add(Calendar.DAY_OF_MONTH,-3);//减
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
//getTime():日历类 ---> Date
Date date = calendar.getTime();
System.out.println(date);//Thu Jun 24 16:51:37 GMT+08:00 202
//setTime():Date ---> 日历类
Date date1 = new Date();
calendar.setTime(date1);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));//22
注意:
- 获取月份时:一月是0,二月是1,以此类推,12月是11
- 获取星期时:周日是1,周一是2,。。。周六是7