JAVA8-Date and Time API: LocalDate, LocalTime, Instant, Duration, Period
旧API问题
1、代码不清晰,一下看不出要转换的日期。
2、Date日期中还包含了时间
3、多线程情况下会报错。
代码重现:
package com.example.study.java8.datetime;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTest {
public static void main(String[] args) throws ParseException {
//122格林威治时间 11月 23日期
//问题:不能清晰表示日期
Date date = new Date(122, 11, 23);
System.out.println(date);
//多线程情况下会出现一些问题:
//30个线程,每个线程下循环100次,执行时间格式转换。
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
for (int i = 0; i < 30; i++) {
new Thread(() -> {
for (int j = 0; j < 100; j++) {
Date parseDate = null;
try {
parseDate = sdf.parse("20221123");
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println(parseDate);
}
}).start();
}
}
}
输出结果:
Fri Dec 23 00:00:00 CST 2022
.。。。。。。。。。。
java.lang.NumberFormatException: For input string: ""
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.base/java.lang.Long.parseLong(Long.java:702)
at java.base/java.lang.Long.parseLong(Long.java:817)
at java.base/java.text.DigitList.getLong(DigitList.java:195)
at java.base/java.text.DecimalFormat.parse(DecimalFormat.java:2121)
at java.base/java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1931)
at java.base/java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1541)
at java.base/java.text.DateFormat.parse(DateFormat.java:393)
at com.example.study.java8.datetime.DateTest.lambda$main$0(DateTest.java:22)
at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-25" Exception in thread "Thread-14" java.lang.NumberFormatException: multiple points
at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1914)
at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
新API学习
1、LocalDate 线程安全
package com.example.study.java8.datetime;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.temporal.ChronoField;
import java.util.Date;
/**
* java8 Date and Time API:LocalDate 线程安全
*/
public class DateTestApi {
public static void main(String[] args) {
testLocalDate();
}
private static void testLocalDate() {
//1、LocalDate
LocalDate localDate = LocalDate.of(2022, 11, 23);
System.out.println(localDate);
//获取年
System.out.println(localDate.getYear());
//获取月
System.out.println(localDate.getMonth());
//今年的第几天
System.out.println(localDate.getDayOfYear());
//这个月的第几天
System.out.println(localDate.getDayOfMonth());
//这一周的星期几
System.out.println(localDate.getDayOfWeek());
//整数:这个月的第几天
//其它枚举值用法一样
int dayOfMoth = localDate.get(ChronoField.DAY_OF_MONTH);
System.out.println(dayOfMoth);
//获取当前时间
LocalDate nowLocalDate = LocalDate.now();
System.out.println(nowLocalDate);
}
}
输出结果:
2022-11-23
2022
NOVEMBER
327
23
WEDNESDAY
23
2022-11-23
2、LocalTime
package com.example.study.java8.datetime;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.temporal.ChronoField;
import java.util.Date;
/**
* java8 Date and Time API:LocalDate 线程安全
*/
public class DateTestApi {
public static void main(String[] args) {
testLocalTime();
}
private static void testLocalTime(){
//获取当前时间
LocalTime time = LocalTime.now();
System.out.println(time);
//时
System.out.println(time.getHour());
//分
System.out.println(time.getMinute());
//秒
System.out.println(time.getSecond());
}
}
输出结果:
21:19:22.856586500
21
19
22
3、LocalDateTime,提供的api更丰富,线程更安全
package com.example.study.java8.datetime;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoField;
import java.util.Date;
/**
* java8 Date and Time API:LocalDate 线程安全
*/
public class DateTestApi {
public static void main(String[] args) {
combineLocalDateAndTime();
}
// API-2: LocalDateTime 日期时间
private static void combineLocalDateAndTime() {
// 整合LocalDate和LocalTIme
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.of(date, time);
System.out.println(dateTime);
//直接获取当前日期时间
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
//获取日期时间,是一周中的周几,其它api方法用法一样
System.out.println(now.getDayOfWeek());
}
}
输出结果:
2022-11-23T21:28:37.228619600
2022-11-23T21:28:37.229621100
WEDNESDAY
4、Instant 点,时刻,时间点
package com.example.study.java8.datetime;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.temporal.ChronoField;
import java.util.Date;
/**
* java8 Date and Time API:LocalDate 线程安全
*/
public class DateTestApi {
public static void main(String[] args) throws InterruptedException {
testInstant();
}
//API-4 Instant 时间点,时刻,点
private static void testInstant() throws InterruptedException {
Instant start = Instant.now();
Thread.sleep(1000L);
Instant end = Instant.now();
//Duration 时间段
Duration duration = Duration.between(start, end);
System.out.println(duration.toMillis());
}
}
输出结果:
1009
5、Duration 时间段
package com.example.study.java8.datetime;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.temporal.ChronoField;
import java.util.Date;
/**
* java8 Date and Time API:LocalDate 线程安全
*/
public class DateTestApi {
public static void main(String[] args) throws InterruptedException {
testDuration();
}
//API-5 Duration 时间段
private static void testDuration() {
LocalTime start = LocalTime.now();
//减1小时
LocalTime end = start.minusHours(1);
//开始到结束
Duration durationBetween = Duration.between(end, start);
//用了多少小时
System.out.println(durationBetween.toHours());
}
}
输出结果:
1
6、Period 周期、时期、时代
package com.example.study.java8.datetime;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.temporal.ChronoField;
import java.util.Date;
/**
* java8 Date and Time API:LocalDate 线程安全
*/
public class DateTestApi {
public static void main(String[] args) throws InterruptedException {
testPeriod();
}
//API-6 Period
private static void testPeriod() {
Period period = Period.between(LocalDate.of(2000, 10, 9), LocalDate.of(2022, 12, 13));
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
}
}
输出结果:
22
2
4
7、format 日期时间格式化成字符串
package com.example.study.java8.datetime;
import java.text.Format;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.util.Date;
/**
* java8 Date and Time API:LocalDate 线程安全
*/
public class DateTestApi {
public static void main(String[] args) throws InterruptedException {
testLocalDateFormat();
}
//API-7 format 日期时间格式化成字符串
private static void testLocalDateFormat() {
//日期格式化
LocalDate date = LocalDate.now();
String basicDate = date.format(DateTimeFormatter.BASIC_ISO_DATE);
//日期时间格式化
LocalDateTime now = LocalDateTime.now();
String time = now.format(DateTimeFormatter.ISO_LOCAL_TIME);
System.out.println(basicDate);
System.out.println(time);
//自定义格式化格式
LocalDateTime localDateTime = LocalDateTime.now();
//自定义格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatDateTIme = localDateTime.format(formatter);
System.out.println(formatDateTIme);
}
}
输出结果:
20221124
20:28:09.7186316
7、parse 字符串格式化成日期时间
package com.example.study.java8.datetime;
import java.text.Format;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.util.Date;
/**
* java8 Date and Time API:LocalDate 线程安全
*/
public class DateTestApi {
public static void main(String[] args) throws InterruptedException {
testLocalDateParse();
}
//API-7 parse 字符串转日期时间格式
private static void testLocalDateParse() {
//字符串日期转date类型,注意字符串格式和要转换的格式要一样
String date = "2022-11-24";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate localDate = LocalDate.parse(date, formatter);
System.out.println(localDate);
//字符串时间转time类型,注意字符串格式和要转换的格式要一样
String time = "20:38:24";
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
LocalTime localTime = LocalTime.parse(time, timeFormatter);
System.out.println(localTime);
//字符串日期时间转datetime类型,注意字符串格式和要转换的格式要一样
String dateTime = "2022/11/24 20:59:24";
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.parse(dateTime, dateTimeFormatter);
System.out.println(localDateTime);
}
}
输出结果:
2022-11-24
20:38:24
2022-11-24T20:59:24
java.time:更多API可以根据需要查看该包下的时间工具类。
评论 (0)