package com.ifilldream.rocketmq_lean.localdatatime_lean;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
/**
* @ClassName LocalDateTimeTest
* @Description TODO
* @Author RickSun && iFillDream
* @Date 2020/1/11 10:13
* @Version 1.0
*/
public class LocalDateTimeTest {
/**
提到Java的时间类,你一定想到的是Date,但是Date存在着一些不足之处
Java8提供了新的时间类,那就是LocalDateTime。以前的Date不好用吗,为什么还要推出一个时间类?单纯从用法上看其实Date也不是特别复杂。
但是Date最大的问题是线程不安全导致的一些列问题,很多方法都被官方标记为废弃,通常被废弃的方法都是要谨慎使用的。
其次是Date的可读性非常差,为此Java8开始使用LocalDateTime替换之前的Date。
*/
public static void main(String[] args) throws ParseException {
//我们举几个例子(现在是2020年01月11日)
showDate();
showLocalDateTime();
showOther();
}
/**
* Date的用法
*/
public static void showDate() throws ParseException {
System.out.println("--------------Date---------------");
Date dateNow = new Date();
System.out.println("当前时间:" + dateNow);
System.out.println("当前年份:" + dateNow.getYear());
System.out.println("当前月份:" + dateNow.getMonth());
System.out.printf("今年的第%tj%n",dateNow);
System.out.printf("本月的第%td%n",dateNow);
String dayOfWeek = new SimpleDateFormat("E").format(dateNow);
System.out.println(dayOfWeek);
//构造时间
Date consDate = new Date(2020,01,11,14,14,00);
System.out.println("构造:" + consDate);
//日期的加减
Calendar calendar = Calendar.getInstance();
calendar.setTime(dateNow);
calendar.add(Calendar.DATE, 1);
calendar.add(Calendar.HOUR, 2);
calendar.add(Calendar.MINUTE,3);
calendar.add(Calendar.DATE, -1);
calendar.add(Calendar.HOUR, -2);
calendar.add(Calendar.MINUTE,-3);
System.out.println("加减时间:" + calendar.getTime());
//修改指定日期
calendar.set(Calendar.DAY_OF_MONTH,20);
Date withDayOfMonth = calendar.getTime();
System.out.println("修改日期:" + withDayOfMonth);
calendar.set(Calendar.DAY_OF_YEAR,100);
Date withDayOfYear = calendar.getTime();
System.out.println("修改日期:" + withDayOfYear);
//时间比较
boolean compareBefore = withDayOfMonth.before(withDayOfYear);
boolean compareAfter = withDayOfMonth.after(withDayOfYear);
boolean compareEqual = withDayOfMonth.getTime() == withDayOfYear.getTime();
System.out.println("比较是否小于 : " + compareBefore);
System.out.println("比较是否大于 : " + compareAfter);
System.out.println("比较是否等于: " + compareEqual);
//字符串转时间
String datetime = "2017-11-23 06:08:09";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //SimpleDateFormat是线程不安全的
Date changeTime = sdf.parse(datetime); //此处还要抛异常
System.out.println("字符串转时间: " + changeTime);
//时间转字符串
System.out.println("时间转字符串1: " + sdf.format(changeTime));
//毫秒转时间
System.out.println("毫秒转时间:" + new Date(System.currentTimeMillis()));
//两个时间间隔
//具体代码就不放上来了
//参考https://blog.csdn.net/zpz2411232428/article/details/83278931
/**
实现1949-10-1 --- 2016-8-15 之间的天数。
方法一:
通过Calendar类的日期比较
1,日期是跨年份的
2,年份有闰年和平年
思路:
1,通过SimpleDateFormat初始化时间时刻
2,Date对象的方法大多过时,我们用Calendar类来计算
3,Calendar中的get方法可以获取各个字段的值,例如:DAY_OF_YEAR 一年里当前年时刻的天数
4,计算两个年份之间相差多少年
5,判断平年还是闰年 平年加366天 闰年加365天
6,年份的天数加上当前年时刻天数的差得到结果。
方法二:
Date类的gettime方法返回当前对象一个long值 (单位毫秒)
思路:
1,分别计算两个对象的long值。
2,再用long值想减。
3,用相减的毫秒换算成天数。
*/
}
/**
* LocalDateTime的用法
*/
public static void showLocalDateTime(){
System.out.println("--------------LocalDateTime---------------");
LocalDateTime localNow = LocalDateTime.now();
System.out.println("当前时间:" + localNow);
System.out.println("当前年份:" + localNow.getYear() );
System.out.println("当前月份:" + localNow.getMonth());
int dayOfYear = localNow.getDayOfYear();
int dayOfMonth = localNow.getDayOfMonth();
DayOfWeek dayOfWeek = localNow.getDayOfWeek();
System.out.println("LocalDateTime今年的第" + dayOfYear + "天");
System.out.println("LocalDateTime本月的第" + dayOfMonth + "天");
System.out.println("LocalDateTime星期" + dayOfWeek.getValue() + "(" + dayOfWeek + ")");
//构造时间
LocalDateTime consLocal = LocalDateTime.of(2020,01,11,14,14,00);
System.out.println("LocalDateTime构造:" + consLocal);
//日期的加减
localNow.plusDays(1);
localNow.plusHours(2);
localNow.plusMinutes(3);
localNow.minusDays(1);
localNow.minusHours(2);
localNow.minusMinutes(3);
System.out.println("LocalDateTime加减时间:" + localNow);
//修改指定日期
LocalDateTime withDayOfMonth = localNow.withDayOfMonth(20);
LocalDateTime withDayOfYear = localNow.withDayOfYear(100);
System.out.println("LocalDateTime修改日期:" + withDayOfMonth);
System.out.println("LocalDateTime修改日期:" + withDayOfYear);
//时间比较
boolean compareBefore = withDayOfMonth.isBefore(withDayOfYear);
boolean compareAfter = withDayOfMonth.isAfter(withDayOfYear);
boolean compareEqual = withDayOfMonth.isEqual(withDayOfYear);
System.out.println("LocalDateTime比较是否小于 : " + compareBefore);
System.out.println("LocalDateTime比较是否大于 : " + compareAfter);
System.out.println("LocalDateTime比较是否等于: " + compareEqual);
//字符串转时间
String datetime = "2017-11-23 06:08:09";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime changeTime = LocalDateTime.parse(datetime, dtf);
System.out.println("LocalDateTime字符串转时间: " + changeTime);
//时间转字符串
System.out.println("LocalDateTime时间转字符串1: " +dtf.format(changeTime));
System.out.println("LocalDateTime时间转字符串2: " + localNow.format(DateTimeFormatter.BASIC_ISO_DATE) );
System.out.println("LocalDateTime时间转字符串3: " + localNow.format(DateTimeFormatter.ISO_DATE) );
//毫秒转时间
String longToDateTime = dtf.format(LocalDateTime.ofInstant(
Instant.ofEpochMilli(System.currentTimeMillis()), ZoneId.of("Asia/Shanghai")));
System.out.println("LocalDateTime毫秒转时间:" + longToDateTime);
//两个时间间隔
Duration between = Duration.between(withDayOfMonth, withDayOfYear);
System.out.println("时间间隔:" + between.toDays());
System.out.println("时间间隔:" + between.toHours());
}
public static void showOther(){
System.out.println("--------------LocalDate&LocalTime---------------");
LocalDate localDate = LocalDate.of(2017, 11, 23);
System.out.println("构造LocalDate:" + localDate);
LocalTime localTime = LocalTime.of(8, 6, 00);
System.out.println("构造LocalTime:" + localTime);
LocalDate today = LocalDate.now();
System.out.println("是否闰年:" + today.isLeapYear());
//将年、月、日等修改为指定的值,并返回新的日期与LocalDateTime一样此处不再赘述
//两个日期前后判断与LocalDateTime一致
System.out.println("获取时间的纳秒:" + localTime.getNano());
//程序运行时间
Instant startTime = Instant.now();
//TODO do someting
Instant endTime = Instant.now();
Duration duration = Duration.between(startTime, endTime);
System.out.println("程序运行:" + duration.toMillis() + "毫秒");
}
}
运行效果如下:
可以看得出来LocalDateTime具有非常多的优势。
通过源码我们可以看出SimpleDateFormat也是不安全的,然而Date用到SimpleDateFormat的地方非常多,同时Date也是不安全的。
通过源码可以看出LocalDateTime是线程安全的。
统一首发平台为微信公众号"轻梦致新",搜索关注公众号,第一时间阅读最新内容。