本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2022-06-25
import org.junit.Test;
import java.util.Date;
public class DateTimeTest {
/**
* 1、System.currentTimeMillis()
*/
@Test
public void test1() {
// 返回时间戳:当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差
long time = System.currentTimeMillis();
System.out.println(time);
}
/**
* 2、java.util.Date类 => import java.util.Date;
*/
@Test
public void test2() {
// 未传参 就是创建当前时间的Date对象
Date date1 = new Date();
System.out.println(date1.toString()); // Wed Jan 12 21:06:26 CST 2022
System.out.println(date1.getTime()); // 时间戳
// 传入一个时间戳,传入年月日不建议使用
Date date2 = new Date(1550306204104L);
System.out.println(date2.toString()); // Sat Feb 16 16:36:44 CST 2019
}
/**
* 3、java.sql.Date对应数据库中的日期类型的变量
*/
@Test
public void test3() {
java.sql.Date date3 = new java.sql.Date(1550306204104L);
System.out.println(date3); // 2019-02-16
// sql.Date -> util.Date
// 子类转父类
Date date4 = new java.sql.Date(1550306204104L);
// util.Date -> sql.Date
// 父类转子类 强转
java.sql.Date date5 = (java.sql.Date) date4;
// api转换 父类转子类
Date date6 = new Date();
java.sql.Date date7 = new java.sql.Date(date6.getTime());
}
/**
* 4、SimpleDateFormat
*
* parse可能会报异常,所以要throw,因为可能传入的字符串不能被解析
*/
@Test
public void test4() throws ParseException {
// SimpleDateFormat对日期Date类的格式化和解析
// 1. 格式化:日期 -> 字符串
SimpleDateFormat s = new SimpleDateFormat();
Date date = new Date();
System.out.println(date); // Thu Jan 13 22:48:21 CST 2022
String dateStr = s.format(date);
System.out.println(dateStr); // 2022/1/13 下午10:48
// 2. 解析:字符串 -> 日期
// 要求字符串有一样的格式 format返回的格式,默认格式如下
String str = "2022/1/13 下午10:48";
Date date2 = s.parse(str);
System.out.println(date2);
// 如果想改变日期字符串的格式传递给parse
// 使用带参的构造 SimpleDateFormat,这样parse也将只解析这样格式的字符串
SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date3 = s2.parse("2020-01-01 11:22:00");
System.out.println(date3);
}
/**
* 5、Calendar 是一个抽象类
*/
@Test
public void test5() {
// 1、创建其子类 GregorianCalendar 的对象,或者调用getInstance()方法
Calendar c = Calendar.getInstance();
System.out.println(c.getClass()); // class java.util.GregorianCalendar
// 2、常用方法
// get
// 获取当前时间的一些数据,参数都定义在Calendar上的静态变量上
// 此例中的Calendar.DAY_OF_MONT(API还有很多) 代表获取Calendar这个日期(默认是当天)是这个月的第几天
int i = c.get(Calendar.DAY_OF_MONTH); // 13
System.out.println(i);
// set
c.set(Calendar.DAY_OF_MONTH, 14);
System.out.println(c.get(Calendar.DAY_OF_MONTH)); // 14, Calendar的代表的日期也被修改了
// add
c.add(Calendar.DAY_OF_MONTH, 3); // 可以是负数
System.out.println(c.get(Calendar.DAY_OF_MONTH)); // 17
// getTime: Calendar -> Date;
Date date = c.getTime();
System.out.println(date); // Mon Jan 17 23:12:34 CST 2022
// setTime: Date -> Calendar
c.setTime(new Date());
System.out.println(c.get(Calendar.DAY_OF_MONTH)); // 13
}
}
import org.junit.Test;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class DateTimeTest2 {
/**
* java.time.LocalDate
* java.time.LocalTime
* java.time.LocalDateTime
*/
@Test
public void test() {
// now() 获取当前日期、时间、日期+时间
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
System.out.println(date); // 2022-01-13
System.out.println(time); // 23:24:27.812445
System.out.println(dateTime); // 2022-01-13T23:24:27.812484
// of() 设定指定的年月日时分秒 没有秒的偏移量
LocalDateTime dateTime1 = dateTime.of(2020, 1, 1, 11, 30, 30);
System.out.println(dateTime1); // 2020-01-01T11:30:30
// getXxx()
System.out.println(dateTime.getDayOfMonth()); // 13 获取日期是当月的哪一天
System.out.println(dateTime.getMonth()); // JANUARY 获取月份
System.out.println(dateTime.getMinute()); // 获取分钟
// 体现了不可变性
// withXxx 相当于 setXxx
LocalDate date1 = date.withDayOfMonth(22); // 改变day
System.out.println(date); // 2022-01-13 没有被改变
System.out.println(date1); // 2022-01-22 被改变后的
// 加 plusXxx 也是不可变性的体现
LocalDate date2 = date.plusMonths(3);
System.out.println(date); // 2022-01-13 没有被改变
System.out.println(date2); // 2022-04-13
// 减 minusXxx
LocalDate date3 = date.minusDays(3);
System.out.println(date); // 2022-01-13 没有被改变
System.out.println(date3); // 2022-01-10
}
}
Instant,时间线上的一个瞬时点,可能被用来记录应用程序中的事件时间戳。
public class DateTimeTest2 {
@Test
public void test3() {
Instant instant = Instant.now();
System.out.println(instant); // 2022-01-15T06:16:24.064238Z 格林威治时区时间
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime); // 2022-01-15T14:17:31.842500+08:00 东8区时间,北京时间
// toEpochMilli(): 获取时间戳
long mill = instant.toEpochMilli();
System.out.println(mill); // 1642227569475
// 通过给定的毫秒数 获取Instant实例
Instant instant1 = Instant.ofEpochMilli(1642227569475L);
System.out.println(instant1); // 2022-01-15T06:19:29.475Z 格林威治时间
}
}
public class DateTimeTest2 {
@Test
public void test4() {
// 1、预定义的标准格式,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); // 2022-01-15T14:25:02.637571
System.out.println("格式化后:" + str1); // 2022-01-15T14:25:02.637571
// 结果一样,但是 LocalDateTime 转换成了 String
// 解析:字符串 -> 日期
TemporalAccessor parse = formatter.parse("2022-01-15T14:25:02.637571");
System.out.println(parse); // {},ISO resolved to 2022-01-15T14:25:02.637571
// 2、本地化相关的格式 ofLocalizedDateTime()
// 参数 FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT 适用于 LocalDateTime
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
// DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG).withZone(ZoneId.systemDefault());
// 格式化
String s2 = formatter1.format(localDateTime);
System.out.println(s2);
// SHORT:2022/1/15 下午2:35
// MEDIUM: 2022年1月15日 下午2:34:53
// LONG: 2022年1月15日 CST 下午2:40:16 不适用withZone,而传参FormatStyle.LONG在会报错 跟jdk版本相关
// 本地化相关的格式 ofLocalizedDate()
// 参数 FormatStyle.Full / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT 适用于 LocalDate
// 3、自定义格式
// ofPattern()
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss");
// 格式化
String s3 = formatter2.format(localDateTime);
System.out.println(s3);// 2022-01-15 14:44:58
// 解析
TemporalAccessor parse1 = formatter2.parse("2022-01-15 14:44:58");
System.out.println(parse1); // {WeekBasedYear[WeekFields[SUNDAY,1]]=2022, MonthOfYear=1, DayOfMonth=15},ISO resolved to 14:44:58
}
}