LocalDateTime
本身不包含时区信息,它存储的是年、月、日、时分秒,纳秒这样的数字。
如果只是为了获取当前系统所在默认时区的一个本地时间,那么用LocalDateTime.now()
无参数构造方法即可,而如果我想知道现在在UTC时区那里本地显示的是什么时间,就可以用LocalDateTime.now(ZoneOffset.UTC)
这个构造方法了。
在构造后,LocalDateTime
同样不携带时区信息,仍然只是表示一个显示时间而已。
//获取当前时间
//假如这个时间是:2023-11-23T16:00:51.589
LocalDateTime dtLocal = LocalDateTime.now();
//那么这个时间就会存储:2023-11-23T08:00:51.589,提前8个小时
LocalDateTime dtUtc = LocalDateTime.now(ZoneOffset.UTC);
Instant 类 是Java8 中补充的一个 时间戳类。
相较于 System.currentTimeMillis()获取到【毫秒】,Instant 可以更为精确的获取到【纳秒】。
同时,Instant 类还是 Java8 中 提供的新的 日期时间类LocalDateTime 与 原来的 java.util.Date 类之间转换的桥梁。
Instant now = Instant.now();
System.out.println(now);
System.out.println("纪元秒 : "+ now.getEpochSecond());
System.out.println("毫 秒 : "+ now.toEpochMilli());
System.out.println("纳 秒 : "+ now.getNano());
// 等同now.toEpochMilli()
System.out.println("时间戳毫秒 : "+ System.currentTimeMillis());
// Instant时间戳转LocalDateTime,注意ZoneId.systemDefault()表示系统时区
// 时间戳转Instant
Instant instant = Instant.ofEpochMilli(timestamp);
LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
//获取时间戳秒数
Long second = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
//获取时间戳毫秒数
Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
//时间戳转LocalDateTime
Instant instant = Instant.ofEpochMilli(timestamp);
LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
long timestamp = System.currentTimeMillis();
LocalDate localDate = Instant.ofEpochMilli(timestamp).atZone(ZoneOffset.ofHours(8)).toLocalDate();
LocalDateTime localDateTime = Instant.ofEpochMilli(timestamp).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
Long time = System.currentTimeMillis(); //获取当前时间
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = format.format(time);//注意这里返回的是string类型
//时间转字符串格式化
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
String dateTime = LocalDateTime.now(ZoneOffset.of("+8")).format(formatter);
//字符串转时间
String dateTimeStr = "2018-07-28 14:11:15";
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, df);
//将java.util.Date 转换为java8 的java.time.LocalDateTime,默认时区为东8区
public static LocalDateTime dateConvertToLocalDateTime(Date date) {
return date.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime();
}
//将java8 的 java.time.LocalDateTime 转换为 java.util.Date,默认时区为东8区
public static Date localDateTimeConvertToDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.toInstant(ZoneOffset.of("+8")));
}
/**
* 测试转换是否正确
*/
@Test
public void testDateConvertToLocalDateTime() {
Date date = DateUtils.parseDate("2018-08-01 21:22:22", DateUtils.DATE_YMDHMS);
LocalDateTime localDateTime = DateUtils.dateConvertToLocalDateTime(date);
Long localDateTimeSecond = localDateTime.toEpochSecond(ZoneOffset.of("+8"));
Long dateSecond = date.toInstant().atOffset(ZoneOffset.of("+8")).toEpochSecond();
Assert.assertTrue(dateSecond.equals(localDateTimeSecond));
}
public static void main(String[] args) {
//获取当前时间
LocalDateTime nowTime= LocalDateTime.now();
//自定义时间
LocalDateTime endTime = LocalDateTime.of(2023, 10, 23, 14, 10, 10);
//比较 如今的时间 在 设定的时间 之后 返回的类型是Boolean类型
System.out.println(nowTime.isAfter(endTime));
//比较 如今的时间 在 设定的时间 之前 返回的类型是Boolean类型
System.out.println(nowTime.isBefore(endTime));
//比较 如今的时间 和 设定的时候 相等 返回类型是Boolean类型
System.out.println(nowTime.equals(endTime));
//Returns: the comparator value, negative if less, positive if greater
//nowTime>endTime return 1 else -1
System.out.println(nowTime.compareTo(endTime));
}
public static void main(String[] args) {
//获取当前时间
LocalDateTime nowTime= LocalDateTime.now();
// plus传入正数为加,负数为减
nowTime.plusYears(1);
nowTime.plusDays(1);
nowTime.plusMonths(1);
nowTime.plusMinutes(1);
nowTime.plusSeconds(1);
// minus传入正数为减,负数为加
nowTime.minusDays(1);
// ...
}