前言
Java中关于日期的API貌似是有点尴尬的,从1.0中的Date到1.1中的Calendar,在到1.8中的LocalDateTime等,给我们增加了不少困惑,到底该使用哪一个?毫无疑问,我们要使用更强大的API,下面会列举出我所能想到的时间操作需求,可供参考。
另外有一些类还存在坑,所以在使用时间API时,需要额外的小心。
获取当前日期、时间public class Main{
public static void main(String[] args){
LocalDateTime localDateTime =LocalDateTime.now();
LocalDate localDate =LocalDate.now();
System.out.println("当前时间"+localDateTime);
System.out.println("当前日期"+localDate);
}
}
当前时间2020-10-04T12:38:52.790
当前日期2020-10-04
自定义格式时间
如果默认的toString不符合我们的需要,可以自定义格式,就需要用到DateTimeFormatter类。
注意HH是24小时格式,hh是12小时格式。public class Main{
public static void main(String[] args){
LocalDateTime localDateTime =LocalDateTime.now();
LocalDate localDate =LocalDate.now();
DateTimeFormatter formatter =DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH点mm分");
System.out.println("当前时间"+localDateTime.format(formatter));
System.out.println("当前日期"+localDate);
}
}
当前时间2020年10月04日 12点41分
当前日期2020-10-04
字符串转时间public class Main{
public static void main(String[] args){
String timer ="2020年09月04日 12点41分";
DateTimeFormatter formatter =DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH点mm分");
LocalDateTime localDateTime =LocalDateTime.parse(timer,formatter);
System.out.println(localDateTime);
}
}
2020-09-04T12:41
构建指定时间public class Main{
public static void main(String[] args){
LocalDateTime localDateTime =LocalDateTime.of(2020,10,8,18,40);
System.out.println(localDateTime);
}
}
2020-10-08T18:40
时间、时间戳互转public class Main{
public static void main(String[] args){
LocalDateTime localDateTime =LocalDateTime.now();
System.out.println("1970年01月01日00时00分00秒起到现在经过"+localDateTime.toEpochSecond(ZoneOffset.of("+8")) +"秒");
System.out.println("1970年01月01日00时00分00秒起到现在经过"+localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() +"毫秒");
}
}
1970年01月01日00时00分00秒起到现在经过1601787930秒
1970年01月01日00时00分00秒起到现在经过1601787930748毫秒public class Main{
public static void main(String[] args){
// LocalDateTime localDateTime =LocalDateTime.now();
// System.out.println("1970年01月01日00时00分00秒起到现在经过"+localDateTime.toEpochSecond(ZoneOffset.of("+8")) +"秒");
//
// System.out.println("1970年01月01日00时00分00秒起到现在经过"+localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli() +"毫秒"
Instant instant =Instant.ofEpochMilli(1601787930748l);
LocalDateTime localDateTime =LocalDateTime.ofInstant(instant,ZoneOffset.of("+8"));
System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH点mm分")));
}
}
2020年10月04日 13点05分
Date、LocalDateTime互转public class Main{
public static void main(String[] args){
LocalDateTime localDateTime =LocalDateTime.now();
Date date = new Date(localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli());
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(date));
}
}
2020-10-04 13:14public class Main{
public static void main(String[] args){
Date date = new Date();
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.of("+8"));
System.out.println(localDateTime);
}
}
2020-10-04T13:17:32.459
Calendar、LocalDateTime互转public class Main{
public static void main(String[] args){
/**
* 当前时间+3天后的LocalDateTime
*/
LocalDateTime localDateTime = LocalDateTime.now().plusDays(3);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli());
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
}
}public class Main{
public static void main(String[] args){
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH,5);
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(calendar.getTimeInMillis()), ZoneId.of("+8"));
System.out.println(localDateTime);
}
}
2020-10-09T14:31:32.452
比较时间前后
isBefore如果返回true,则表示自身在目标时间前面,同样还有个isAfter方法,判断自身是不是在目标时间后面。public class Main{
public static void main(String[] args){
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime12 = localDateTime1.plusHours(1);
System.out.println("时间1在时间2前面"+localDateTime1.isBefore(localDateTime12));
}
}
还可以通过时间戳、compareTo比较,compareTo如果较小,则返回负值,如果大于,则返回正值,相等返回0。public class Main{
public static void main(String[] args){
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime12 = localDateTime1.plusHours
int i = localDateTime12.compareTo(localDateTime1);
System.out.println(i);
}
}
1
通过时间戳相减,就能判断哪个时间大。public class Main{
public static void main(String[] args){
LocalDateTime localDateTime1 = LocalDateTime.now();
LocalDateTime localDateTime12 = localDateTime1.plusHours(1);
System.out.println(localDateTime1.toInstant(ZoneOffset.of("+8")).toEpochMilli()-
localDateTime12.toInstant(ZoneOffset.of("+8")).toEpochMilli()<0?"小于":"大小");
}
}
小于
时间增加、减少
主要通过plusXXXX和minusXXXX增加、减少。public class Main{
public static void main(String[] args){
{
LocalDateTime localDateTime1 = LocalDateTime.now();
/**
* 当前时间增加2小时
*/
LocalDateTime newLocalDateTime = localDateTime1.plusHours(2);
System.out.println(newLocalDateTime);
}
{
LocalDateTime localDateTime1 = LocalDateTime.now();
/**
* 当前时间减少2小时
*/
// LocalDateTime newLocalDateTime = localDateTime1.minusHours(2);
LocalDateTime newLocalDateTime = localDateTime1.plusHours(-2);
System.out.println(newLocalDateTime);
}
{
LocalDateTime localDateTime1 = LocalDateTime.now();
/**
* 当前时间加上2个月
*/
LocalDateTime newLocalDateTime = localDateTime1.plusMonths(2);
System.out.println(newLocalDateTime);
}
}
}
获取指定字段值public class Main{
public static void main(String[] args){
LocalDateTime now = LocalDateTime.now();
/**
* 年
*/
System.out.println(now.get(ChronoField.YEAR));
/**
* 月
*/
System.out.println(now.get(ChronoField.MONTH_OF_YEAR));
/**
* 日
*/
System.out.println(now.get(ChronoField.DAY_OF_MONTH));
/**
* 小时
*/
System.out.println(now.get(ChronoField.HOUR_OF_DAY));
/**
* 分钟
*/
System.out.println(now.get(ChronoField.MINUTE_OF_HOUR));
}
}
2020
10
4
13
51
LocalDateTime排序
升序public class Main{
public static void main(String[] args){
List collect = Stream.generate(() -> {
Instant instant = Instant.ofEpochSecond(new Random().nextInt(2001787930 - 1600000000) + 1600000000);
return LocalDateTime.ofInstant(instant, ZoneId.of("+8"));
}).limit(10).collect(Collectors.toList());
Collections.sort(collect, (o1, o2) -> o1.isAfter(o2)?1:-1);
collect.forEach(localDateTime -> System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))));
}
}
2021-09-20 21:24
2023-12-31 04:48
2024-12-24 07:35
2025-06-29 02:45
2028-01-04 09:14
2028-04-08 12:44
2029-11-01 23:51
2031-09-24 20:49
2031-12-30 08:41
2033-01-24 12:34
降序public class Main{
public static void main(String[] args){
List collect = Stream.generate(() -> {
Instant instant = Instant.ofEpochSecond(new Random().nextInt(2001787930 - 1600000000) + 1600000000);
return LocalDateTime.ofInstant(instant, ZoneId.of("+8"));
}).limit(10).collect(Collectors.toList());
Collections.sort(collect, (o1, o2) -> o1.isBefore(o2)?1:-1);
collect.forEach(localDateTime -> System.out.println(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))));
}
}
2032-03-07 20:59
2031-12-28 02:02
2030-12-17 12:37
2030-02-14 21:14
2029-11-22 23:28
2029-05-06 12:32
2027-12-28 00:58
2027-01-24 14:25
2025-08-15 14:17
2025-04-04 22:07
时间间隔public class Main{
public static void main(String[] args){
LocalDateTime now = LocalDateTime.now();
LocalDateTime localDateTime = now.plusHours(1);
Duration between = Duration.between(localDateTime, now);
/**
* 相差的秒数
*/
System.out.println(Math.abs(between.getSeconds()));
/**
* 相差小时
*/
System.out.println(Math.abs(between.getSeconds()/3600));
}
}
日期间隔public class Main{
public static void main(String[] args){
LocalDate now =LocalDate.now();
LocalDate localDate1 = now.plusDays(3);
Period between = Period.between(now, localDate1);
/**
* 相差天数
*/
System.out.println(between.getDays());
/**
* 相差月数
*/
System.out.println(between.get(ChronoUnit.MONTHS));
}
}
3
0
格式化Date
另外SimpleDateFormat是线程不安全,可以通过ThreadLocal解决。public class Main{
public static void main(String[] args){
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm");
System.out.println(simpleDateFormat.format(new Date()));
}
}
- END -