日期和时间的API
jdk1.8之前日期时间API
java.util.Date和java.sql.Date
public class DataTimeTest {
/*
java.util.Date类
|---java.sql.Date类
1.两个构造器的使用
>构造器一:Date():创建一个对应当前时间的Date对象
>构造器二:创建指定毫秒数的Date对象
2.两个方法的使用:
>toString():显示当前时间的年、月、日、时、分、秒。
>getTime():获取当前Date对象对应的毫秒数。(时间戳)
3.java.sql.Date对应着数据库中的日期类型的变量
>如何实例化
java.sql.Date的实例化new java.sql.Date(long date)
>如何将java.util.Date对象转换为java.sql.Date对象
java.sql.Date date4 = new java.sql.Date(new java.util.Date().getTime());
>toString():显示当前时间的年、月、日
*/
@Test
public void test2() {
//构造器一:Date():创建一个对应当前时间的Date对象
//分配一个 Date 对象并对其进行初始化,以便它表示分配它的时间,测量到最接近的毫秒。
Date date = new Date();
System.out.println(date.toString());//Mon Feb 13 19:47:44 CST 2023
long l = System.currentTimeMillis();
System.out.println(l);//1676289444128
//构造器二:创建指定毫秒数的Date对象
Date date1 = new Date(l);
long time = date.getTime();
System.out.println(time);
System.out.println(date1.toString());//Mon Feb 13 20:00:04 CST 2023
// java.sql.Date的实例化new java.sql.Date(long date)实例化:
// 自 1970 年 1 月 1 日 00:00:00 GMT 以来的毫秒不超过 8099 年的毫秒表示形式。负数表示 1970 年 1 月 1 日 00:00:00 GMT 之前的毫秒数。
java.sql.Date date2 = new java.sql.Date(111111111111L);
System.out.println(date2.toString());//1973-07-10
//如何将java.util.Date对象转换为java.sql.Date对象
//方式一:
Date date3 = new Date();
// java.sql.Date date4 = (java.sql.Date) date3;
//System.out.println(date4.toString());//java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
java.sql.Date date4 = new java.sql.Date(new java.util.Date().getTime());
System.out.println(date4.toString());//2023-02-13
System.out.println(date4.getTime());//1676290593981 时间戳
}
//1.System类中的currentTimeMillis()方法:
@Test
public void test1() {
// 返回当前时间与1970 年 1 月 1 日 之间的差(以毫秒为单位),也称为时间戳。
long currentTimeMillis = System.currentTimeMillis();
System.out.println(currentTimeMillis);
}
}
java.text.SimpleDateFormat:对日期Date类的格式化和解析
/**
* SimpleDateFormat对日期Date类的格式化和解析
* 1.两个操作
* 1.1格式化:日期--->字符串。
* 1.2解析:格式化的逆过程,字符串--->日期。
* 2.SimpleDateFormat的实例化
*/
@Test
public void testSimpleDateFormat() throws ParseException {
//SimpleDateFormat的实例化:使用默认的构造器
SimpleDateFormat format = new SimpleDateFormat();
//Date的实例化
Date date = new Date();
//获取当前时间的日期
System.out.println(date); // Tue Feb 14 19:00:55 CST 2023
//格式化:日期--->字符串。
//将日期格式设置为日期时间字符串。
String format1 = format.format(date);
System.out.println(format1);//23-2-14 下午7:04 默认的日期时间格式
//解析:格式化的逆过程,字符串--->日期。
// String str="2023-02-14";//java.text.ParseException: Unparseable date: "2023-02-14"
String s = "23-2-14 下午7:04";
Date date1 = format.parse(s);
System.out.println(date1);//Tue Feb 14 19:04:00 CST 2023
//**************按照指定的方式格式化和解析:调用带参的构造器*******************
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//格式化
String format2 = simpleDateFormat.format(date);
System.out.println(format2);//2023-02-14 07:18:40
//解析
Date parse = simpleDateFormat.parse(format2);
System.out.println(parse);//Tue Feb 14 07:24:12 CST 2023
}
/**
* 将字符串"2002-09-08"转换为java.sql.Date
*/
@Test
public void test1() throws ParseException {
String s = "2002-09-08";
//1.实例化SimpleDateFormat
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
//2.使用SimpleDateFormat将字符串解析为java.util.Date类型
Date parse = simpleDateFormat.parse(s);
//3.将java.util.Date类型转换为java.sql.Date类型
long time = parse.getTime();
java.sql.Date date =new java.sql.Date(time);
System.out.println(date);//2002-09-08
}
java.util.Calendar:日历类
/**
* java.util.Calendar:日历类(该类是一个抽象类)的使用:
* //1.Calendar的实例化:
* //方式一:创建其子类(GregorianCalendar)的对象。
* //方式二:调用Calendar的静态实例化方法【getInstance()】
* 2.常用方法:
* get()
* set()
* add()
* getTime()
* setTime()
* 注意:
* 获取月份时:一月是0,二月是1,......十二月是11。
* 获取星期时:周日是1,周一是2,......周六是7.
*
*/
@Test
public void test1() {
//1.Calendar的实例化:
//方式一:创建其子类(GregorianCalendar)的对象。
GregorianCalendar gregorianCalendar = new GregorianCalendar();
//方式二:调用Calendar的静态实例化方法【getInstance()】,
Calendar instance = Calendar.getInstance();
System.out.println(instance.getTime());//Tue Feb 14 20:40:46 CST 2023
//2.常用方法
//get()
int days = instance.get(Calendar.DAY_OF_YEAR);//获取日历的当前年份内的天数
System.out.println(days);//45
//set()
instance.set(Calendar.DAY_OF_YEAR, 10);
days = instance.get(Calendar.DAY_OF_YEAR);
System.out.println(days);//10 . 更改为今年第10天。
//add()
instance.add(Calendar.DAY_OF_YEAR,-7);
days = instance.get(Calendar.DAY_OF_YEAR);
System.out.println(days);//3
//getTime():日历类--->Date
Date date = instance.getTime();
System.out.println(date);//Tue Jan 03 20:48:18 CST 2023
System.out.println(new SimpleDateFormat().format(date));//23-1-3 下午8:50
//setTime():Date--->日历类
Date date1 = new Date();
instance.setTime(date1);
System.out.println(instance.getTime());//Tue Feb 14 20:56:42 CST 2023
}
JDK1.8及之后的日期,时间API
LocalDate、LocalTime、LocalDateTime
/**LocalDate、LocalTime、LocalDateTime的使用
* 1.LocalDateTime相较于LocalDate,LocalTime使用的频率较高,这三个类具有不可变性。
* 2.类似于Calendar:该类具有可变性。
**/
@Test
public void test1() {
//LocalDate、LocalTime、LocalDateTime
//now():获取当前的日期,时间,日期+时间
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate);//2023-02-14
System.out.println(localTime);//21:34:53.765
System.out.println(localDateTime);//2023-02-14T21:34:53.765
//of():设置指定的年,月,日,时,分,秒。没有偏移量
LocalDateTime localDateTime1 = LocalDateTime.of(1949, 10, 1, 0, 0, 1);
System.out.println(localDateTime1);//1949-10-01T00:00:01
//getXxx():获取各种时间
int dayOfYear = localDateTime.getDayOfYear();
System.out.println(dayOfYear);//45.//今天是一年的第几天
//with():体现了这三个类的不可变性
int dayOfMonth = localDateTime.getDayOfMonth();//当前时间是该月第几天
System.out.println(dayOfMonth);//14
LocalDateTime localDateTime2 = localDateTime.withDayOfMonth(10);//更改当前时间为当月第10天。
System.out.println(dayOfMonth);//14
System.out.println(localDateTime2);//2023-02-10T21:57:41.648
}
Instant的使用
/**
* Instant的使用
*/
@Test
public void test2() {
//实例化
//now():静态方法,返回默认UTC时区的Instant类的对象。
Instant instant = Instant.now();
System.out.println(instant);//2023-02-15T01:29:47.957Z
//atOffset():添加时区的偏移量
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));//当前所在地与格林威治时间所在地区相差的时区
System.out.println(offsetDateTime);//2023-02-15T09:39:42.479+08:00
//toEpochMilli():当前时间与时间戳间隔的毫秒数
long l = instant.toEpochMilli();
System.out.println(l);//1676425414091L
//ofEpochMilli(long epochMilli):静态方法,通过给定毫秒数去获取一个Instant实例对象。
Instant instant1 = Instant.ofEpochMilli(167642541409100L);
//体现了Instant的不可变性
System.out.println(offsetDateTime);//2023-02-15T09:48:35.303+08:00
System.out.println(instant1);// 7282-05-19T04:36:49.100Z
}
DateTimeFormatter:日期时间格式化
/**
* DateTimeFormatter:日期时间格式化
* 类似于SimpleDateFormat
* 该类提供了三种格式化方法:
* <p>
* 预定义的标准格式。如:ISO_DATE_TIME;ISO_DATE
* <p>
* 本地化相关的格式。如:ofLocalizedDate(FormatStyle.MEDIUM)
* <p>
* 一般都用自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
*/
@Test
public void test3() {
//预定义的标准格式。如:ISO_DATE_TIME;ISO_DATE
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//格式化:日期--->字符串
LocalDateTime localDateTime = LocalDateTime.now();
String str1 = formatter.format(localDateTime);
System.out.println(str1);//2023-02-15T10:07:17.968
//解析:字符串--->日期
TemporalAccessor parse = formatter.parse(str1);
System.out.println(parse);//{},ISO resolved to 2023-02-15T10:10:14.740
//本地化相关的格式。如:ofLocalizedDate(FormatStyle.MEDIUM)
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
String str2 = formatter1.format(localDateTime);
System.out.println(str2);//2023年2月15日 上午10时13分16秒
TemporalAccessor parse1 = formatter1.parse(str2);
System.out.println(parse1);//{},ISO resolved to 2023-02-15T10:14:17
//自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”);一般都用这种格式。
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化
String str3 = formatter2.format(localDateTime);
//解析
TemporalAccessor parse2 = formatter2.parse(str3);
System.out.println(str3);//2023-02-15 10:19:25
System.out.println(parse2);//{NanoOfSecond=0, MilliOfSecond=0, MinuteOfHour=19, SecondOfMinute=25, MicroOfSecond=0, HourOfAmPm=10},ISO resolved to 2023-02-15
}