常用API(2)日期旧方法与新方法

Date旧方法与LocalDate新方法

 java.lang.System类的方法

JDK8之前的API:

  • System类提供的public static long currentTimeMillis():用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。返回long类型值,也称作时间戳。
    • 此方法适于计算时间差。
  • 计算世界时间的主要标准有:
    • UTC(Coordinated Universal Time)
    • GMT(Greenwich Mean Time)
    • CST(Central Standard Time)
  • (UTC, Universal Time Coordinated)。UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。这里,UTC与GMT含义完全相同。

1、 java.util.Date

表示特定的瞬间,精确到毫秒。

  • 构造器:
    • Date():使用无参构造器创建的对象可以获取本地当前时间
    • Date(long 毫秒数):把该毫秒值换算成日期时间对象
  • 常用方法
    • getTime(): 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
    • toString(): 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准。
    • 其它很多方法都过时了。

1java.util.Date

@Test
public void test(){
    Date date = new Date();//创建一个基于当前系统时间的date实例
    System.out.println(date);
    long millisTime = date.getTime();//使用getTime方法得到long型的毫秒数
    System.out.println("对应的毫秒数为:"+millisTime);
    Date date2 = new Date(1732867401688L);
    System.out.println(date2.toString());//Fri Nov 29 16:08:06 CST 2024
}

(2)java.sql.Date

java.sql.Data属于java.util.Data类的一个子类,重写了toStirng方法,专门用于与数据库交互,它只包含日期信息,没有时间部分,格式为”yyyy-MM-dd”

java.sql.Data只有一个带参的构造器,必须传入long类型的实参进行构造。

@Test
public void test1(){
    java.sql.Date date = new java.sql.Date(1732867401688L);//只有一个带参的构造器,必须传入实参
    System.out.println(date.toString());//2024-11-29
}

3java.text.SimpleDateFormat

java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类。

可以进行格式化:日期 --> 文本

可以进行解析:文本 --> 日期

  • 构造器:
    • SimpleDateFormat() :默认的模式和语言环境创建对象
    • public SimpleDateFormat(String pattern):该构造方法可以利用参数pattern,手动指定格式创建一个对象
  • 格式化:
    • public String format(Date date):方法格式化时间对象date
  • 解析:
    • public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期。
@Test
public void test3() throws ParseException {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
    Date date = new Date();
    //格式化:日期-->字符串
    String str = simpleDateFormat.format(date);
    System.out.println(str);//2024/11/29 下午4:10

    //解析:字符串-->日期
    Date date1 = simpleDateFormat.parse(str);
    //产生编译时异常,运用throws抛出
    System.out.println(date1);//Fri Nov 29 16:10:00 CST 2024
}

3Calendar类

  • Date类的API大部分被废弃了,替换为Calendar。
  • Calendar 类是一个抽象类,主用用于完成日期字段之间相互操作的功能。
  • 获取Calendar实例的方法
  • 一个Calendar的实例是系统时间的抽象表示,可以修改或获取 YEAR、MONTH、DAYOFWEEK、HOUROFDAY 、MINUTE、SECOND等 日历字段对应的时间值。
    • public int get(int field):返回给定日历字段的值
    • public void set(int field,int value) :将给定的日历字段设置为指定的值
    • public void add(int field,int amount):根据日历的规则,为给定的日历字段添加或者减去指定的时间量
    • public final Date getTime():将Calendar转成Date对象
    • public final void setTime(Date date):使用指定的Date对象重置Calendar的时间

  • 注意:
    • 获取月份时:一月是0,二月是1,以此类推,12月是11
    • 获取星期时:周日是1......周六是7
@Test
public void test5(){
    Calendar calendar = Calendar.getInstance();//calendar为抽象类,创建抽象类的实例
    //调用类中的静态方法getInstance()
    System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//6
    //在Calendar中,周五为每周第六天、周六为每周第七天,周日为每周第一天
    System.out.println(calendar.get(Calendar.MONTH));
    //一月为0,...十二月为11

    //set方法
    calendar.set(Calendar.DAY_OF_WEEK,2);
    System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//修改后可以得到结果为2

    //add
    calendar.add(Calendar.DAY_OF_WEEK,3);
    System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//5
    calendar.add(Calendar.DAY_OF_WEEK,-2);
    System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//3

    //getTime
    Date date = calendar.getTime();//getTime方法返回一个代表Calendar时间值的Date对象
    System.out.println(date);//Tue Nov 26 20:07:57 CST 2024

    Date date1 = new Date();
    calendar.setTime(date1);
    System.out.println(calendar.get(Calendar.DAY_OF_WEEK));//6
}

新的日期时间与API

(1)弃用旧方法的原因

而Calendar并不比Date好多少。它们面临的问题是:

  • 可变性:像日期和时间这样的类应该是不可变的。
  • 偏移性:Date中的年份是从1900开始的,而月份都从0开始。
  • 格式化:格式化只对Date有用,Calendar则不行。
  • 此外,它们也不是线程安全的;不能处理闰秒等。

2新的API简介

Java 8 以一个新的开始为 Java 创建优秀的 API。新的日期时间API包含:

  • java.time – 包含值对象的基础包
  • java.time.chrono – 提供对不同的日历系统的访问。
  • java.time.format – 格式化和解析时间和日期
  • java.time.temporal – 包括底层框架和扩展特性
  • java.time.zone – 包含时区支持的类

说明:新的 java.time 中包含了所有关于时钟(Clock),本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。

尽管有68个新的公开类型,但是大多数开发者只会用到基础包和format包,大概占总数的三分之一。

3关于LocalDate、LocalTime、LocalDateTime

因为此三类中没有提供公共的构造器,所以无法用new 的方法创建实例对象。

可以通过如下三种方式创建实例对象:now()、of()、parse()

now:获取当前时间

of:获取特定时间

parse:传入字符串,进行解析,获取实例对象

@Test
public void test2(){
    //now()
    LocalDate localDate = LocalDate.now();
    LocalTime localTime = LocalTime.now();
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println(localDate);//2024-11-29
    System.out.println(localTime);//18:07:15.187258600
    System.out.println(localDateTime);//2024-11-29T18:07:15.187258600
    //of  获取指定日期时间
    LocalDate localDate1 = localDate.of(2000,11,8);
    LocalDateTime localDateTime1 =
            localDateTime.of(2000,11,8,5,20,13);
    System.out.println(localDate1);
    System.out.println(localDateTime1);
    //parse
    String STR = "2022-01-01T12:00:00";
    LocalDateTime localDateTime2 = LocalDateTime.parse(STR);
    System.out.println(localDateTime2);
}

LocalDate  日期;LocalTime  毫秒值;LocalDaeTime  既有日期又有毫秒值。

具有不可变性

@Test
public void test3(){
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println(localDateTime.getDayOfMonth());
    LocalDateTime localDateTime1 = localDateTime.withDayOfMonth(15);
    System.out.println(localDateTime);//体现不可变性
    System.out.println(localDateTime1);
}

此时不改变原有对象,而是另外创建新的对象。

(4)瞬时:instant

  • Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳
    • 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
  • java.time.Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。

now()

静态方法,返回默认UTC时区的Instant类的对象

ofEpochMilli(long epochMilli)

静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象

atOffset(ZoneOffset offset)

结合即时的偏移来创建一个 OffsetDateTime

toEpochMilli()

返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳

@Test
public void test4(){
    //instant test
    //now()
    Instant instant = Instant.now();
    System.out.println(instant);//2024-11-29T10:20:04.466606300Z
    //offset方法,进行时区的偏移
    OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));//+8
    System.out.println(offsetDateTime);//当前时区
    //ofEpochMillis(long Millis) 传入毫秒数,得到对应的日期值
    Instant instant1 = Instant.ofEpochMilli(1732867401688L);
    System.out.println(instant1);//2024-11-29T08:03:21.688Z
    //ofEpochMillis()无参时返回以1970-01-01-00:00:00的毫秒数,与Date类中的getTime方法大体相同
    long millisTime = instant.toEpochMilli();
    long date = new Date().getTime();
    System.out.println(millisTime);
    System.out.println(date);
}

5日期时间格式化 DateTimeFormatter

  • 自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

 

 

ofPattern(String pattern)

静态方法,返回一个指定字符串格式的DateTimeFormatter

format(TemporalAccessor t)

格式化一个日期、时间,返回字符串

parse(CharSequence text)

将指定格式的字符序列解析为一个日期、时间

@Test
public void test5(){
    //格式化
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    //自定义pattern模式
    LocalDateTime localDateTime = LocalDateTime.now();//创建LocalDateTime实例
    String strDateTime = dateTimeFormatter.format(localDateTime);//日期-->字符串,格式化
    System.out.println(strDateTime);

        TemporalAccessor temporalAccessor = dateTimeFormatter.parse("2022-01-01 12:00:00");
        LocalDateTime localDateTime1 = LocalDateTime.from(temporalAccessor);
        //字符串-->日期,解析
        System.out.println(localDateTime1);
    }
}

(6)其他API

1、指定时区日期时间:ZondId和ZonedDateTime

  • ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris
  • ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12-03T10:15:30+01:00 Europe/Paris。
    • 其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如:Asia/Shanghai等
  • 常见时区ID:

、持续日期/时间:Period和Duration

  • 持续时间:Duration,用于计算两个“时间”间隔
  • 日期间隔:Period,用于计算两个“日期”间隔

3、Clock:使用时区提供对当前即时、日期和时间的访问的时钟。

4、TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下一个工作日”等操作。 TemporalAdjusters : 该类通过静态方法(firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用 TemporalAdjuster 的实现。

你可能感兴趣的:(java)