java与日期相关的类
Date类分别在java.util.Date和java.sql.Date中,接下来分别介绍两个不同包中的类,并介绍它们之间的转换关系
java.util.Date
从jdk的API说明文档中先查看java.util.Date的相关信息
java.util.Date中有无参构造器和带参构造器:
方法 | 说明 | 返回值 |
---|---|---|
toString() | 将此Date对象转换为以下形式的字符串 | 返回String字符串类型的值 |
toGMTString() | 返回一个日期,该日期用格林威治标准时间 (GMT) 表示并已被转换为字符串 | 返回String字符串类型的值 |
toLocaleString() | 获取本地日期和时间 | 返回String字符串类型的值 |
getYear() | 获取年份,返回的值需要加上1900为现在的年份 | 返回int类型的值 |
getMonth() | 获取月份,会比数据中的月份少1,这里需要进行加 1 操作。 | 返回int类型的值 |
getTime() | 返回此Date对象表示的自格林尼治标准时间1970年1月1日00:00:00以来的毫秒数。 | 返回的是毫秒单位的long数据 |
System类在java.lang.System中,其中有currentTimeMillis()方法,由于这个这个方法被static修饰,所以可以直接使用类名.方法名
的格式调用,它的作用是返回当前时间(以毫秒为单位),返回的是long类型的数据。
package Test;
import java.util.Date;
public class Test01 {
public static void main(String[] args) {
Date date = new Date();//调用java.util.Date中的无参构造器,创建实例化对象date
System.out.println(date);
System.out.println(date.toString());
System.out.println(date.toGMTString());//中间带横线的是过期方法 过时方法
System.out.println(date.toLocaleString());
System.out.println(date.getYear());//121+1900=2021
System.out.println(date.getMonth());//4+1 = 5
System.out.println(date.getTime());//1620543328553
System.out.println(System.currentTimeMillis());//1620543497996
//currentTimeMillis()是静态的,可以使用类名.方法名直接调用
//public static native long currentTimeMillis();本地方法,这个方法可以衡量算法所用的时间
long startTime = System.currentTimeMillis();
for(int i = 0 ;i < 100000;i++){
System.out.println(i);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
}
java.sql.Date
JDK的API说明文档中查看java.sql.Date类的相关信息,比如说java.sql.Date的继承关系和实现的接口
java.sql.Date的构造器如下:
package Test;
import java.sql.Date;
public class Test02 {
public static void main(String[] args) {
Date d = new Date(1620543891315L);
System.out.println(d);
/*
* java.sql.Date和java.util.Date的区别
* java.util.Date:年月日 时分秒
* java.sql.Date:年月日
* java.sql.Date和java.util.Date的联系,java.sql.Date继承了java.util.Date类
* */
java.util.Date date = new Date(1620543891315L);
//util.Date---->sql.Date
//方式一:向下转型
Date date1 = (Date) date;
//方式二:利用构造器
Date date2 = new Date(date.getTime());
//sql--->util
java.util.Date date3 = d;
//String--->sql.Date
Date date4 = Date.valueOf("2019-3-8");
}
}
java.sql.Date继承了java.util.Date,所以可以利用util.Date向下转型转到sql.Date,从而实现util.Date转换到sql.Date
java.sql.Date的构造器:
Date d = new Date(1620543891315L);
在IDEA中查看它的对应的源码:
java.text下的常用类
package com.zhz.Test;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test02 {
public static void main(String[] args) {
// 日期的转换
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/*
* public class SimpleDateFormat extends DateFormat
* SimpleDateFormat是子类DateFormat(是父类,还是一个抽象类)
*/
// String-->Date
try {
Date d = df.parse("2019-4-6 12:23:54");
System.out.println(d);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Date-->String
String format = df.format(new Date());
System.out.println(format);
Date date = new Date();
System.out.println(date.toString());
System.out.println(date.toGMTString());
System.out.println(date.toLocaleString());
}
}
- java.text.SimpleDateFormat
java.text.SimpleDateFormat继承自 java.text.DateFormat类
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
调用了 java.text.SimpleDateFormat的带参构造器
总结java.textSimpleDateFormat类中的几个常用的方法:
方法 | 说明 | 返回值 |
---|---|---|
parse() | 解析字符串中的文本以产生日期。 | 返回一个Date日期类型的值 |
format() | 将给定的Date格式化为日期/时间字符串,并将结果附加到给定的StringBuffer。 | 返回StringBuffer类型的值(后面的文章中会提到) |
java.textSimpleDateFormat中的parse()方法使用的时候会主动抛出异常,可以使用try-catch语句进行接收:
java.util.中与日期相关的类
package com.zhz.Test;
import java.sql.Date;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class Test03 {
public static void main(String[] args) {
Calendar cal = new GregorianCalendar();
Calendar cal2 = Calendar.getInstance();
System.out.println(cal);
// 常用的方法:get方法 传入的参数 Calendar中定义的常量
System.out.println(cal.get(Calendar.YEAR));
System.out.println(cal.get(Calendar.MONTH));
System.out.println(cal.get(Calendar.DATE));
System.out.println(cal.get(Calendar.DAY_OF_WEEK));
System.out.println(cal.getActualMaximum(Calendar.DATE));// 获取当月日期的最大天数
// set方法:可以改变Calendar中的内容
cal.set(Calendar.YEAR, 1900);
cal.set(Calendar.MONTH, 3);
cal.set(Calendar.DATE, 16);
System.out.println(cal);
// String---》Calendar
// 分解:
// String-->sql.Date
Date date = Date.valueOf("2020-4-5");
// sql.Date-->Calendar
cal.setTime(date);
System.out.println(cal);
}
}
- java.util.GregorianCalendar
Calendar cal = new GregorianCalendar();
GregorianCalendar类中有三个常用的方法分别是get()方法和set()方法和getActualMaximum():
get()方法中有几个参数,传入的参数 Calendar中定义的常量:
set()方法:可以改变Calendar中的内容
cal.set(Calendar.YEAR, 1900);
cal.set(Calendar.MONTH, 3);
cal.set(Calendar.DATE, 16);
getActualMaximum()方法:考虑给定的时间值和getFirstDayOfWeek,getMinimalDaysInFirstWeek,getGregorianChange和getTimeZone方法的当前值,返回此日历字段可能具有的最大值,返回的是一个int类型的值
System.out.println(cal.getActualMaximum(Calendar.DATE));// 获取当月日期的最大天数
String类型的日期转换成Calendar类型的日期,需要分解为两个步骤:
先从String–>sql.Date,再从sql.Date–>Calendar类
// String---》Calendar
// 分解:
// String-->sql.Date
Date date = Date.valueOf("2020-4-5");
// sql.Date-->Calendar
cal.setTime(date);
System.out.println(cal);
- java.util.Calendar
java.util.Calendar继承了java.lang.Object类
package com.zhz.Test;
import java.sql.Date;
import java.util.Calendar;
import java.util.Scanner;
public class Test04 {
public static void main(String[] args) {
// String-->Calendar
// 录入日期的String
Scanner sc = new Scanner(System.in);
System.out.println("请输入您想要查看的日期:(请按照2012-5-6的格式书写):");
String strDate = sc.next();
// System.out.println(strDate);
// String-->Calendar
// String-->Date
Date date = Date.valueOf(strDate);
// Date-->Calendar
Calendar cal = Calendar.getInstance();
// 星期的提示
System.out.println("日\t一\t二\t三\t四\t五\t六");
// 获取本月的最大天数
int maxDay = cal.getActualMaximum(Calendar.DATE);
// 获取当前日期中的日
int nowDay = cal.get(Calendar.DATE);
// 将日期调为本月的1号
cal.set(Calendar.DATE, 1);
// 获取这个1号是本周的第几天
int num = cal.get(Calendar.DAY_OF_WEEK);
// System.out.println(num);
// 前面空出来的天数是:
int day = num - 1;
// 在日期前将空格打印出来
for (int i = 0; i <= day; i++) {
System.out.println("\t");
}
// 引入一个计数器
int count = 0;
// 空出来的日子也要放入计数器
count = count + day;
// 遍历:从1号开始遍历,遍历到maxDay
for (int i = 1; i <= maxDay; i++) {
if (i == nowDay) {// 如果遍历的i和当前日子一样的话,后面多加一个*
System.out.print(i + "*" + "\t");
} else {
System.out.print(i + "\t");
}
count++;
if (count % 7 == 0) {
System.out.println();
}
}
}
}
接下来介绍java.util.Calendar类中的常用的方法:
方法名 | 说明 | 返回值 |
---|---|---|
getInstance() | 获取使用指定时区和默认区域设置的日历。返回的日历基于给定时区中的当前时间 | 返回的是一个Calendar类型的值。(这个方法被static修饰,所以可以直接使用类名.方法名 的形式进行调用) |
getActualMaximum() | 返回给定此日历的时间值时,指定日历字段可能具有的最大值。 | 返回一个int类型的值 |
java.time.中与时间相关的类
- java.time.LocalDate
- java.time.LocalDateTime
java.time.LocalDateTime类中的常用的方法有:
方法 | 说明 | 返回值 |
---|---|---|
now() | 从默认时区的系统时钟获取当前日期。 | 返回的是LocalDateTime类型的值,由于now()方法被static修饰,所以可以使用类名.方法名 的形式进行调用 |
- java.time.LocalTime
- java.time.LocalDateTime
- java.time.LocalDate
将这三个类放在一起讲,接下来描述它们的共有方法:
方法 | 说明 | 返回值 |
---|---|---|
now() | 获取当前的日期 时间 日期+时间 | 返回当前类的值,由于被static修饰,可以直接使用类名.方法名 调用 |
of() | 设置指定的日期 时间 日期+时间 | 返回当前类的值,由于被static修饰,可以直接使用类名.方法名 调用 |
withMonth() | 返回此LocalDateTime的副本,其中更改了每年的月份。 | 返回当前类的值,除了withMonth()方法还有一系列的with方法 |
getYear() | 此方法返回年份的原始int值。 | 返回int类型的值,除了getYear还有一系列的get方法 |
plusMonths() | 其中添加了指定的月数。 | 返回当前所在类的值,除了plusMonths()方法还有一系列的plus方法 |
minusDays() | 返回减去指定的天数。 | 返回当前类的值,除了minusDays()方法还有一系列的minus方法 |
package com.zhz.Test;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Test06 {
public static void main(String[] args) {
// 1.完成实例化
// 方法1:now()-->获取当前的日期 时间 日期+时间
LocalDate localDate = LocalDate.now();
System.out.println(localDate);
LocalTime localTime = LocalTime.now();
System.out.println(localTime);
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
// 方法2:of()-->设置指定的日期 时间 日期+时间
LocalDate of = LocalDate.of(2010, 5, 6);
System.out.println(of);
LocalTime of1 = LocalTime.of(12, 35, 56);
System.out.println(of1);
LocalDateTime of2 = LocalDateTime.of(1890, 12, 23, 13, 24, 12);
System.out.println(of2);
// ----LocalDateTime----
// 一系列get方法,用来获取信息
System.out.println(localDateTime.getYear());
System.out.println(localDateTime.getMonth());
System.out.println(localDateTime.getMonthValue());
System.out.println(localDateTime.getDayOfMonth());
System.out.println(localDateTime.getDayOfWeek());
System.out.println(localDateTime.getHour());
System.out.println(localDateTime.getMinute());
System.out.println(localDateTime.getSecond());
//常用的with方法
LocalDateTime localDateTime2 = localDateTime.withMonth(8);
System.out.println(localDateTime);
System.out.println(localDateTime2);
//提供了加减的操作
//加操作
LocalDateTime localDateTime1 = localDateTime.plusMonths(4);
System.out.println(localDateTime);
System.out.println(localDateTime1);
//减操作
LocalDateTime localDateTime3 = localDateTime.minusMonths(5);
System.out.println(localDateTime);
System.out.println(localDateTime3);
}
}
package Test;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
public class Test05 {
public static void main(String[] args) {
//格式化类:DateTimeFormatter
//方式一:预定义的标准格式 比如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
DateTimeFormatter df1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//df1就可以帮助我们完成LocalDateTime和String之间的类型转换
//LocalDateTime-->String
LocalDateTime now = LocalDateTime.now();
String str = df1.format(now);
System.out.println(str);
//String-->LocalDateTime
TemporalAccessor parse = df1.parse("2021-05-11T17:16:47.285");
System.out.println(parse);
//方式二:本地化相关的格式,比如ofLocalizedDateTime
//参数:FormatStyle.LONG/FormatStyle.MEDIUM/FormatStyle.SHORT
//FormatStyle.LONG
DateTimeFormatter df2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
//LocalDateTime-->String
LocalDateTime now1 = LocalDateTime.now();
String str2 = df2.format(now1);
System.out.println(str2);
//String-->LocalDateTime
TemporalAccessor parse1 = df2.parse("20-6-15 下午3:18");
System.out.println(parse1);
//方式三:自定义的格式:ofPattern("yyyy-MM-dd hh:mm:ss")
DateTimeFormatter df3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//LocalDateTime-->String
LocalDateTime now2 = LocalDateTime.now();
String format = df3.format(now2);
System.out.println(format);
//String-->LocalDateTime
TemporalAccessor parse2 = df3.parse("2020-06-15 03:22:03");
System.out.println(parse2);
}
}