目录
Date类
1.什么是Date类
java.util包中提供了Date类来封装当前的日期和时间,是距离一个固定时间点的毫秒数(long) 表示一个特定的时间点,Date类提供了两个构造函数来实例化Date对象
Date(); //使用当前的日期和时间来初始化对象
Date(long millis); //这个参数是从1970年1月1号到当前时间为止的毫秒数
2. 为什么需要Date类
有了Date类才能准确的表示时间或者日期
3. Date类演示
package cn.text.day01;
import java.util.Date;
/**
* java.util.Date
* Date中的每一个实例用于表示一个具体的时间,内部维护了一个long值<br>
* 这个值表示UTC时间,也就是公元1970年到Date表示的时间所经过的毫秒值<br>
*
*/
public class DateDemo {
public static void main(String[] args) {
//Thu Jan 21 20:33:57 CST 2021
//默认创建出来表示系统当前的日期以及时间信息
Date date =new Date();
System.out.println(date);//Date重写了toString,用于显示表示的日期和时间
/*
* getTime() 这个方法用于获取一个Date对象所表示的时间点
* 返回的是一个long值
* 表示该时间点距离1970年1月1号之间的毫秒值
* 和System.currentTimeMillis();
*/
long time=date.getTime();
System.out.println(time);
time=System.currentTimeMillis();
System.out.println(time);
/*
* setTime(long time); 对date 设置一个long值表示该日期
*/
//输出明天此时此刻的日期和时间
// time =time+1000*60*60*24;
date.setTime(time);
System.out.println(date);
//Date对象的很多方法都是过时的方法,不推荐使用
//获得年(从1900年开始计时)
int year=date.getYear()+1900;
//获得月(获得的月份数真实月份少1)
int month=date.getMonth()+1;
//获得日
int date1 = date.getDate();
//获得时
int hour = date.getHours();
//获得分
int minute = date.getMinutes();
//获得秒
int second = date.getSeconds();
//获得星期
int day = date.getDay();
System.out.println(year+"年"+month+"月"+date1+"号"+hour+"时"+minute+"分"+second+"秒"+"星期"+day);
}
SimpleDateFormat类
SimpleDateFormat类是一个与语言环境有关的方式来格式化和解析日期的具体类,他允许进行格式化(日期--文本),解析(文本--日期)
日期模式匹配字符串
字符---------含义-------实例
y---------年-------yyyy年-->2018年 yy--18年
M--------月-----MM月----09月:M--9月
d---------日----dd日---->21日;d日--6日
E---------星期
a----AM(上午)PM(下午)
H----24小时制
h-----12小时制
m---分
s--秒
将Date对象转换为字符串
package cn.text.day01;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* java.text.SimpleDateFormat
* 这个类允许按照一个给定的日期格式在Date和String之间相互转换
* @author Administrator
* 将日期格式化为字符串
*
*/
public class SimpleDateFormatTest {
public static void main(String[] args) {
Date now = new Date();
System.out.println("当前时间:"+now);
/**
* 2021-01-21 21:19:02
* 2021--yyyy
* 01--MM
* 21--dd
* 21:19:02 HH:mm:ss
*/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* String format(Date date);
* 将给定的Date表示的日期按照当前的SimpleDateFormat指定的格式转换为字符串
*/
String now1=sdf.format(now);
System.out.println("当前时间:"+now1);
}
}
将字符串转换为Date对象
package cn.text.day01;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 使用simpleDateFormat类将字符串解析为日期类
* 将给定的字符串按照当前SimpleDateFormat指定的日期格式
* 解析为一个Date对象来实际表示该日期类型
* 注意:字符串内容部可控,可能会发生异常
*
*/
public class SimpleDateFormat_parse {
public static void main(String[] args) throws ParseException {
String date = "2021-01-21 21:28:22";
//SimpleDateFormat构造中的日期格式要和字符串str日期格式匹配
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//调用parse方法将日期字符串转换为Date类的对象
Date now=sdf.parse(date);
System.out.println("当前时间:"+now);
}
}
练习
package cn.text.day01;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* 程序启动后,要求用户在控制台输入自己的生日
* 格式为: yyyy-MM-dd 然后经过程序计算
* 输出到今天为止一共活了多少天
* 然后再经过计算,输入其生日到10000天的纪念日
*
*
*/
public class DateTest {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的生日");
String Line = sc.nextLine();
//使用SimpleDateFormat将字符串转换为日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//生日的Date对象
Date birth = sdf.parse(Line);
//今天的日期
Date now = new Date();
//计算毫秒差
long time = now.getTime()-birth.getTime();
//将毫秒换算成天
time = time/1000/60/60/24;
System.out.println("恭喜您,一共活了"+time+"天!请继续保持");
//算出出生10000天的纪念日是那天
time = birth.getTime(); //获得生日的时间偏移量
//在生日的偏移量上加10000天作为纪念日
time = time+1000L*60*60*24*10000;
Date date = new Date(time);
//将Date对象转换为字符串对象
Line = sdf.format(date);
System.out.println("您出生10000天的纪念日为:"+Line);
}
}
Calendar类
Java.util.Calendar类 用于封装日历信息,器主要的作用在于解压对时间进行运行
package cn.text.day01;
import java.util.Calendar;
import java.util.Date;
/**
* java.util.Calendar
* 日历类,用于计算时间,操作时间使用
* Calendar类是一个抽象类,只规定了操作时间相关的方法的定义,并没有具体的实现
* 常用的实现类:GregorianCalender类
*
*/
public class CalendarDemo {
public static void main(String[] args) {
//Calendar提供了一个静态方法getInstance
//这个方法可以根据当前系统所在地区返回一个合适的日历实现类
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getClass().getName());
/**
* Calendar--Date
* Date getTime()
* Calendar提供了一个getTime方法可以将表示的时间以Date形式返回
*/
Date date=calendar.getTime();
System.out.println(date);
/**
* void setTime(Date date);
* Calendar类中的setTime方法允许一个Date类型的对象赋值
*/
Date d = new Date(0);
calendar.setTime(d);
System.out.println(calendar.toString());
}
}
Calendar对象获取日期
Calendar提供了一种通用的获取时间分量的方式
int get(int field);
利用这个方法可以通过对不同的时间分量获取相应的值,Calendar对不同的时间分量提供了相应的常量值,我们在使用get方法获取的时候,参数就应该使用对应的常量作为时间分量
package cn.text.day02;
import java.util.Calendar;
/**
* 从Calendar类中获取日期信息
* Calendar类提供了一个通用的获取时间分量的方式
* int get(int field);
* @author Administrator
*
*/
public class CalendarDemo01 {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
/**
* int get(int field);
* 这个get方法能够返回当前日期的各种信息(年,月,日,时,分,秒)
* 通过参数field指定获取日期信息中的那一个
* Calendar类中定义了很多的常量值,可以使用定义好的常量来获取指定的信息
*/
//获取年份
int year=cal.get(Calendar.YEAR);
System.out.println("当前的年份:"+year);
//获取月份
/**
* 月是从0开始,也就是0表示的是1月,1表示的是2月
*/
int month=cal.get(Calendar.MONTH)+1;
System.out.println("当前的月份:"+month);
//获得日
int date =cal.get(Calendar.DATE);
System.out.println("当前的日:"+date);
//获得时
int hour = cal.get(Calendar.HOUR);
//获得分
int minute = cal.get(Calendar.MINUTE);
//获得秒
int second = cal.get(Calendar.SECOND);
System.out.println(year+"年"+month+"月"+date+"日"+hour+"时"+minute+"分"+second+"秒");
/**
* Calendar DATE:月中的天
* Calendar DAY_OF_MONTH:月中的天
* Calendar DAY_OF_WEEK:一周的第几天
* Calendar DAY_OF_YEAR:一年中的第几天
*/
String [] date1 = {"日","一","二","三","四","五","六"};
//weekDay值是从周日开始的,初始值是1,需要从数组中获取,所以需要下标-1
int weekDay = cal.get(Calendar.DAY_OF_WEEK)-1; //6
System.out.println("今天是周"+date1[weekDay]);
//获得一个月中的第几天
int monDay = cal.get(Calendar.DAY_OF_MONTH);
System.out.println("已经是本月的第"+monDay+"天");
//获得一年中的第几天
int yearDay = cal.get(Calendar.DAY_OF_YEAR);
System.out.println("已经是本年的第"+yearDay+"天");
/*
* getActualMaximum()
* 获取指定日期信息的最大值Actual
*/
int dd = cal.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println("今年最大天数:"+dd);
int mod = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("本月最大天数:"+mod);
}
}
Calendar对象设置日期
Calendar提供了一种通用的设置时间的方式
void set(int field,int value);
练习:
package cn.text.day02;
import java.util.Calendar;
/**
* 向Calendar类对象赋值日期信息<br>
* Calendar提供了一种通用的设置时间的方式<br>
* void set(int field,int value)<br>
* 对不同的时间分量分别设置不同的值<br>
*
*/
public class CalendarDemo03 {
/**
* @param args
*/
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
System.out.println(cal.getTime());
System.out.println(cal);
/**
* 调整年份 1998-06-05
*
* void set(int filed,int value)<br>
* 第一个参数是日期常量,第二个参数是指<br>
* 注意:对Calendar对象中日期信息的修改,<br>
* 只是修改我们指定的日期信息<br>
*/
cal.set(Calendar.YEAR, 1998);
System.out.println(cal.get(Calendar.YEAR));
System.out.println(cal.getTime());
//调整月
/*
* 月份一月对应的是0,所以如果要获取6月份可以直接赋值为6,虽然通过
* get方法输出常量值的时候是6,但是实际上6所所对应的月份是7月
* 如果要获取6月份,必须-1
*/
cal.set(Calendar.MONTH,5);
System.out.println(cal.getTime());
//修改日
cal.set(Calendar.DATE, 5);
//修改时
cal.set(Calendar.HOUR_OF_DAY, 20);
//修改分
cal.set(Calendar.MINUTE, 8);
//修改秒
cal.set(Calendar.SECOND, 8);
System.out.println(cal.getTime());
}
}
Calendar日期计算
Calendar还允许我们是用统一的方式来对某个时间分量的值进行计算
void add(int field,int amout);
利用这个方法可以为某个时间分量的值加上给定的值
package cn.text.day02;
import java.util.Calendar;
/**
* Calendar类对日期的计算<br>
* void add(int field,int amout);<br>
* 对给定的时间分量加上给定的值,如果给定的值是负数 则就是减去<br>
*
*/
public class CalendarDemo02 {
public static void main(String[] args) {
// 实例化Calendar对象
Calendar cal = Calendar.getInstance();
System.out.println(cal.getTime());
/**
* 查看3年2个月零3天之后的那周的周五是哪天 add<br>
* 查看3年2个月零3天之后的周五 是哪天 使用set<br>
* void add(int field,int amout)<br>
* 第一个参数是增加的日期类型<br>
* 第二个参数是增加的值<br>
* 如果给定的值是负数,则是减去<br>
*/
//年+3年
cal.add(Calendar.YEAR, 3);
System.out.println(cal.getTime());
//月+2月
cal.add(Calendar.MONTH, 2);
System.out.println(cal.getTime());
//天+3月
cal.add(Calendar.DAY_OF_YEAR, 3);
System.out.println(cal.getTime());
//周五
cal.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
System.out.println(cal.getTime());
}
}
新日期
Java8在java.time包中提供了很多的新的API,有两个比较重要的API
Local(本地)--简化了对日期时间的处理,没有时区的问题
Zoned(时区)--通过制定的时区处理时期和时间
在新的java.time包中涵盖了所有处理日期,时间,时区,时刻,过程和时钟的操作
为什么要需要新的日期类
LocalDate/LocalTime 和LocalDateTime
package cn.text.day02;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
/**
* java8新日期类的演示
* 不区分时间的本地时间
* LocalDateTime:年月日时分秒
* LocalDate:年月日
* LocalTime:时分秒
* @author Administrator
*
*/
public class LocalTestDemo {
public static void main(String[] args) {
//获取年月日 时分秒
LocalDateTime currentTime=LocalDateTime.now();
System.out.println("当前时间:"+currentTime);
//只要日期
LocalDate date;
date=LocalDate.now();
date=currentTime.toLocalDate();
System.out.println("当前日期:"+date);
//只要时间
LocalTime time;
time=LocalTime.now();
time=currentTime.toLocalTime();
System.out.println("当前时间:"+time);
//单独获取年
System.out.println("年:"+currentTime.getYear());
//获得月
System.out.println("月:"+currentTime.getMonth());
//获得日
System.out.println("天:"+currentTime.getDayOfMonth());
//获得时
System.out.println("时:"+currentTime.getHour());
//获得分
System.out.println("分:"+currentTime.getMinute());
//获得秒
System.out.println("秒:"+currentTime.getSecond());
//设置年月日 1998-06-05
LocalDateTime date1 = currentTime.withDayOfMonth(5).withMonth(6).withYear(1998);
System.out.println("姐姐生日:"+date1);
//设置日期 由于这些方法返回的是LocalDateTime如果要用LocalDate接收需要使用toLocalDate转换
LocalDate date2=currentTime.withYear(2022).withMonth(2).withDayOfMonth(14).toLocalDate();
System.out.println("日期2:"+date2);
LocalTime date3 =currentTime.toLocalTime().withHour(20).withMinute(24);
System.out.println("时间3:"+date3);
//字符串转换为日期时间
LocalTime date4=LocalTime.parse("20:15:30").withHour(23);
System.out.println("时间4:"+date4);
}
}
支持时区的API
package cn.text.day03;
import java.time.ZoneId;
import java.time.ZonedDateTime;
/**
* Java8新日期演示
* 区分时区的本地时间
*
*/
public class Java8Test {
public static void main(String[] args) {
//获取当前时间日期
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now);
ZoneId id1 = now.getZone();
System.out.println(id1);
//设置时区
ZoneId id = ZoneId.of("Europe/Paris");
System.out.println(id);
//获取当前时区现在的时间
ZonedDateTime znow = now.withZoneSameInstant(id);
System.out.println(znow);
}
}