原创

LocalDate、LocalDateTime、Date、String之间相互转换

作者:cndz 围观群众:584 更新于 标签:java日期类型转换LocalDateLocalDateTimejava日期格式化

引言

在Java中,有几个类通常用于表示日期和时间。其中包括LocalDate、LocalDateTime、Date和String。这些类中的每一个都有自己独特的特性和功能,了解它们之间的差异对于编写高效的Java代码非常重要。在日常开发中经常涉及到这几种数据类型的相互转换。偶尔记错了还得查下浪费时间,在这里总结下几种数据类型的相互转换代码示例方便查阅。

localDate

LocalDate是一个表示不带时区的日期(年、月和日)的类。它是不可变的,这意味着一旦创建了LocalDate对象,其值就不能更改。LocalDate用于表示生日、周年纪念日和其他不需要特定时间的事件。

要创建LocalDate对象,可以使用静态方法“now()”获取当前日期,也可以使用“of()”方法传入年、月和日的值。例如:

LocalDate birthday = LocalDate.now();
LocalDate birthday = LocalDate.of(1990, Month.JANUARY, 1);

LocalDate转为Date

LocalDate localDate = LocalDate.now();
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

LocalDate转为String(直接使用toString方法)

LocalDate localDate = LocalDate.now();
String strLocalDate = localDate.toString();
System.out.println(strLocalDate);

localDateTime

LocalDateTime是一个表示不带时区的日期和时间的类。它也是不可变的。LocalDateTime用于表示在特定时间发生的事件,例如约会或会议等。

要创建LocalDateTime对象,可以使用静态方法“now()”获取当前日期和时间,也可以使用“of()”方法传入年、月、日、小时、分钟和秒的值。例如:

LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime meeting = LocalDateTime.of(2022, Month.JANUARY, 1, 13, 30, 0);

LocalDateTime 转 Date

LocalDateTime localDateTime = LocalDateTime.now();
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

LocalDateTime 转 String,类似于SimpleDateFormat 可以使用DateTimeFormatter设置时间输出的时间格式。

LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(localDateTime));
//下面是运行结果
2023-07-18T15:32:45.573
2023-07-18 15:32:45

Date

Date是一个类,用于表示带有时区的日期和时间。它是可变的,这意味着它的值可以更改。日期对于表示发生在不同时区的事件或执行需要时区信息的计算非常有用。为什么有了Date类型可以表述日期。java要在java8的时候新增LocalDate 和 LocalDateTime 两个数据类型呢。原因其实主要有两点:

  1. Date中有大量的非线程安全的方法

    大部分Date类的方法都不是线程安全的,例如setYear()、setMonth()、setDate()、setHours()、setMinutes()和setSeconds()等方法。这些方法都能够修改Date对象的内部状态。如果多个线程同时访问和修改同一个Date对象,那么就会发生竞态条件,从而导致程序出现错误的结果。

  2. 全局变量的使用

    在Date类中,有两个静态变量:DateParser和CalendarSystem。这两个变量是全局共享的,如果多个线程同时访问和修改这两个变量,就会导致程序出现竞态条件。因此,在多线程环境下,应该小心处理这两个变量,以免出现问题。

要创建Date对象,可以使用“new”关键字,并使用“Calendar”类传入年、月、日、小时、分钟、秒和时区的值。例如:

Calendar calendar = Calendar.getInstance();
calendar.set(2022, Calendar.JANUARY, 1, 13, 30, 0);
Date meeting = calendar.getTime();

Date转LocalDate

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

Date转为LocalDateTime

Date date = new Date();
LocalDateTime localDateTime = date .toInstant().atZone(ZoneId.systemDefault())       .toLocalDateTime();

Date转为String

Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = simpleDateFormat.format(date);

String

字符串是一个表示字符序列的类。它是不可变的,这意味着一旦创建了String对象,其值就不能更改。字符串用于以人类可读的格式表示日期和时间。

String 转为 LocalDate

String date = "2022-01-01";
LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd"));

String 转为 LocalDateTime

Date date = new Date();
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant,zoneId);

String转为Date

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d = simpleDateFormat.parse("2022-10-17 17:17:17");

结论

总之,理解LocalDate、LocalDateTime、Date和String之间的差异对于编写有效的Java代码非常重要。LocalDate和LocalDateTime用于表示没有时区信息的日期和时间,而Date用于表示有时区信息的时间和日期。字符串用于以人类可读的格式表示日期和时间。通过为每种情况使用适当的类,您可以编写更健壮和可维护的代码。