LocalDate、LocalTime、LocalDateTime详解
参考https://blog.csdn.net/p812438109/article/details/83652695,为了方便自己查看,自己用idea敲了一遍。
LocalDate
//获取年份
int year = LocalDate.now().getYear();
//获取月份
int monthValue = LocalDate.now().getMonthValue();
// 获取当前年份的第几天
int dayOfYear = LocalDate.now().getDayOfYear();
// 获取月份的第几天
int dayOfMonth = LocalDate.now().getDayOfMonth();
System.out.println(year+" - "+monthValue+" - " + dayOfMonth);//2020-1-4
//指定某一年的第几天
LocalDate localDate = LocalDate.ofYearDay(2020, 366);//如果大于当年的最大时间,则报错
System.out.println(localDate); // 2020-12-31
// 过期某一天
LocalDate localDate1 = LocalDate.now().minusDays(2);
System.out.println(localDate1); // 2020-01-02
//指定当月的第几天
LocalDate localDate2 = LocalDate.now().withDayOfMonth(23);
System.out.println(localDate2); // 2020-01-23
//从1970-01-01开始计算,加上指定的天数
LocalDate localDate3 = LocalDate.ofEpochDay(0);
System.out.println(localDate3); // 1970-01-01
// 当前年份的总天数
int lengthOfYear = LocalDate.now().lengthOfYear();// 366
//当前年月日(默认格式)
LocalDate now = LocalDate.now();
System.out.println(now);//2020-01-04
//当前年月日(指定年份)
LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
//将指定的年月日转换成LocalDate模式
LocalDate parse = LocalDate.parse("2019-12-12");
//将指定的年月日转换成LocalDate模式, 格式要对应
LocalDate parse1 = LocalDate.parse("2019-12-12", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println(parse1);
//检查当前年份是否是闰年
boolean leapYear = LocalDate.now().isLeapYear();
System.out.println(leapYear);
LocalTime
很少用到只返回小时的。
@Test
public void test2(){
//返回 hh:mm:ss
LocalTime now = LocalTime.now();
System.out.println(now);
LocalTime of = LocalTime.of(12, 59, 59, 999999999);
System.out.println(of);
LocalTime parse = LocalTime.parse("23:12:59");
System.out.println(parse);
}
LocalDateTime
@Test
public void test3(){
//LocalDateTime api和LocalDate 基本差不多,所以少位居一些例子
//获取当前时间
LocalDateTime now = LocalDateTime.now();
System.out.println(now); // 2020-01-04T21:37:03.340
String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(format);//2020-01-04 21:37:03
LocalDateTime parse = LocalDateTime.parse("2019-11-01T00:00:00");
System.out.println(parse);//2019-11-01T00:00
//指定时间转换成指定格式
LocalDateTime parse1 = LocalDateTime.parse("2019-11-01 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(parse1); // 2019-11-01T23:59:59
}
SimpleDateFormat 格式化引起的问题
SImpleDateFormat 是线程不安全的,所以需要用ThreadLocal 去加锁。
@Test
public void testSimpleDateFormat() throws ExecutionException, InterruptedException {
Callable<Date> task = new Callable<Date>() {
@Override
public Date call() throws Exception {
return SimpleDateLocalThread.convert("20191212");
}
};
ExecutorService pool = Executors.newFixedThreadPool(10);
List<Future<Date>> result = new ArrayList<>();
for (int i = 0 ; i < 10 ; i++){
result.add(pool.submit(task));
}
for (Future<Date> future : result){
System.out.println(future.get());
}
pool.shutdown();
}
class SimpleDateLocalThread{
private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>(){
@Override
protected DateFormat initialValue(){
return new SimpleDateFormat("yyyyMMdd");
}
};
public static Date convert(String source) throws ParseException {
return df.get().parse(source);
}
}
使用 LocalDate 来实现多线程安全
@Test
public void testDateTimeFormat2() throws ExecutionException, InterruptedException {
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyyMMdd");
Callable<LocalDate> task = new Callable<LocalDate>() {
@Override
public LocalDate call() throws Exception {
return LocalDate.parse("20191212",df);
}
};
ExecutorService pool = Executors.newFixedThreadPool(10);
List<Future<LocalDate>> result = new ArrayList<>();
for (int i = 0 ; i < 10 ; i++){
result.add(pool.submit(task));
}
for (Future<LocalDate> future : result){
System.out.println(future.get());
}
pool.shutdown();
}
Instant 时间戳
@Test
public void testInstant(){
// Instant:时间戳(以Unix 元年,以1970年1月1日...开始)
Instant now = Instant.now();
System.out.println(now); // 2020-01-08T14:25:45.854Z
// 偏移量
OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime.toEpochSecond()); // 1578493545
}
Duration 、Period
都表示时间差
@Test
public void testDuration() throws InterruptedException {
Instant now = Instant.now();
Thread.sleep(1);
Instant now2 = Instant.now();
Duration between = Duration.between(now, now2);
System.out.println(between.getNano()); // 6000000
}
@Test
public void testPeriod(){
LocalDate startTime = LocalDate.of(2015, 12, 12);
LocalDate endTime = LocalDate.of(2015, 12, 12);
Period between = Period.between(startTime, endTime);
System.out.println(between.getMonths());//0
boolean negative = between.isNegative();// 比较两个时间
System.out.println(negative);
}
TemporalAdjuster 时间矫正器
@Test
public void testTemPoralAdjuster(){
LocalDateTime now = LocalDateTime.now();
now.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)); // 下周五
// 自定义
LocalDateTime with = now.with(l -> {
LocalDateTime t = (LocalDateTime) l;
Month month = t.getMonth();
if (month.getValue() == 1) {
return t.plusDays(1);
} else {
return t.plusDays(2);
}
});
System.out.println(with);
}
或者写成构造方法
@Test
public void test7(){
testTemporal(LocalDateTime.now());
}
//写成方法
public static void testTemporal(Temporal temporal){
LocalDateTime temporal1 = (LocalDateTime) temporal;
// 自定义
LocalDateTime with = temporal1.with(l -> {
LocalDateTime t = (LocalDateTime) l;
Month month = t.getMonth();
if (month.getValue() == 1) {
return t.plusDays(1);
} else {
return t.plusDays(2);
}
});
}