java.time 和 java.util.Date的区别


Java 的时间 API 在 Java 8 中做出了重大改进,推出了 java.time 包,它提供了对日期、时间、时区等的更好支持。与旧版的 java.util.Date 和 java.util.Calendar 相比,新的时间 API 更加简洁、安全和易于使用
java.util.Date 是一个较老的日期时间类,功能较为简单且存在一些设计上的缺陷(如线程不安全、时区问题等)。
java.time 是 Java 8 引入的全新日期时间 API,解决了 java.util.Date 的问题,提供了更清晰、灵活、线程安全的日期时间处理功能。
现代 Java 开发中,建议使用 java.time 包来处理日期和时间,而 java.util.Date 主要用于兼容旧代码或与旧的库进行交互时。
总体而言,java.time 提供了更强大、更易用的功能,能够更好地处理日期和时间,尤其在涉及时区、日期运算和格式化等方面有着明显的优势。
LocalDateTime
JDK8带来了新的时间日期API也就是 java.time 包下面带来Local和Zone,他俩的区别一个是基于你本地时间的,一个是你自己指定时区的。
而Local都有这几个类:LocalDateTime(既包含时间也包含日期),LocalDate(只关注日期,一般来说你只关注日期不需要时间的话用这个),LocalTime(只关注时间,不关注日期)。
当然了,实际上LocalDate和LocalTime也支持日期+时间的形式,那他是怎么做到的呢,因为LocalDate里面包含一个atTime来存储时间,同理LocalTime也有一个atDate属性
例如:

LocalDate localDate = LocalDate.of(2021,3,15);
localDate.atTime(LocalTime.now());

但是如果不想多设置的话可以直接使用LocalDateTime,将日期时间一起处理了。
LocalDateTime localDateTime = LocalDateTime.now();
所以说LocalDateTime取代Date是一个趋势,当然有人比较过二者的效率,结果是Date要比LocalDateTIme快一些,这也没办法毕竟线程安全可能就要多点取舍,未来的版本也许LocalDateTime也可以像Current集合那样线程又安全又快。

在 Java 中,java.time 和 java.util.Date 都是用来处理日期和时间的类,但是它们的设计理念和功能有很大的不同。java.time 是 Java 8 引入的新时间 API,而 java.util.Date 是 Java 早期版本中的时间类。

1. java.util.Date:旧版日期时间类

java.util.Date 是早期 Java 版本中提供的日期时间类。它包含了时间戳(自 1970年1月1日以来的毫秒数)以及日期和时间信息,但它的设计存在一些问题,特别是在处理时区、线程安全以及可读性方面。
特点:
● 不可变性:Date 对象是可变的,修改日期时间后会改变该对象的状态。
● 时区问题:Date 存储的是 UTC 时间,但它并没有提供直接的时区处理功能。
● 线程安全:Date 是线程不安全的,多个线程同时修改同一个 Date 对象时可能导致数据不一致。
弃用方法:许多 Date 类中的方法已被弃用(如 getYear(), getMonth() 等),这些方法的使用不推荐。
示例:

import java.util.Date;

public class DateExample {
    public static void main(String[] args) {
        Date date = new Date();  // 获取当前日期和时间
        System.out.println(date);  // 输出当前日期和时间
    }
}

2. java.time:Java 8 新的日期时间 API

在 Java 8 中,引入了全新的 java.time 包,它提供了更强大的日期和时间处理功能,并解决了 java.util.Date 的一些缺陷。java.time API 包含了不可变类和更多的功能,支持时区、日期计算、格式化等。
特点:
不可变性:java.time 中的所有类(如 LocalDate, LocalTime, LocalDateTime 等)都是不可变的。这意味着每次修改都会返回一个新的对象,而不是修改原有对象。
线程安全:由于不可变性,java.time 的类是线程安全的,可以安全地在多个线程之间共享。
清晰的 API 设计:java.time 的 API 更加直观、易用,支持链式调用,避免了老版 java.util.Date 中的各种复杂性。
更好的时区支持:通过 ZonedDateTime 和 ZoneId,可以方便地处理时区问题。
示例:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class JavaTimeExample {
    public static void main(String[] args) {
        // 获取当前日期、时间和日期时间
        LocalDate today = LocalDate.now();
        LocalTime now = LocalTime.now();
        LocalDateTime dateTime = LocalDateTime.now();
        
        System.out.println("当前日期: " + today);
        System.out.println("当前时间: " + now);
        System.out.println("当前日期和时间: " + dateTime);

        // 格式化日期时间
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formattedDateTime = dateTime.format(formatter);
        System.out.println("格式化后的日期时间: " + formattedDateTime);
    }
}

3. java.time 和 java.util.Date 的对比

特性 java.util.Date java.time API
不可变性 Date 对象是可变的 java.time 类是不可变的
线程安全 不线程安全 线程安全
时区支持 只支持 UTC,时区支持不强 通过 ZonedDateTime 和 ZoneId 支持时区
功能性 功能较为简单,处理时区和计算日期不方便 提供丰富的日期时间操作功能,如 Duration, Period, DateTimeFormatter 等
格式化和解析 使用 SimpleDateFormat 进行格式化和解析 使用 DateTimeFormatter 进行格式化和解析
过时方法 有许多过时的方法(如 getYear()) 没有过时方法,更现代化的 API
4. 常见的转换:java.util.Date 和 java.time 的互转
尽管 java.time 是现代推荐的日期时间 API,但在某些情况下,你可能需要将 java.util.Date 和 java.time 进行互转。以下是一些常见的转换方法。
从 java.util.Date 转换到 java.time:

import java.util.Date;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class DateToJavaTime {
    public static void main(String[] args) {
        // 创建一个 Date 对象
        Date date = new Date();
        
        // 将 Date 转换为 Instant
        Instant instant = date.toInstant();
        
        // 将 Instant 转换为 ZonedDateTime
        ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
        
        System.out.println("ZonedDateTime: " + zonedDateTime);
    }
}

从 java.time 转换到 java.util.Date:

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class JavaTimeToDate {
    public static void main(String[] args) {
        // 获取当前的 LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.now();
        
        // 将 LocalDateTime 转换为 Date
        Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
        
        System.out.println("Date: " + date);
    }
}
在C语言里,位左对齐右对齐一般在格式化输出时会用到,主要用于控制数据在输出时的位置。以下是相关介绍: ### 整型数据的左对齐右对齐 通过`printf`函数实现整型数据的左对齐右对齐右对齐是默认方式,在格式说明符`%`和`d`之间添加数字来规定输出宽度,若数字位数小于规定宽度,会在左边补空格;左对齐则需在数字前加`-`号,若数字位数小于规定宽度,会在右边补空格。 示例代码如下: ```c #include <stdio.h> int main() { // 右对齐。数字宽度为10,若不足10,在左边补足空格 printf("%10d\n", 1234); // 左对齐。数字宽度为10,若不足10,在右边补足空格 printf("%-10d\n", 1234); return 0; } ``` ### 不同输出长度的情况 当规定的输出宽度和数字实际位数不同时,有不同的处理方式。若规定宽度小于数字实际位数,会完整输出数字;若规定宽度大于数字实际位数,右对齐在左边补空格,左对齐在右边补空格。 示例代码如下: ```c #include <stdio.h> int main() { // -5是左对齐,输出长度为5。5是右对齐,输出长度为5 printf("%-5d %5d\n", 455, 455); printf("%-5d %5d\n", -123, -123); // 规定宽度小于实际位数,完整输出数字 printf("%-5d %5d\n", 987654, 987654); return 0; } ``` ### 其他数据类型的对齐 除整型外,其他数据类型也能实现左对齐右对齐。例如浮点数(`%f`)、字符串(`%s`)等,方法和整型一致。 示例代码如下: ```c #include <stdio.h> int main() { // 右对齐浮点数,宽度为10 printf("%10f\n", 3.14); // 左对齐浮点数,宽度为10 printf("%-10f\n", 3.14); // 右对齐字符串,宽度为10 printf("%10s\n", "hello"); // 左对齐字符串,宽度为10 printf("%-10s\n", "hello"); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值