import org.junit.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
public class DateSimpleTest {
/**
* Date常用方法
*
* 获取时间 时间-><-时间戳
*/
@Test
public void test1() {
//获取系统当前时间
Date date1 = new Date();
System.out.println("date = " + date1);
//获取时间的时间戳
long time = date1.getTime();
//加3秒后的时间值
time += 3 * 1000;
Date date2 = new Date(time);
System.out.println("date2 = " + date2);
//把时间戳转换为时间
Date date3 = new Date();
date3.setTime(time);
System.out.println("date3 = " + date3);
}
/**
* SimpleDateFormat 常用方法
*
* 日期->文本 文本->时间
*/
@Test
public void test2() throws ParseException {
//日期->文本
Date date = new Date();
long time = date.getTime();
System.out.println("time = " + time);
//格式化时间对象 和时间毫秒值 EEE表示周几 a表示上午或下午
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
String format = sdf.format(date);
System.out.println("format = " + format);
//时间戳转文本
String format1 = sdf.format(time);
System.out.println("format1 = " + format1);
//文本->时间
String dateStr = "2023年9月11日 14:09:12";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date parse = simpleDateFormat.parse(dateStr);
System.out.println("parse = " + parse);
}
/**
* Date和SimpleDateFormat综合测试
*
* 测试秒杀活动时间
*
* @throws ParseException
*/
@Test
public void test3() throws ParseException {
//小贾的参加时间 2023年11月11日 0:01:18 参加成功
String xj = "2023年11月11日 0:01:18";
System.out.println("小贾是否成功参加 = " + whetherToParticipate(xj));
//小皮的参加时间 2023年11月11日 0:10:51 参加失败
String xp = "2023年11月11日 0:10:51";
System.out.println("小皮是否成功参加 = " + whetherToParticipate(xp));
}
/**
* 判断是否参加上了秒杀活动
* 秒杀开始时间 2023年11月11日 00:00:00
*
秒杀结束时间 2023年11月11日 00:10:00
*/
public static String whetherToParticipate(String dateStr) throws ParseException {
//格式化
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//开始时间
String startDateStr = "2023年11月11日 00:00:00";
Date startDate = simpleDateFormat.parse(startDateStr);
//结束时间
Date endDate = new Date(startDate.getTime() + 600 * 1000);
//参加时间
Date timeOfParticipation = simpleDateFormat.parse(dateStr);
//获取时间戳 并比较
long startDateTime = startDate.getTime();
long endDateTime = endDate.getTime();
long timeDateOfIn = timeOfParticipation.getTime();
return timeDateOfIn >= startDateTime && timeDateOfIn <= endDateTime ? "参加成功" : "参加失败";
}
/**
* Calendar 代表当前系统此刻对应的日历
* 可以单独获取与修改时间中的 年 月 日 时 分 秒
*/
@Test
public void test4() {
//获取日历对象
Calendar calendar = Calendar.getInstance();
System.out.println("某月的第几天 = " + calendar.get(Calendar.DATE));
System.out.println("某月的第几天 = " + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("某年的第几天 = " + calendar.get(Calendar.DAY_OF_YEAR));
System.out.println("某月中第几周 1号起就是第1周,8号起就是第2周 = " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
System.out.println("某周的第几天 = " + calendar.get(Calendar.DAY_OF_WEEK));
System.out.println("某天的第几个小时 = " + calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("日历中的年 = " + calendar.get(Calendar.YEAR));
//获取时间
Date time = calendar.getTime();
//获取时间戳
long timeInMillis = calendar.getTimeInMillis();
//设置年
calendar.set(Calendar.YEAR, 2022);
System.out.println("设置为2022年 = " + calendar.getTime());
//设置日期
calendar.set(Calendar.DATE, 2);
System.out.println("设置为一个月的2号 = " + calendar.getTime());
//加1年
calendar.add(Calendar.YEAR, 1);
System.out.println("加1年 = " + calendar.getTime());
//减3年
calendar.add(Calendar.YEAR, -3);
System.out.println("减3年 = " + calendar.getTime());
}
/**
* LocalDate 年 月 日
*/
@Test
public void test5() {
System.out.println("-------------获取年月日信息 get--------------");
//获取本地日期信息
LocalDate now = LocalDate.now();
System.out.println("当前日期 = " + now);
System.out.println("获取年 = " + now.getYear());
System.out.println("获取月 = " + now.getMonthValue());
System.out.println("获取日 = " + now.getDayOfMonth());
System.out.println("获取一年中的第几天 = " + now.getDayOfYear());
System.out.println("获取周几 = " + now.getDayOfWeek().getValue());
System.out.println("-------------修改日期信息 with--------------");
LocalDate now1 = LocalDate.now();
System.out.println("当前日期 = " + now1);
System.out.println("修改为2020年 = " + now1.withYear(2020));
System.out.println("修改为1月 = " + now1.withMonth(1));
System.out.println("修改为1号 = " + now1.withDayOfMonth(1));
System.out.println("修改为一年中的第365天 = " + now1.withDayOfYear(365));
System.out.println("-------------对日期信息加多少 plus--------------");
LocalDate now2 = LocalDate.now();
System.out.println("当前日期 = " + now2);
System.out.println("加一年 = " + now2.plusYears(1));
System.out.println("加一月" + now2.plusMonths(1));
System.out.println("加一周" + now2.plusWeeks(1));
System.out.println("加一天" + now2.plusDays(1));
System.out.println("-------------对日期信息减多少 minus--------------");
LocalDate now3 = LocalDate.now();
System.out.println("当前日期 = " + now3);
System.out.println("减一年" + now3.minusYears(1));
System.out.println("减一个月" + now3.minusMonths(1));
System.out.println("减一周" + now3.minusWeeks(1));
System.out.println("减一天" + now3.minusDays(1));
System.out.println("-------------获取指定日期的LocalDate对象 of--------------");
LocalDate of = LocalDate.of(2021, 11, 11);
System.out.println("指定日期 = " + of);
System.out.println("-------------判断两个日期大小 is--------------");
LocalDate of1 = LocalDate.of(2020, 11, 11);
LocalDate of2 = LocalDate.of(2019, 11, 11);
//false
System.out.println("of1与of2是否相等? = " + of1.isEqual(of2));
//false
System.out.println("of1在of2之前? = " + of1.isBefore(of2));
//true
System.out.println("of1在of2之后? = " + of1.isAfter(of2));
}
/**
* LocalTime 时 分 秒 纳秒
*/
@Test
public void test6() {
System.out.println("-------------获取 时 分 秒 毫秒 纳秒信息 get--------------");
//获取本地时间信息
LocalTime now = LocalTime.now();
System.out.println("当前时间 = " + now);
System.out.println("获取时 = " + now.getHour());
System.out.println("获取分 = " + now.getMinute());
System.out.println("获取秒 = " + now.getSecond());
System.out.println("获取纳秒 = " + now.getNano());
System.out.println("-------------修改时间信息 with--------------");
LocalTime now1 = LocalTime.now();
System.out.println("当前时间 = " + now1);
System.out.println("修改为13时 = " + now1.withHour(13));
System.out.println("修改为5分 = " + now1.withMinute(5));
System.out.println("修改为12秒 = " + now1.withSecond(12));
System.out.println("修改为1000纳秒 = " + now1.withNano(1000));
System.out.println("-------------对时间信息加多少 plus--------------");
LocalTime now2 = LocalTime.now();
System.out.println("当前时间 = " + now2);
System.out.println("加一时 = " + now2.plusHours(1));
System.out.println("加一分" + now2.plusMinutes(1));
System.out.println("加一秒" + now2.plusSeconds(1));
System.out.println("加100纳秒" + now2.plusNanos(100));
System.out.println("-------------对时间信息减多少 minus--------------");
LocalTime now3 = LocalTime.now();
System.out.println("当前时间 = " + now3);
System.out.println("减一时" + now3.minusHours(1));
System.out.println("减一分钟" + now3.minusMinutes(1));
System.out.println("减一秒" + now3.minusSeconds(1));
System.out.println("减100毫秒" + now3.minusNanos(100));
System.out.println("-------------获取指定时间的LocalDate对象 of--------------");
LocalTime of = LocalTime.of(12, 11, 11, 1000);
System.out.println("指定时间 = " + of);
System.out.println("-------------判断两个时间大小 is--------------");
LocalTime of1 = LocalTime.of(12, 11, 11);
LocalTime of2 = LocalTime.of(11, 11, 11);
//false
System.out.println("of1与of2是否相等? = " + of1.equals(of2));
//false
System.out.println("of1在of2之前? = " + of1.isBefore(of2));
//true
System.out.println("of1在of2之后? = " + of1.isAfter(of2));
}
/**
* LocalDateTime 年 月 日 时 分 秒 纳秒
*/
@Test
public void test7() {
System.out.println("-------------获取时间日期 get--------------");
LocalDateTime now = LocalDateTime.now();
System.out.println("当前日期时间 = " + now);
System.out.println("获取年 = " + now.getYear());
System.out.println("获取月 = " + now.getMonth().getValue());
System.out.println("获取月 = " + now.getMonthValue());
System.out.println("获取一年中的第几天 = " + now.getDayOfYear());
System.out.println("获取几号 = " + now.getDayOfMonth());
System.out.println("获取周几 = " + now.getDayOfWeek().getValue());
System.out.println("获取小时 = " + now.getHour());
System.out.println("获取分 = " + now.getMinute());
System.out.println("获取秒 = " + now.getSecond());
System.out.println("获取纳秒 = " + now.getNano());
System.out.println("-------------修改时间信息 with--------------");
System.out.println("now.withYear(2002) = " + now.withYear(2002));
System.out.println("now.withMonth(2) = " + now.withMonth(2));
System.out.println("-------------时间信息加多少 plus--------------");
System.out.println("now.plusYears(1) = " + now.plusYears(1));
System.out.println("-------------时间信息减多少 minus--------------");
System.out.println("now.minusYears(1) = " + now.minusYears(1));
System.out.println("-------------获取指定时间信息 of--------------");
LocalDateTime of1 = LocalDateTime.of(2022, 12, 12, 12, 12, 12, 10000);
LocalDateTime of2 = LocalDateTime.of(2021, 11, 11, 11, 12, 12, 10000);
System.out.println("of1 = " + of1);
System.out.println("of2 = " + of2);
System.out.println("-------------比较时间信息 is--------------");
System.out.println("of1与of2相等? = " + of1.isEqual(of2));
System.out.println("of1在of2之前? = " + of1.isBefore(of2));
System.out.println("of1在of2之后? = " + of1.isBefore(of2));
System.out.println("-------------把时间信息转换成LocalDate to--------------");
System.out.println("now.toLocalDate() = " + now.toLocalDate());
System.out.println("-------------把时间信息转换成LocalTime to--------------");
System.out.println("now.toLocalTime() = " + now.toLocalTime());
System.out.println("-------------LocalDate 和 LocalTime 合成一个LocalDateTime--------------");
LocalDate localDate = now.toLocalDate();
LocalTime localTime = now.toLocalTime();
LocalDateTime of = LocalDateTime.of(localDate, localTime);
System.out.println("合成的LocalDateTime = " + of);
}
/**
* ZoneId 时区
*/
@Test
public void test8() {
// 世界各国与各地区的经度不同,各地区的时间也不同,因此会划分为不同的时区 全世界总共有24个时区
// 0时区(是本初子午线对应的位置)时间被称为 世界标准时间(UTC)
// 中国标准时间 = 世界标准时间(UTC) + 8 小时
//ZoneId 代表时区Id
//为了方便记忆,通常会用一个时区里的标志性城市代表这个时区 格式:州名/城市名 或者是 国家名/城市名
//我国的ZoneId 可以使用 Asia/Shanghai Asia/Beijing Asia/Chongqing
//美国的ZoneId 可以使用 America/New_York
System.out.println("-------------获取系统的默认时区--------------");
System.out.println("当前系统默认时区 = " + ZoneId.systemDefault());
System.out.println("-------------获取一个指定时区--------------");
ZoneId zoneId = ZoneId.of("America/New_York");
System.out.println("纽约的ZoneId = " + zoneId);
System.out.println("-------------获取Java支持的所有时区ID--------------");
System.out.println("所有时区ID = " + ZoneId.getAvailableZoneIds());
}
/**
* ZonedDateTime 带时区的时间
*/
@Test
public void test9() {
System.out.println("-------------获取系统的默认时区的ZonedDateTime对象--------------");
ZonedDateTime now1 = ZonedDateTime.now();
System.out.println("now1 = " + now1);
System.out.println("-------------获取指定时区的ZonedDateTime对象--------------");
ZonedDateTime now = ZonedDateTime.now(ZoneId.of("America/New_York"));
System.out.println("now = " + now);
System.out.println("-------------获取世界标准时间--------------");
ZonedDateTime now2 = ZonedDateTime.now(Clock.systemUTC());
System.out.println("now2 = " + now2);
//ZonedDateTime与LocalDateTime用法基本一致 包括 get with plus minus 等
}
/**
* 代替Date
* Instant:时间线上的某个时刻/时间戳
* 通过获取Instant的对象可以拿到此刻的时间,该时间由两部分组成:从1970-01-01 00:00:00开始走到此刻的总秒数 + 不够1秒的纳秒数
* 作用:可以用来记录代码的执行时间,或用于记录用户操作某个事件的时间点。
* 传统的Date类,只能精确到毫秒,并且是可变对象;
* 新增的Instant类,可以精确到纳秒,并且是不可变对象,推荐用Instant代替Date。
*/
@Test
public void test10() {
System.out.println("-------------创建Instant对象,获取此刻的时间戳信息--------------");
Instant now = Instant.now();
System.out.println("now = " + now);
System.out.println("-------------获取从1970-01-01T00: 80: 00开始记录的秒数--------------");
System.out.println("总秒数 = " + now.getEpochSecond());
System.out.println("-------------不够一秒的纳秒数--------------");
System.out.println("纳秒数 = " + now.getNano());
System.out.println("-------------增加时间 plus--------------");
System.out.println("增加一秒 = " + now.plusSeconds(1));
System.out.println("-------------减少时间 minus--------------");
System.out.println("减少两万纳秒 = " + now.minusNanos(20000));
System.out.println("-------------判断时间 is--------------");
Instant now1 = Instant.now();
System.out.println("now = " + now);
System.out.println("now1 = " + now1);
System.out.println("相等? = " + now.equals(now1));
System.out.println("now在now1之前? = " + now.isBefore(now1));
System.out.println("now在now1之后? = " + now.isAfter(now1));
}
/**
* 代替SimpleDateFormat(线程不安全)
* DateTimeFormatter(线程安全) :用于时间的格式化和解析
*/
@Test
public void test11() {
System.out.println("-------------获取格式化对象--------------");
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
System.out.println("-------------格式化时间 LocalDateTime--------------");
LocalDateTime now = LocalDateTime.now();
String format = dateTimeFormatter.format(now);
System.out.println("格式化器做格式化 = " + format);
String format1 = now.format(dateTimeFormatter);
System.out.println("LocalDateTime自带的方法格式化 = " + format1);
System.out.println("-------------格式化时间 ZonedDateTime--------------");
ZonedDateTime now2 = ZonedDateTime.now();
String format3 = dateTimeFormatter.format(now2);
System.out.println("format2 = " + format3);
System.out.println("-------------格式化时间 Instant 必须指定时区 否则报 UnsupportedTemporalTypeException 异常--------------");
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss").withZone(ZoneId.systemDefault());
Instant now1 = Instant.now();
String format2 = dateTimeFormatter1.format(now1);
System.out.println("format1 = " + format2);
System.out.println("-------------解析时间--------------");
String dateStr = "2022年12月12日 12:12:12";
LocalDateTime parse = LocalDateTime.parse(dateStr, dateTimeFormatter);
System.out.println("解析后的时间 = " + parse);
}
/**
* 其他补充
* Period:日期间隔(年,月,日)
* 可以用于计算两个LocalDate对象相差的年数、月数、天数。
*/
@Test
public void test12() {
System.out.println("-------------计算年月日间隔--------------");
LocalDate start = LocalDate.of(2024, 10, 1);
LocalDate end = LocalDate.of(2024, 11, 15);
Period between = Period.between(start, end);
System.out.println("开始到结束总计月份 = " + between.toTotalMonths());
System.out.println("间隔多少年 = " + between.getYears());
System.out.println("间隔多少月 = " + between.getMonths());
System.out.println("间隔多少天 = " + between.getDays());
// System.out.println("获取单位 = " + between.getUnits());
// System.out.println("间隔多少天2 = " + between.getChronology());
}
/**
* 其他补充
* Duration:时间间隔(时、分、秒,纳秒)
* 可以用于计算两个时间对象相差的天数、小时数、分数、秒数、纳秒数; 支持LocalTime、 LocalDateTime、Instant等时间。
*/
@Test
public void test13() {
LocalDateTime start = LocalDateTime.of(2023,11,11,11,11,11,10000);
LocalDateTime end = LocalDateTime.of(2023,11,11,11,12,11,100000);
Duration between = Duration.between(start, end);
System.out.println("间隔多少天 = " + between.toDays());
System.out.println("间隔多少小时 = " + between.toHours());
System.out.println("间隔多少分 = " + between.toMinutes());
System.out.println("间隔多少秒 = " + between.toSeconds());
System.out.println("间隔多少毫秒 = " + between.toMillis());
System.out.println("间隔多少纳秒 = " + between.toNanos());
System.out.println("间隔多少秒 = " + between.getSeconds());
System.out.println("间隔多少纳秒 = " + between.getNano());
}
}