## JDK8之前日期时间 API
- java.lang.System类
//1.System类中的currentTimeMillis()
@Test
public void test1(){
long time = System.currentTimeMillis();
//返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
//称为时间戳 当前时间2020-3-10,21:25
System.out.println(time);//1583846666636 毫秒数
}
-
java.util.Date 类
-
java.sql.Date类数据库date类
1.两个构造器的使用
>构造器一:Date():创建一个对应当前时间的Date对象
>构造器二:创建指定毫秒数的Date对象
2.两个常用方法的使用
>toString():显示当前的年、月、日、时、分、秒
>getTime():获取当前Date对象对应的毫秒数。(时间戳)
3. java.sql.Date对应着数据库中的日期类型的变量
>如何实例化
>如何将java.util.Date对象转换为java.sql.Date对象
public class DateTimeTest {
@Test
public void test2(){
//构造器一:Date():创建一个对应当前时间的Date对象
Date date1 = new Date();
//显示当前的年、月、日、时、分、秒
System.out.println(date1.toString());//Tue Mar 10 21:28:52 CST 2020
System.out.println(date1.getTime());//1550306204104获取时间戳
//构造器二:创建指定毫秒数的Date对象
Date date2 = new Date(155030620410L);
System.out.println(date2.toString());//Sat Nov 30 16:03:40 CST 1974
//创建java.sql.Date对象
java.sql.Date date3 = new java.sql.Date(35235325345L);
System.out.println(date3);//1971-02-13
//如何将java.util.Date对象转换为java.sql.Date对象
//情况一:
// Date date4 = new java.sql.Date(2343243242323L);
// java.sql.Date date5 = (java.sql.Date) date4;
//情况二:
Date date6 = new Date();
java.sql.Date date7 = new java.sql.Date(date6.getTime());
}
- java.text.SimpleDateFormat类
1.这是一个不与语言环境有关的方式来格式化和解析日期的具体类 。
2.它允许 进行 格式化:日期 --> 文本 、 解析:文本 --> 日期
关于SimpleDateFormat的使用:
1.SimpleDateFormat对日期Date类的格式化和解析
@Test
public void testSimpleDateFormat() throws ParseException {
//实例化SimpleDateFormat:使用默认的构造器
SimpleDateFormat sdf = new SimpleDateFormat();
//1.格式化:日期 --->字符串
Date date = new Date();//使用java.util.Date下的Date实例化
System.out.println(date);
String format = sdf.format(date);//让日期格式化成字符串
System.out.println(format);
//解析:格式化的逆过程,字符串 ---> 日期
String str = "20-03-10 下午21:43";
Date date1 = sdf.parse(str);
System.out.println(date1);
//*************按照指定的方式格式化和解析:调用带参的构造器*****************
// SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//必须遵循格式
//格式化
String format1 = sdf1.format(date);
System.out.println(format1);//2019-02-18 11:48:27
//解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现),
//否则,抛异常
Date date2 = sdf1.parse("2020-02-18 11:48:27");
System.out.println(date2);
}
- java.util.Calendar 日历类
Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
1.实例化:
方式一:创建其子类(GregorianCalendar)的对象
方式二:调用其静态方法getInstance()
@Test
public void testCalendar() {
Calendar calendar = Calendar.getInstance();
它的常用方法:
//从一个 Calendar 对象中获取 Date 对象
Date date = calendar.getTime;
//使用给定的 Date 设置此 Calendar 的时间
date = new Date(234234235235L);
calendar.setTime(date);
calendar.set( Calendar.CDAY_OF_MONTH,8);
System.out.println("当前时间日设置为8后,时间是:" + calendar.getTime());
calendar.add( Calendar.HOUR,2);//要是相减把2换成-2就好
System.out.println("当前时间加2小时后,时间是:" + calendar.getTime());
JDK1.8新时间API的出现:
JDK 1.0 中包含了一个 java.util.Date 类,但是它的大多数方法已经在 JDK 1.1 引入 Calendar 类之后被弃用了。而 Calendar 并不比 Date 好多少。
它们面临的问题是:
1.可变性:像日期和时间这样的类应该是不可变的。
2.偏移性:Date 中的年份是从 1900 开始的,而月份都从 0 开始。
3.格式化:格式化只对Date 有用, Calendar 则不行。
此外,它们也不是线程安全的;不能处理闰秒等。
总结:总结:对日期和时间的操作一直是Java 程序员最痛苦的地方之一。
新时间API:
- 第三次引入的 API 是成功的, 并且 Java 8 中引入的 java.time API 已经纠正了过去的缺陷,将来很长一段时间内它都会为我们服务。
- Java 8 吸收了 Joda Time 的精华,以一个新的开始为 Java 创建优秀的 API 。新的 java.time 中包含了所有关于 本地日期( LocalDate )、本地时间LocalTime )、本地日期时间 LocalDateTime )、时区 ZonedDateTime和持续时间( Duration )的类 。历史悠久的 Date 类新增了 toInstant() 方法,用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大简化了日期时间和本地化的管理。
其中比较重要的三个类
LocalDate 、 LocalTime 、 LocalDateTime,它们的实例化时不可变的对象
两个常使用的方法:
//!now():获取当前的日期、时间、日期+时间
LocalDate localDate = LocalDate.now();//获取当前年月日
LocalTime localTime = LocalTime.now();//获取当前时间
LocalDateTime localDateTime = LocalDateTime.now();//获取当前年月日与时间
//!of():设置指定的年、月、日、时、分、秒。没有偏移量 而
LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 6, 13, 23, 43);
System.out.println(localDateTime1);//2020-03-10
//在java.util.Date下已过时的构造器时有偏移量的
Date date1 = new Date(2020 - 1900, 9 - 1, 8);
System.out.println(date1);//Tue Sep 08 00:00:00 GMT+08:00 2020
还有其他方法如下:
- java.time.format.DateTimeFormatter类
*jdk1.8后格式化与解析日期或时间的类,类似于SimpleDateFormat
@Test
public void test3() {
// 方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//格式化:日期-->字符串
LocalDateTime localDateTime = LocalDateTime.now();
String str1 = formatter.format(localDateTime);
System.out.println(localDateTime);
System.out.println(str1);//2020-03-10T22:08:38.437
//解析:字符串 -->日期
TemporalAccessor parse = formatter.parse("2020-03-10T22:08:38.437");
System.out.println(parse);
// 方式二:
// 本地化相关的格式。如:ofLocalizedDateTime()
// FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT :适用于LocalDateTime
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
//格式化
String str2 = formatter1.format(localDateTime);
System.out.println(str2);//2020年3月10日 下午10时09分13秒
// 本地化相关的格式。如:ofLocalizedDate()
// FormatStyle.FULL / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT : 适用于LocalDate
DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
//格式化
String str3 = formatter2.format(LocalDate.now());
System.out.println(str3);//2020-3-10
// 重点: 方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化
String str4 = formatter3.format(LocalDateTime.now());
System.out.println(str4);//2020-03-10 10:09:13
//解析 字符串转日期时间
TemporalAccessor accessor = formatter3.parse("2020-03-10 10:09:13");
System.out.println(accessor);
}
还有一些其他API也可以了解一下
总结来说:
- 在JDK8.0后的JDK给程序员们有了一个更好的时间API,在此之前是一个头大的问题!