Java 8中处理日期时间的API和方法atZone(),ZoneId.of(),Instant类,Date.from():

码途星语者
• 阅读 1490

1.atZone()是LocalDateTime类的一个方法,用于将日期时间与指定的时区关联起来,返回一个ZonedDateTime对象。该方法接受一个ZoneId参数,用于指定时区。它将LocalDateTime对象与指定的时区进行关联,并返回一个在该时区下的ZonedDateTime对象。

以下是atZone()方法的示例用法:

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class AtZoneExample {
    public static void main(String[] args) {
        // 获取当前日期和时间
        LocalDateTime dateTime = LocalDateTime.now();

        // 指定时区为纽约
        ZoneId zoneId = ZoneId.of("America/New_York");

        // 将日期时间与指定时区关联
        ZonedDateTime zonedDateTime = dateTime.atZone(zoneId);

        // 打印关联后的日期时间
        System.out.println("ZonedDateTime: " + zonedDateTime);
    }

// 输出:2023-07-03T14:11:41.610-04:00[America/New_York]
}

在上述代码中,我们首先获取当前的日期和时间LocalDateTime.now()。然后,使用ZoneId.of()方法创建一个ZoneId对象,指定时区为纽约("America/New_York")。接下来,使用atZone()方法将日期时间与指定时区关联,返回一个在纽约时区下的ZonedDateTime对象。最后,打印关联后的日期时间。

需要注意的是,atZone()方法只能用于LocalDateTime对象,而不能用于LocalDate或LocalTime对象。如果需要将LocalDate或LocalTime与时区关联,可以先将其转换为LocalDateTime对象,然后再使用atZone()方法进行关联。


2.ZoneId.systemDefault()是一个静态方法,用于获取系统默认的时区。该方法会返回一个代表当前系统默认时区的ZoneId对象。系统默认时区是根据操作系统的设置来确定的,它反映了当前系统所在的地理位置的时区设置。

以下是ZoneId.systemDefault()方法的示例用法:

import java.time.ZoneId;

public class SystemDefaultZoneExample {

    public static void main(String[] args) {
        // 获取系统默认时区
        ZoneId defaultZone = ZoneId.systemDefault();

        // 打印系统默认时区
        System.out.println("System Default Zone: " + defaultZone);
    }

// 输出:System Default Zone: Asia/Shanghai
}

在上述代码中,我们使用ZoneId.systemDefault()方法获取系统默认的时区。然后,通过打印输出,我们可以查看系统默认时区的标识符。

需要注意的是,系统默认时区是基于操作系统的设置,因此在不同的操作系统上可能会有不同的默认时区。如果需要在应用程序中使用特定的时区,可以使用ZoneId.of()方法来指定所需的时区。例如,ZoneId.of("Asia/Shanghai")表示使用亚洲/上海时区。


3.ZoneId.of()是Java 8中java.time包中的一个静态方法,用于创建ZoneId对象,表示特定的时区。该方法接受一个字符串参数,用于指定时区的标识符。时区标识符通常采用"区域/城市"的形式,例如:"Asia/Shanghai"、"America/New_York"等。这些标识符遵循IANA时区数据库的命名规则。

以下是ZoneId.of()方法的示例用法:

import java.time.ZoneId;

public class ZoneIdExample {
    public static void main(String[] args) {
        // 创建时区对象
        ZoneId zoneId1 = ZoneId.of("Asia/Shanghai");
        ZoneId zoneId2 = ZoneId.of("America/New_York");

        // 打印时区标识符
        System.out.println("ZoneId 1: " + zoneId1);
        System.out.println("ZoneId 2: " + zoneId2);
        
// 输出:ZoneId 1: Asia/Shanghai
// 输出:ZoneId 2: America/New_York
    }
}

在上述代码中,我们使用ZoneId.of()方法创建了两个不同的时区对象,分别代表"Asia/Shanghai"和"America/New_York"时区。然后,通过打印输出,我们可以查看这些时区对象的标识符。

需要注意的是,ZoneId.of()方法在创建ZoneId对象时会进行时区标识符的验证,如果指定的时区标识符不存在或不可识别,将会抛出ZoneRulesException异常。

总结来说,ZoneId.of()方法是Java 8中java.time包中用于创建ZoneId对象的一个静态方法,用于表示特定的时区。通过指定时区标识符,我们可以创建相应的ZoneId对象来处理时区相关的操作。


4.Instant类,用于表示时间轴上的一个特定时刻,Instant提供了一些重要的功能。

以下是一个示例代码,演示了Instant的使用:

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class InstantExample {

    public static void main(String[] args) {
        // 创建当前时刻的Instant对象
        Instant instant1 = Instant.now();
        System.out.println("当前时间的Instant对象:" + instant1);

        // 根据时间戳创建Instant对象
        Instant instant2 = Instant.ofEpochMilli(1609459200000L);
        System.out.println("时间戳对应的Instant对象:" + instant2);

        // 获取时间戳
        long timestamp = instant1.toEpochMilli();
        System.out.println("当前时间的时间戳:" + timestamp);

        // 比较两个Instant对象
        boolean isBefore = instant1.isBefore(instant2);
        boolean isAfter = instant1.isAfter(instant2);
        System.out.println("是否在instant2之前:" + isBefore);
        System.out.println("是否在instant2之后:" + isAfter);

        // 进行时间运算
        Instant instant3 = instant1.plusSeconds(60);
        System.out.println("加60秒后的Instant对象:" + instant3);

        // 转换为ZonedDateTime对象
        ZonedDateTime zonedDateTime = instant1.atZone(ZoneId.systemDefault());
        System.out.println("关联到系统默认时区的ZonedDateTime对象:" + zonedDateTime);

        // 格式化输出
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String formattedZonedDateTime = formatter.format(zonedDateTime);
        System.out.println("格式化后的ZonedDateTime:" + formattedZonedDateTime);
    }
}

打印结果:

当前时间的Instant对象:2023-07-03T07:56:29.107Z
时间戳对应的Instant对象:2021-01-01T00:00:00Z
当前时间的时间戳:1688370989107
是否在instant2之前:false
是否在instant2之后:true
加60秒后的Instant对象:2023-07-03T07:57:29.107Z
关联到系统默认时区的ZonedDateTime对象:2023-07-03T15:56:29.107+08:00[Asia/Shanghai]
格式化后的ZonedDateTime:2023-07-03 15:56:29
这是Instant类的一些重要功能和用法。它是Java 8日期时间API中的核心类之一,提供了处理时间轴上的时刻的能力。

5.Date.from()方法是将Instant对象转换为Date对象的静态方法。

以下是一个示例代码:

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

public class DateFrom {
    public static void main(String[] args) {

        // 获取当前时间的Instant对象
        Instant instant = Instant.now();

        // 将Instant转换为Date
        Date date = Date.from(instant);

        // 可以对date进行进一步操作或者输出
        System.out.println(date);
    }

// 输出:Mon Jul 03 15:47:57 CST 2023
}
请注意,Date对象和Instant对象都表示一个特定的时刻,但它们有不同的API和功能。java.util.Date是可变的,而Instant是不可变的。在项目中,建议优先使用java.time包中的日期时间类型,如Instant、LocalDateTime等。
点赞
收藏
评论区
推荐文章
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
java8 时间类与Date类的相互转化
java8时间类与Date类的相互转化在转换中,我们需要注意,因为java8之前Date是包含日期和时间的,而LocalDate只包含日期,LocalTime只包含时间,所以与Date在互转中,势必会丢失日期或者时间,或者会使用起始时间。如果转LocalDateTime,那么就不存在信息误差。//Date与Instant的相互转化
Wesley13 Wesley13
3年前
ubuntu设置时区,网上同步时间
Linux默认情况下使用UTC格式作为标准时间格式,如果在Linux下运行程序,且在程序中指定了与系统不一样的时区的时候,可能会造成时间错误。如果是Ubuntu的桌面版,则可以直接在图形模式下修改时区信息,但如果是在Server版呢,则需要通过tzconfig来修改时区信息了。使用方式(如将时区设置成Asia/Chongqing):sudotzco
Wesley13 Wesley13
3年前
Android中Calendar与Date的区别以及消除时区对日期操作影响的方法
Android中Calendar与Date的区别以及消除时区对日期操作影响的方法在Android中的日期操作常用的有三种方式,分别是:1.Date类型2.Calendar类型3.Unix时间戳其中,Unix时间戳在计算上最为方便和灵活,效率也高;而Date和Calendar则在一些具体的日期计算上更为便利。其中,在进行日
Wesley13 Wesley13
3年前
Java日期时间API系列20
  Java日期时间API系列19Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnbl
Easter79 Easter79
3年前
SwiftCommon之日期Date
概述获取当前系统时间是开发中经常用到的,在IOS中,我们可以使用NSDate创建一个日期时间对象,然后使用NSDateFormatter类指定相应的格式。比如yyyyMMddHH:mm格式是最常用的。SCDateimportFoundation/日期与时间类
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
Java日期时间API系列13
  从前面的系列博客中可以看出Jdk8中java.time包中的新的日期时间API类设计的很好,但Date由于使用仍非常广泛,这就涉及到Date转LocalDateTime,LocalDateTime转Date。下面是时间类互相转换大全,包含Instant、LocalDate、LocalDateTime、LocalTime、ZonedDateTime和Dat
Stella981 Stella981
3年前
Mybatis Plus 更新时间 creatDate字段报错 Could not set property 'creatDate'
背景   MySQL数据库,表中字段名为creatDate,类型为datetime。Java实体类中对应的变量是java.time.LocalDateTime类型的creatDate。当使用新增和更新的方法时,创建日期时间和最后更新时间自动更新。实体类_/\\__\创建日期__\/_@JsonF
码途星语者
码途星语者
Lv1
试问乡关何处是,水云浩荡迷南北。
文章
2
粉丝
0
获赞
0