形式1:日期对象
形式2:时间毫秒值
/**
* 目标:学会使用 Date 类处理时间,获取时间的信息
*/
public class DateTest {
public static void main(String[] args) {
// 1、创建一个 Date 类的对象:代表系统此刻日期时间对象
Date date = new Date();
System.out.println(date);
// 2、获取时间毫秒值
long time = date.getTime();
System.out.println(time);
// long time1 = System.currentTimeMillis();
// System.out.println(time1);
}
}
计算出当前时间往后走 1 小时 121 秒之后的时间是多少。
/**
* 目标:学会使用 Date 类处理时间,获取时间的信息
*/
public class DateTest {
public static void main(String[] args) {
//计算出当前时间往后走 1 小时 121 秒之后的时间是多少。
// 1、获取当前时间
Date date1 = new Date();
System.out.println(date1);
// 2、当前时间往后走 1小时 121s
long time2 = System.currentTimeMillis();
time2 += (60 * 60 + 121) * 1000;
// 3、把时间毫秒值转换成对应的日期对象
// Date date2 = new Date(time2);
// System.out.println(date2);
Date date3 = new Date();
date3.setTime(time2);
System.out.println(date3);
}
}
控制台输出
/**
* 目标:simpleDateFormat 简单日期格式化类的使用
* 格式化时间
* 解析时间
*/
public class SimpleDateFormatTest1 {
public static void main(String[] args) {
//1、日期对象
Date date = new Date();
System.out.println(date);
//2、格式化这个日期对象(指定最终格式化的形式)
//EEE 代表周几,a 代表当前时间是上午还是下午
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
//3、开始格式化日期对象成为喜欢的字符串形式
String rs = simpleDateFormat.format(date);
System.out.println(rs);
System.out.println("------------------------------");
//4、格式化时间毫秒值
//需求:请问121秒后的时间是多少?
long time1 = System.currentTimeMillis() + 121 * 1000;
String rs2 = simpleDateFormat.format(time1);
System.out.println(rs2);
}
}
请计算出 2021年08月06日11点11分11秒,往后走 2天14小时49分06 秒后的时间是多少。
/**
* 目标:学会使用 SimpleDateFormat 解析字符串时间成为日期对象。
* 请计算出 2021年08月06日11点11分11秒,往后走 2天14小时49分06 秒后的时间是多少。
*/
public class SimpleDateFormatTest2 {
public static void main(String[] args) throws ParseException {
// 1、把字符串时间拿到程序中去
String dateStr = "2021年08月06日 11:11:11";
// 2、把字符串时间解析成日期对象(本节的重点):形式必须与被解析时间的形式完全一样,否则运行时解析报错!
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date d = simpleDateFormat.parse(dateStr);
// 3、往后走2天14小时49分06秒
long time = d.getTime() + (2L*24*60*60 +14*60*60 + 49*60 +6) * 1000;
// 4、格式化这个时间毫秒值就是结果
System.out.println(simpleDateFormat.format(time));
}
}
需求
分析
/**
* 案例 秒杀活动
* - 小贾下单并付款的时间为:2022年11月11日 0:03:47
* - 小皮下单并付款的时间为:2020年11月11日 0:10:11
* - 用代码说明这两位同学有没有参加上秒杀活动?
*/
public class SimpleDateFormatTest3 {
public static void main(String[] args) throws ParseException {
// 1、开始 和 结束 时间
String startTime = "2022-11-11 00:00:00";
String endTime = "2022-11-11 00:10:00";
// 2、小贾 小皮
String xiaoJia = "2022-11-11 00:03:47";
String xiaoPi = "2022-11-11 00:10:11";
// 3、解析他们的时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d1 = simpleDateFormat.parse(startTime);
Date d2 = simpleDateFormat.parse(endTime);
Date d3 = simpleDateFormat.parse(xiaoJia);
Date d4 = simpleDateFormat.parse(xiaoPi);
// 4、判断 小贾 小皮 是否秒杀成功
if (d3.after(d1) && d3.before(d2)){
System.out.println("小贾秒杀成功,可以发货了!");
}else {
System.out.println("小贾秒杀失败!");
}
if (d4.after(d1) && d4.before(d2)){
System.out.println("小皮秒杀成功,可以发货了!");
}else {
System.out.println("小皮秒杀失败!");
}
}
}
注意:Calendar 是可变日期对象,一旦修改后其对象本身表示的时间将产生变化。
/**
* 掌握 Calendar 日历常用方法
*/
public class CalendarTest {
public static void main(String[] args) {
// 1、拿到系统此刻的日历对象
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
// 2、获取日历的信息: public int get(int field) 获取日期中的某个字段信息。
int year = calendar.get(Calendar.YEAR);//获取年
System.out.println(year);
int month = calendar.get(Calendar.MONTH) + 1;//获取月
System.out.println(month);
int day = calendar.get(Calendar.DATE);//获取天
System.out.println(day);
int days = calendar.get(Calendar.DAY_OF_YEAR);//获取一年的第几天
System.out.println(days);
// 3、 public void set(int field, int value) :修改日期的某个字段信息。
// calendar.set(Calendar.HOUR,12);
// System.out.println(calendar); //一般不去修改,牵一发动全身,影响下面代码
// 4、 public void add(int field, int amount); :为某个字段增加/减少指定的值。
// 请问64天后是什么时间
calendar.add(Calendar.DAY_OF_YEAR,64);//64天以后
calendar.add(Calendar.MINUTE,59);//59分以后
// 5、 public final Date getTime() :拿到此刻日期对象。
Date date = calendar.getTime();
System.out.println(date);//获取64天59分以后的日期
// 6、public long getTimeInMillis() :拿到此刻时间毫秒值
long time = calendar.getTimeInMillis();
System.out.println(time);
}
}
从 Java8 开始,java.time 包提供了新的日期和时间 API,主要涉及的类型有:
新增的 API 严格区分了时刻、本地日期、本地时间,并且,对日期和时间进行运算更加方便。
其次,新的 API 的类型几乎全部是不变类型(和 String 的使用类似),可以放心使用不必担心被修改。
/**
* 掌握 LocalDate
*/
public class Test1LocalDate {
public static void main(String[] args) {
// 1、获取本地日期对象
LocalDate nowDate = LocalDate.now();
System.out.println("今天的日期:" + nowDate);// 今天的日期
// 2、获取年
int year = nowDate.getYear();
System.out.println("year:" + year);
// 3、获取月
int month = nowDate.getMonthValue();
System.out.println("month:" + month);
// 4、获取天
int day = nowDate.getDayOfMonth();
System.out.println("day:" + day);
// 5、获取当年的第几天
int dayOfYear = nowDate.getDayOfYear();
System.out.println("dayOfYear:" + dayOfYear);
// 6、星期
System.out.println(nowDate.getDayOfWeek());//英文 FRIDAY
System.out.println(nowDate.getDayOfWeek().getValue());//数字 5
// 7、月份
System.out.println(nowDate.getMonth());//英文 JUNE
System.out.println(nowDate.getMonth().getValue());//数字 6
System.out.println("----------------------------");
LocalDate bt = LocalDate.of(1991, 11, 11);
System.out.println(bt);//直接传入对应的年月日
System.out.println(LocalDate.of(1991, Month.NOVEMBER,11));
}
}
/**
* 掌握 LocalTime
*/
public class Test2LocalTime {
public static void main(String[] args) {
// 1、获取本地时间对象
LocalTime nowTime = LocalTime.now();
System.out.println("今天的时间:" + nowTime);//今天的时间
// 2、获取时
int hour = nowTime.getHour();
System.out.println("hour:" + hour);
// 3、获取分
int minute = nowTime.getMinute();
System.out.println("minute:" + minute);
// 4、获取秒
int second = nowTime.getSecond();
System.out.println("second:" + second);
// 5、获取纳秒
int nano = nowTime.getNano();
System.out.println("nano:" + nano);
System.out.println("---------------------------");
System.out.println(LocalTime.of(8,20));//时分
System.out.println(LocalTime.of(8,20,30));//时分秒
System.out.println(LocalTime.of(8,20,30,150));//时分秒纳秒
LocalTime mTime = LocalTime.of(8, 20, 30, 150);
System.out.println("-------------------------");
System.out.println(LocalDateTime.of(1991,11,11,8,20));
System.out.println(LocalDateTime.of(1991, Month.NOVEMBER,11,8,20));
System.out.println(LocalDateTime.of(1991, 11,11,8,20,30));
System.out.println(LocalDateTime.of(1991, Month.NOVEMBER,11,8,20,30));
System.out.println(LocalDateTime.of(1991, 11,11,8,20,30,000000150));
System.out.println(LocalDateTime.of(1991, Month.NOVEMBER,11,8,20,30,000000150));
}
}
/**
* 掌握 LocalDateTime
*/
public class Test3LocalDateTime {
public static void main(String[] args) {
// 1、 日期 时间
LocalDateTime nowDateTime = LocalDateTime.now();
System.out.println("今天是:" + nowDateTime);//今天
// 2、年
System.out.println(nowDateTime.getYear());
// 3、月
System.out.println(nowDateTime.getMonthValue());
// 4、日
System.out.println(nowDateTime.getDayOfMonth());
// 5、时
System.out.println(nowDateTime.getHour());
// 6、分
System.out.println(nowDateTime.getMinute());
// 7、秒
System.out.println(nowDateTime.getSecond());
// 8、纳秒
System.out.println(nowDateTime.getNano());
// 9、今年的第几天
System.out.println("dayOfYear:" + nowDateTime.getDayOfYear());
// 10、星期
System.out.println(nowDateTime.getDayOfWeek());
System.out.println(nowDateTime.getDayOfWeek().getValue());
// 11、月份
System.out.println(nowDateTime.getMonth());
System.out.println(nowDateTime.getMonth().getValue());
LocalDate localDate = nowDateTime.toLocalDate();
System.out.println(localDate);
LocalTime localTime = nowDateTime.toLocalTime();
System.out.println(localTime.getHour());
System.out.println(localTime.getMinute());
System.out.println(localTime.getSecond());
}
}
LocalDateTime 综合了 LocalDate 和 LocalTime 里面的方法,所以下面只用 LocalDate 和 LocalTime 来举例。
这些方法返回的是一个新的实例引用,因为 LocalDateTime、LocalDate、LocalTime 都是不可变的。
/**
* 掌握 时间的计算
*/
public class Test4UpdateTime {
public static void main(String[] args) {
LocalTime nowTime = LocalTime.now();
System.out.println(nowTime);//当前时间
System.out.println("--------------------------");
System.out.println(nowTime.minusHours(1));// 1小时前
System.out.println(nowTime.minusMinutes(1));// 1分钟前
System.out.println(nowTime.minusSeconds(1));// 1秒前
System.out.println(nowTime.minusNanos(1));// 1纳秒前
System.out.println("--------------------------");
//不可变对象,每次修改产生新对象!
System.out.println(nowTime);
System.out.println("--------------------------");
LocalDate myDate = LocalDate.of(2018, 9, 5);
LocalDate nowDate = LocalDate.now();
System.out.println("今天是2018-09-06吗?" + nowDate.equals(myDate));
System.out.println(myDate + "是否在" + nowDate + "之前?" + myDate.isBefore(nowDate));
System.out.println(myDate + "是否在" + nowDate + "之后?" + myDate.isAfter(nowDate));
System.out.println("--------------------------");
LocalDate birDate = LocalDate.of(1991, 6, 12);
LocalDate nowDate1 = LocalDate.now();
MonthDay birMd = MonthDay.of(birDate.getMonthValue(), birDate.getDayOfMonth());
MonthDay nowMd = MonthDay.from(nowDate1);
System.out.println("今天是你的生日吗?" + birMd.equals(nowMd));
}
}
JDK8 获取时间戳特别简单,且功能更丰富。Instant 类由一个静态的工厂方法 now() 可以返回当前时间戳。
时间戳是包含日期和时间的,与 java.util.Date 很类似,事实上 Instant 就是类似 JDK8 以前的 Date。
Instant 和 Date 这两个类可以进行转换。
/**
* 掌握时间戳 instant
*/
public class Test5Instant {
public static void main(String[] args) {
// 1、得到一个 Instant 时间戳对象
Instant instant = Instant.now();//世界标准时间 与 中国时间 差 8 小时
System.out.println(instant);
// 2、系统此刻的时间戳怎么办?
Instant instant1 = Instant.now();
System.out.println(instant1.atZone(ZoneId.systemDefault()));
// 3、如何去返回 Date 对象 Instant 和 Date 转换
Date date = Date.from(instant);
System.out.println(date);
Instant instant2 = date.toInstant();
System.out.println(instant2);
}
}
/**
* 掌握 DateTimeForMatter
*/
public class Test6DateTimeFormat {
public static void main(String[] args) {
//本地此刻 日期时间 对象
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
//解析/格式化器
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
//正向格式化
System.out.println(dateTimeFormatter.format(now));
//逆向格式化
System.out.println(now.format(dateTimeFormatter));
//解析字符串时间
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//解析当前字符串时间称为本地日期时间对象
LocalDateTime dateTime = LocalDateTime.parse("2019-11-11 11:11:22", dateTimeFormatter1);
System.out.println(dateTime);
System.out.println(dateTime.getDayOfYear());
}
}
在 Java8 中,我们可以使用以下类来计算日期间隔差异:java.time.Period
主要是 Period 类方法 getYears(),getMonths() 和 getDays() 来计算,只能精确到年月日。
用于 LocalDate 之间的比较。
/**
* 掌握 Period 计算日期间隔
*/
public class Test7Period {
public static void main(String[] args) {
// 当前本地 年月日
LocalDate today = LocalDate.now();
System.out.println(today);
//生日的 年月日
LocalDate birthDate = LocalDate.of(2002, 10, 8);
System.out.println(birthDate);
Period period = Period.between(birthDate, today);//第二个参数减第一个参数
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
}
}
在 Java8 中,我们可以使用以下类来计算时间间隔差异:java.time.Duration
提供了使用基于时间的测量时间量的方法。
用于 LocalDateTime 之间的比较。也可用于 Instant 之间的比较。
/**
* 掌握 Duratio 时间间隔
*/
public class Test8Duration {
public static void main(String[] args) {
//本地日期时间对象。
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
//出生的日期时间对象
LocalDateTime birthDate = LocalDateTime.of(2002, 10, 8, 00, 00, 00, 00);
System.out.println(birthDate);
Duration duration = Duration.between(birthDate,today);//第二个采纳数减第一个参数
System.out.println(duration.toDays());//两个时间差的天数
System.out.println(duration.toHours());//两个时间差的小时数
System.out.println(duration.toMinutes());//两个时间差的分钟数
System.out.println(duration.toMillis());//两个时间差的毫秒数
System.out.println(duration.toNanos());//两个时间差的纳秒数
}
}
/**
* 掌握 ChronoUnit
*/
public class Test9ChronoUnit {
public static void main(String[] args) {
//本地日期时间对象:此刻的
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
//生日时间
LocalDateTime birthDate = LocalDateTime.of(1990, 10, 1, 10, 50, 59);
System.out.println(birthDate);
System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate,today));
System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate,today));
System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birthDate,today));
System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birthDate,today));
System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birthDate,today));
System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birthDate,today));
System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birthDate,today));
System.out.println("相差的毫秒数:" + ChronoUnit.MILLIS.between(birthDate,today));
System.out.println("相差的微秒数:" + ChronoUnit.MICROS.between(birthDate,today));
System.out.println("相差的纳秒数:" + ChronoUnit.NANOS.between(birthDate,today));
System.out.println("相差的半天数:" + ChronoUnit.HALF_DAYS.between(birthDate,today));
System.out.println("相差的十年数:" + ChronoUnit.DECADES.between(birthDate,today));
System.out.println("相差的世纪(百年)数:" + ChronoUnit.CENTURIES.between(birthDate,today));
System.out.println("相差的千年数:" + ChronoUnit.MILLENNIA.between(birthDate,today));
System.out.println("相差的纪元数:" + ChronoUnit.ERAS.between(birthDate,today));
}
}