jdk1.8之前的时间日期类
一、Date类
java.util.Date(父类)
java.sql.Date(子类)
1.掌握构造器的使用
java.util.Date() //无参构造器
java.util.Date(long Date) //创建指定毫秒数的Date对象
java.sql.Date(long Date) //java.sql.Date 没有无参构造方法
2.两个常用方法的使用
toString()方法 //直接返回当前时间
getTime() 方法 //返回1970年至今的毫秒数//此方法System.currentTimeMillis()方法类似
3.java.sql.Date //专门用于数据库的时间
java.util.Date -> java.sql.Date
java.sql.Date -> java.util.Date
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
//java.util.Date的无参构造及两个方法的使用
Date date = new Date();//以创建该对象时的时间为date值
System.out.println("date = " + date.toString()); //Sat Jun 06 23:12:31 CST 2020
System.out.println("date = " + date.getTime()); //返回1970到当前的毫秒值1591455534797 //此方法跟System.currentTimeMillis()方法类似
System.out.println("------------------------");
//java.util.Date的有参构造及toString方法的使用
Date date1 = new Date(1591455534797L); //创建指定毫秒数的Date对象
System.out.println("date1 = " + date1.toString()); //Sat Jun 06 22:58:54 CST 2020
System.out.println("------------------------");
//java.sql.Date的有参构造
java.sql.Date date2 = new java.sql.Date(1591455534797L);
System.out.println("date2 = " + date2); //2020-06-06
System.out.println("---------关于转换问题---------------");
// 以下这个转换方法肯定报错:因为java.util.Date是父类,java.sql.Date是子类,将父类直接强转为子类的前提是:多态
// 也就是说,父类的引用指向子类对象,即Fu f=z;这样的情况下的f才可以进行强转为z!
// Date date3_1 = new Date();
// java.sql.Date date_4 = (java.sql.Date)date3_1;//父转子不行
// System.out.println(date_4);
//如下就是父类引用指向子类对象的强转例子,也是java.util.Date转为java.sql.Date 的一个方法//目的:父转子
java.util.Date date3 = new java.sql.Date(1111254125632L);//Fu f=z;子转父可行
java.sql.Date date4 = (java.sql.Date) date3;//Zi z=(Zi)f;f=z;子转父转子可行
System.out.println("date3 = " + date3);
System.out.println("date4 = " + date4);
System.out.println("------------------------");
//如下方法是将不涉及多态的data5,转为java.sql.Date的一种的方法
Date date5 = new Date();
java.sql.Date date6 = new java.sql.Date(date5.getTime());
System.out.println("date5 = " + date5);
System.out.println("date6 = " + date6);
System.out.println("------------------------");
//如下方法是将不涉及多态的data7,转为java.util.Date的一种的方法
java.sql.Date date7 = new java.sql.Date(1232541256321L);
Date date8 = new Date(date7.getTime());
System.out.println("date7 = " + date7);
System.out.println("date8 = " + date8);
System.out.println("------------------------");
}
}
二、Calendar类
Calendar: 日历类 jdk1.8之前
1.没有构造器,因为Calendar类是abstract的,无法通过new实例,只能通过getInstance()方法获取实例;
或者通过Calendar 的子类 GregorianCalendar 获取实例
2.常用方法
static Calendar getInstance();//获取Calendar实例;
int get(Field);//获取某个域的值
void set(Field ,int val);//设置某个域的值
void add(Field ,int val);//使某个域增加val个值点
Date getTime();//将Calendar转换为Date类型(与Date的getTime()不一样)
void setTime(Date d);//将Date类型转换为Calendar类型
long getTimeInMillis();//获取从起始日期到此日期经过的毫秒值
void setTimeInMillis(long ms);//设置从1970年01月01号 00:00:00 开始经过ms的毫秒值作为Calendar对象的值;
常量:
- 年 YEAR、月 MONTH(0到11)、日 DAY_OF_MONTH
- DAY_OF_WEEK:星期(1~7 星期天是第一天,即1代表星期天,2代表星期一)
- 时 HOUR_OF_DAY、分 MINUTE、秒 SECOND、MILLISECOND(毫秒,一秒等于1000ms)
import java.util.Calendar;
import java.util.Date;
public class CalendarDemo {
public static void main(String[] args) {
//通过getInstance()方法实例了一个对象,通过getClass()方法可以查看到对象是GregorianCalendar类的
System.out.println("-----------输出calendar和实例对象的类型-------------");
Calendar calendar = Calendar.getInstance();
Class<? extends Calendar> aClass = calendar.getClass();
System.out.println(calendar); //返回一长串东西
System.out.println(aClass); //class java.util.GregorianCalendar
//get(Calendar.DAY_OF_MONTH)方法获得今天是本月第几天
System.out.println("------------获取今天是本月第几天(get()方法)-----------");
int i = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(i);
//set(Calendar.DAY_OF_MONTH, 25): 将今天是本月第几天修改为25天;此方法无返回值
System.out.println("--------------set()方法---------------------");
calendar.set(Calendar.DAY_OF_MONTH, 25);
i = calendar.get(Calendar.DAY_OF_MONTH); //通过get()方法获取
System.out.println(i);
//add(Calendar.DAY_OF_MONTH,5): 将今天是本月第几天加上5天;此方法无返回值
System.out.println("--------------add()方法---------------------");
calendar.add(Calendar.DAY_OF_MONTH,5);
i = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(i);
//getTime()方法将设置好的日历包装成一个Date类日期
System.out.println("--------------getTime()方法---------------------");
Date time = calendar.getTime();
System.out.println(time); //Tue Jun 30 21:55:00 CST 2020
//setTime(date)方法
System.out.println("--------------setTime()方法---------------------");
Date date = new Date();
calendar.setTime(date);
i = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(i);
}
}
三、SimpleDateFormat类
SimpleDateFormat 格式化与解析时间日期类 jdk1.8之前
1.两种构造器的使用
SimpleDateFormat() : 此构造器返回默认的日期格式:20-6-8 下午12:08
SimpleDateFormat(String pattern) : 此构造器返回指定日期格式(常用:yyyy-MM-dd HH:mm:ss)
2.常用方法的使用
String format(Date date) : 格式化: 日期—>字符串
Date parse(String date) : 解析: 字符串—>日期
3.注意
需要 Date date = new Date(); 来创建一个时间
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatDemo {
public static void main(String[] args) throws ParseException { //这里需要抛出异常
//无参构造器
SimpleDateFormat sdf = new SimpleDateFormat();
Date date = new Date();
//format():格式化 返回一个中国日期 日期 ---> 字符串
System.out.println("---------------格式化---------------");
String format = sdf.format(date);
System.out.println(date); //Mon Jun 08 12:08:57 CST 2020
System.out.println(format); //20-6-8 下午12:08
//parse():解析: 格式化的逆过程 字符串 ---> 日期
System.out.println("---------------解析---------------");
String s1 = "20-6-8 下午12:08";
Date parse = sdf.parse(s1);
System.out.println(parse);
//有参构造器
System.out.println("---------------有参构造器:指定日期格式---------------");
//格式化
new SimpleDateFormat();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format1 = sdf1.format(date);
System.out.println(format1);
//解析
Date date1 = sdf1.parse(format1);
System.out.println(date1);
}
/*
练习一:将字符串2020-10-21转换为java.sql.Date (项目中需要将用户传来的String类型的日期转为java.sql.Date才能存入数据库的表中)
*/
@Test
public void test01() throws ParseException {
System.out.println("---------------练习一---------------");
String date = "2020-10-21";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//yy-MM-DD是错误的
Date date1 = sdf.parse(date);
java.sql.Date date2 = new java.sql.Date(date1.getTime());
System.out.println(date2);
}
}
4.SimpleDateFormat定义的字母代表的含义
字母 | 日期或时间元素 | 表示 | 示例 |
---|---|---|---|
G | Era标志符 | Text | AD |
y | 年 | Year | 1996; 96 |
Y | 年 | Year | 与y不同的是如果本周跨年,则Y为下一年 |
M | 年中的月份 | Month | July; Jul; 07 |
m | 小时中的分钟数 | Number | 30 |
w | 年中的周数 | Number | 27 |
W | 月份中的周数 | Number | 2 |
D | 年中的天数 | Number | 189 |
d | 月份中的天数 | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天数 | Text | Tuesday; Tue |
a | Am/pm 标记 | Text | PM |
H | 一天中的小时数(0-23) | Number | 0 |
k | 一天中的小时数(1-24) | Number | 24 |
K | am/pm 中的小时数(0-11) | Number | 0 |
h | am/pm 中的小时数(1-12) | Number | 12 |
s | 分钟中的秒数 | Number | 55 |
S | 毫秒数 | Number | 978 |
z | 时区 | General time zone | Pacific Standard Time; PST; GMT-08:00 |
Z | 时区 | RFC 822 time zone | -0800 |
最正经的格式:yyyy-MM-dd HH:mm:ss
(月、时,大写,其他小写)
M为月,m为分钟
H为24小时制,h为12小时制
月、日、时、分、秒双拼是为了有前置0(2020-10-1 8:30:5 ->2020-10-01 08:30:05)
四、System类
1.无法通过new实例化,因为System的构造方法私有化了
2.currentTimeMillis() :通过这个方法可以获取一个时间戳
public class SystemDemo {
public static void main(String[] args) {
//此方法表示的时间,是指1970年0时0分0秒到现在时间的毫秒数
long l = System.currentTimeMillis();
System.out.println(l);
}
}
jdk1.8新增的时间日期类
一、LocalTime类、LocalDate类、LocalDateTime类 (最常用)
这三个类的本质都一样,LocalTime类是获取时间,LocalDate类是获取日期,LocalDateTime类是获取时间日期;三者的使用方法也大体一致,所以这里只举例LocalDateTime类。
1.无法通过new实例化,因为这三个类的构造方法都私有化了
可以通过now()方法进行实例对象;
或者通过of()方法进行指定日期的实例;
2.四种常用方法
getXxx():获取相关的属性
withXxx(): 设置相关的属性,体现出XxxTime类的不可变性(没有setXxx()方法)
plusXxx(): 添加
minusXxx(): 减
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class TimeDemo {
public static void main(String[] args) {
//获取对象
LocalTime localTime = LocalTime.now();
LocalDate localDate = LocalDate.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localTime); //23:34:04.762
System.out.println(localDate); //2020-06-08
System.out.println(localDateTime); //2020-06-08T23:34:04.762
LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 21, 10, 10, 10, 100000000);
System.out.println(localDateTime1); //2020-10-21T10:10:10.100
//getXxx():获取相关的属性
System.out.println(localDateTime.getDayOfMonth()); //8
System.out.println(localDateTime.getDayOfWeek()); //MONDAY
System.out.println(localDateTime.getDayOfYear()); //160
System.out.println(localDateTime.getMonth()); //JUNE
System.out.println(localDateTime.getMonthValue()); //6
System.out.println(localDateTime.getMinute()); //34
System.out.println(localDateTime.getNano()); //304000000 纳秒(没有毫秒)
//withXxx():设置相关的属性,体现出XxxTime类的不可变性
LocalDateTime localDateTime2 = localDateTime.withDayOfMonth(30);
System.out.println(localDateTime); //2020-06-08T23:34:04.762
System.out.println(localDateTime2); //2020-06-30T23:34:04.762
//plusXxx():添加
LocalDateTime localDateTime3 = localDateTime.plusMonths(3);
System.out.println(localDateTime); //2020-06-08T23:34:04.762
System.out.println(localDateTime3); //2020-09-08T23:34:04.762
//minusXxx():减
LocalDateTime localDateTime4 = localDateTime.minusMonths(1);
System.out.println(localDateTime); //2020-06-08T23:34:04.762
System.out.println(localDateTime4); //2020-05-08T23:34:04.762
}
}
二、Instant类
1.无法通过new实例化,因为这个类的构造方法被私有化了
可以通过now()方法实例对象
2.四个常用方法
now()
atOffset()方法: 设置时间偏移量
toEpochMilli()方法:获取1970年到现在的时间戳
ofEpochMilli()方法:通过给定的毫秒数,获取Instant实例
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
public class InstantDemo {
public static void main(String[] args) {
//通过now()方法实例化,输出的时间为本初子午线上的时间,比当前时间晚8个小时
Instant instant = Instant.now();
System.out.println(instant);
//atOffset()方法设置时间偏移量,加上八个钟就是当前时间了
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);
//toEpochMilli()方法获取1970年到现在的时间戳,相当于java.util.Date的getTime()方法
long l = instant.toEpochMilli();
System.out.println(l);
//ofEpochMilli()方法,通过给定的毫秒数,获取Instant实例,相当于Date(long millis)
Instant instant1 = instant.ofEpochMilli(15146321545L);
System.out.println(instant1);
}
}
三、DateTimeFormatter类
格式化与解析时间日期类似SimpleDateFormat
1.无法通过new实例化
通过 ISO_LOCAL_DATE_TIME 实例一个对象
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
2.三种使用方式:
方式一:预定义的标准格式
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
方式二:本地化相关的格式
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
//4种不同的时间格式:
FormatStyle.LONG
FormatStyle.FULL
FormatStyle.MEDIUM
FormatStyle.SHORT
方式三(重点):自定义格式
DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
自定义常用格式:yyyy-MM-dd HH:mm:ss // 2020-06-09 17:23:32
3.两种常用方法:
format(): 格式化: 日期—>字符串
parse(): 解析: 字符串—>日期
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
public class DateTimeFormatterDemo {
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now(); //需要创建一个时间日期
//方式一:预定义的标准格式
System.out.println("-----------------------预定义的标准格式--------------------------");
//format(): 格式化为String类型
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
String format = dateTimeFormatter.format(localDateTime); //这里需要传入一个LocalDateTime类型的参数
System.out.println(localDateTime); //2020-06-09T17:02:15.241
System.out.println(format); //2020-06-09T17:02:15.241 虽然两个看起来一样,但是实质已经变了,
// 一个是LocalDateTime类型,一个是String类型
//parse(): 解析
TemporalAccessor parse = dateTimeFormatter.parse("2020-06-09T17:02:15.241");
System.out.println(parse); //{},ISO resolved to 2020-06-09T17:02:15.241
//方式二:本地化相关的格式
System.out.println("-----------------------本地化相关的格式--------------------------");
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
//4种不同的时间格式: FormatStyle.LONG FormatStyle.FULL FormatStyle.MEDIUM FormatStyle.SHORT
String format1 = dateTimeFormatter1.format(localDateTime); //格式化
System.out.println(format1); //20-6-9 下午5:16
TemporalAccessor parse1 = dateTimeFormatter1.parse("20-6-9 下午5:16"); //解析
System.out.println(parse1); //{},ISO resolved to 2020-06-09T17:16
//方式三(重点):自定义格式
System.out.println("-----------------------自定义格式--------------------------");
DateTimeFormatter dateTimeFormatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format2 = dateTimeFormatter2.format(localDateTime); //格式化
System.out.println(format2); //2020-06-09 17:23:32
TemporalAccessor parse2 = dateTimeFormatter2.parse("2020-06-09 17:23:32"); //解析
System.out.println(parse2); //{},ISO resolved to 2020-06-09T17:23:32
}
}