目录
日期
介绍:
- 理解日期、时间和时刻
- 理解时区的概念
- 理解夏令时,同一地区使用GMT/UTC和城市表示的时区可能导致时间不同
- GTM-05:00
- America/New_York
- 理解locale用来针对当地用户习惯格式化日期、时间、数字、货币等。
Java有两套日期和时间的API
- java.util.since/Calendar
- java.time
java.time的API (目前多用time)
一、LocalDate
1. 基本用法
/**
* 常见基本的用法
*/
public static void use() {
LocalDate localDate = LocalDate.now(); // 获取当前日期
LocalTime localTime = LocalTime.now(); // 获取当前时间
LocalDateTime localDateTime = LocalDateTime.now(); // 获取当前日期和时间
System.out.println(localDate); // 严格按照ISO 8601格式打印
System.out.println(localTime); // 严格按照ISO 8601格式打印
System.out.println(localDateTime); // 严格按照ISO 8601格式打印
}
2. 日期之间的转化
/**
* 日期之间的转化
*/
public static void transform() {
// 方式一:toLocalDate toLocalTime
LocalDateTime dt = LocalDateTime.now();
LocalDate localDate = dt.toLocalDate(); // 转化成当前日期
LocalTime localTime = dt.toLocalTime(); // 转化成 当前时间
System.out.println("localDate = " + localDate);
System.out.println("localTime = " + localTime);
// 方式二: 固定转换为时间
LocalDate localDate1 = LocalDate.of(2023, 11, 1);
LocalTime localTime1 = LocalTime.of(18, 11, 22);
LocalDateTime localDateTime = LocalDateTime.of(2029, 1, 1, 1, 1, 1);
}
3. LocalDateTime 计算
/**
* LocalDateTime 计算
*/
public static void timeCalculate() {
//加时间
LocalDateTime plus = LocalDateTime.now().plus(Duration.ofDays(1));
LocalDateTime localDateTime = LocalDateTime.now().plusHours(1);
System.out.println(localDateTime);
System.out.println(plus);
//时间减
LocalDateTime minus = LocalDateTime.now().minus(Duration.ofDays(1));
System.out.println(minus);
LocalDateTime localDateTime1 = LocalDateTime.now().minusHours(1);
System.out.println(localDateTime1);
//获取当前时间,并且将小时设置为1
LocalDateTime with = LocalDateTime.now().with(LocalTime.of(1, 1, 1));
System.out.println(with);
LocalDateTime localDateTime2 = LocalDateTime.now().withHour(1);
System.out.println(localDateTime2);
}
4. 格式化 日期
/**
* 格式化 日期
*/
private static void format() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
String format = dateTimeFormatter.format(LocalDateTime.now());
System.out.println(format);
String format1 = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
System.out.println(format1);
}
二、Instant
1. 基本应用
/**
* 时间戳类 Instant 的基本应用
*/
public static void instantUse() {
Instant instant = Instant.now();
System.out.println("秒 " + instant.getEpochSecond()); // 秒
System.out.println("毫秒 " + instant.toEpochMilli()); // 毫秒
System.out.println("时间戳: " + System.currentTimeMillis()); // 时间戳,毫秒
}
2. 常见方法
/**
* 将时间秒级别的时间戳转化为时间
* 使用方法: Instant.ofEpochSecond()
* 将时间毫秒级别的时间戳转化为时间,使用 Instant.ofEpochMilli()
* 转化思路:
* 1. 先转化为 Instant 类
* 2. instant 设置时区,转化为 ZonedDateTime
* 3. 格式化输出 DateTimeFormatter
*
* @param time 传入时间戳,秒级别
*/
public static void methods(long time) {
Instant instant = Instant.ofEpochSecond(time);
// Instant instant1 = Instant.ofEpochMilli(System.currentTimeMillis());
ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = dateTimeFormatter.format(zonedDateTime);
System.out.println("当前时间为: " + format);
}
3. 时间计算
/**
* 计算时间差
*/
public static void timeCalculate() {
Instant begin = Instant.now();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
Instant end = Instant.now();
// 方式一:直接减
long difference = (end.toEpochMilli() - begin.toEpochMilli()) / 1000;
System.out.println("耗时:" + difference);
// 方式二:使用 Duration
Duration duration = Duration.between(begin, end);
System.out.println("耗时:" + duration.toMillis() + "毫秒");
// 方式三:使用内置方法
long until = begin.until(end, ChronoUnit.MILLIS);
System.out.println("耗时:" + until + "毫秒");
}
4. 时间转化
/**
* localDateTime 与 instant 的转换
*/
public static void transform() {
//转化一:instant 转 localDateTime
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.now(), ZoneId.systemDefault());
System.out.println(localDateTime);
//转化二:localDateTime 转 instant
Instant instant = localDateTime.toInstant(ZoneOffset.of("+8"));
System.out.println(instant);
}
三、DateTimeFormatter 时间格式化
1. 基本用法
/**
* 用法
*/
public static void classUse() {
// 方法一:创建DateTimeFormatter时,我们仍然通过传入格式化字符串实现:
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 方法二:另一种创建DateTimeFormatter的方法是,传入格式化字符串时,同时指定Locale:
DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("E,yyyy-MM-dd HH:mm:ss", Locale.CHINA);
}
2. 各类时间格式化
/**
* 各类时间格式化
*/
public static void transform() {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd 'T' HH:mm ZZZZ");
System.out.println(formatter.format(zonedDateTime));
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy MM dd EE HH:mm ", Locale.CHINA);
System.out.println(formatter1.format(zonedDateTime));
// 按照美国习惯,输出日期和时间:
DateTimeFormatter formater2 = DateTimeFormatter.ofPattern("E, MMMM/dd/yyyy HH:mm", Locale.US);
System.out.println(formater2.format(ZonedDateTime.now(Clock.system(ZoneId.of("America/New_York")))));
}
四、ZonedDateTime
1. 基本用法
/**
* ZonedDateTime的简单使用
* ZoneId.of("America/New_York") 指定时区
*/
public static void zoneDateTimeUse() {
ZonedDateTime zbj = ZonedDateTime.now(); // 默认时区,默认时当前时间的时区
ZonedDateTime zny = ZonedDateTime.now(ZoneId.of("America/New_York")); // 用指定时区获取当前时间
System.out.println(zbj);
System.out.println(zny);
}
2. ZonedDateTime 与LocalDateTime 之间转化
/**
* ZonedDateTime 与LocalDateTime 之间转化
* LocalDateTime 转化为ZonedDateTime 使用的是 atZone,然后在里面指定时区
*/
public static void transform() {
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zbj = ldt.atZone(ZoneId.systemDefault());
ZonedDateTime zny = ldt.atZone(ZoneId.of("America/New_York"));
System.out.println(zbj);
System.out.println(zny);
ZonedDateTime zbj1 = ZonedDateTime.now();
System.out.println(zbj1);
LocalDateTime ldt1 = zbj1.toLocalDateTime();
System.out.println(ldt1);
}
3. 时区转换
public static void zoneTransform() {
// 获取中国区的时间
ZonedDateTime zbj = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
// 获取纽约的时间
ZonedDateTime zny = zbj.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println(zbj);
System.out.println(zny);
}
五、时间计算
一般时间的计算主要有:Duration 类, Period 类或 ChronoUnit.between 方法。 甲持续时间测量使用基于时间的值(秒,毫微秒)的时间量。Period 使用基于日期的值(年,月,日)。
/**
* Duration类表示秒或纳秒时间间隔,适合处理较短的时间,需要更高的精确性。我们能使用between()方法比较两个瞬间的差
*
*/
public static void durationDemo() {
Instant t1 = Instant.now();
Instant t2 = Instant.now();
// 计算差值,并且返回毫秒 between 可以传 LocalDateTime,instant 这两个值
Duration duration = Duration.between(LocalDateTime.of(2021,1,1,0,0,0), LocalDateTime.now());
System.out.println("耗时" + duration.toNanos() + "纳秒");
System.out.println("耗时" + duration.toMillis() + "毫秒");
System.out.println("耗时" + duration.toSeconds() + "秒");
System.out.println("耗时" + duration.toMinutes() + "分钟");
System.out.println("耗时" + duration.toHours() + "小时");
System.out.println("耗时" + duration.toDays() + "天");
// 时间计算
// 时间增加
Duration duration1 = duration.plusDays(1);
System.out.println(duration1.toMillis());
Duration duration2 = duration.plusHours(1);
System.out.println(duration2.toMillis());
Duration duration3 = duration.plusMinutes(1);
System.out.println(duration3.toMillis());
Duration duration4 = duration.plusSeconds(1);
System.out.println(duration4.toMillis());
Duration duration5 = duration.plusNanos(1);
System.out.println(duration5.toMillis());
// 时间减少
Duration duration6 = duration.minusDays(1);
System.out.println(duration6.toMillis());
Duration duration7 = duration.minusHours(1);
System.out.println(duration7.toMillis());
Duration duration8 = duration.minusMillis(1);
System.out.println(duration8.toMillis());
Duration duration9 = duration.minusSeconds(1);
System.out.println(duration9.toMillis());
Duration duration10 = duration.minusNanos(1);
System.out.println(duration10.toMillis());
}
/**
* Period 类表示一段时间的年、月、日,开使用between()方法获取两个日期之间的差作为Period 对象返回:
*/
public static void periodDemo() {
LocalDate startDate = LocalDate.of(2015, 2, 20);
LocalDate endDate = LocalDate.of(2017, 1, 15);
//计算时间差值
Period period = Period.between(startDate, endDate);
System.out.println(period.getYears() + "年" + period.getMonths() + "月" + period.getDays() + "天");
// Period类型对象是基于年、月、日和周
Period fromUnits = Period.of(3, 10, 10);
}
标签:Java,System,日期,LocalDateTime,println,now,ZonedDateTime,out
From: https://www.cnblogs.com/alex-oos/p/18374062