Java基础——日期API

1 传统日期类

1.1 Date类

import java.util.Date;

public class Main {
    public static void main(String[] args) {
        Date date1 = new Date();
        System.out.println(date1);
        Date date2 = new Date(1432432432);
        System.out.println(date2);
        long time = date1.getTime();
        System.out.println(time);
        time += (60 * 60) * 1000;
        date1.setTime(time);
        System.out.println(date1);
    }
}

输出

Sun Jun 25 15:25:07 CST 2023
Sat Jan 17 21:53:52 CST 1970
1687677907079
Sun Jun 25 16:25:07 CST 2023

常用的构造方法就是这两个,一个获取当前时间,一个根据输入的毫秒值设置初始时间,是计算的从1970年1月1日零时开始计算的毫秒值。

getTime()方法能够获取当前时间到1970年1月1日零时的毫秒值。

1.2 SimpleDateFormat类

该类是一个抽象类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NqyYkpMM-1687701841610)(https://note.youdao.com/yws/res/4281/WEBRESOURCEb42aa2e29aa344be57d8a2271cbf3b10)]

该类用于格式化输出时间,可指定的格式如上所示

import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeDemo2 {
    public static void main(String[] args) {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE a");
        String str = simpleDateFormat.format(date);
        System.out.println(str);

        long time = System.currentTimeMillis() + 121 * 1000;
        String str2 = simpleDateFormat.format(time);
        System.out.println(str2);
    }
}

输出

2023-06-25 15:31:46 周日 下午
2023-06-25 15:33:47 周日 下午

可以通过Date对象或者是毫秒值来格式化为日期时间。

还有个比较重要的方法是将字符串形式的日期字符串转换为Date对象

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeDemo3 {
    public static void main(String[] args) throws ParseException {
        String dateStr = "2023年6月25日 15:37:43";

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        Date date = sdf.parse(dateStr);
        System.out.println(date);
        System.out.println(sdf.format(date));
    }
}

输出

Sun Jun 25 15:37:43 CST 2023
2023062515:37:43

1.3 Calendar类

Calendar代表系统此刻日期对应的日历对象,是一个抽象类,不能直接创建对象。

import java.util.Date;

public class TimeDmoe4 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar);

        int year = calendar.get(Calendar.YEAR);
        System.out.println(year);

        int mm = calendar.get(Calendar.MONTH);
        System.out.println(mm);

        int days = calendar.get(Calendar.DAY_OF_YEAR);
        System.out.println(days);

        calendar.add(Calendar.DAY_OF_YEAR, 64);
        Date date = calendar.getTime();
        System.out.println(date);

        long time = calendar.getTimeInMillis();
        System.out.println(time);
    }
}

上面包含了Calendar类的常用方法,由于是抽象类,不能创建对象,所以通过自身提供的getInstance方法获取对象。

可以根据字段来获取日历中的年、月、日、一年中的第几天、一月中的第几天等时间数字。

可以做加法运算,然后转换成多少天后的日期对象。

可以获取从元年开始的毫秒值。

2 JDK8新增日期类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Um1Fv3bX-1687701841611)(https://note.youdao.com/yws/res/4306/WEBRESOURCE62beb76e43f7521a89c32a20c789b65c)]

JDK8开始,java.time包提供了新的日期和时间API,新增的API严格区分了时刻、本地日期、本地时间。并且,对日期和时间的计算更加方便。

新增的都是不可变类型的类,不必担心被修改。

2.1 LocalDate

import java.time.Month;

public class TimeDemo5 {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();
        System.out.println(date);

        int year = date.getYear();
        System.out.println(year);

        int monty = date.getMonthValue();
        System.out.println(monty);

        int dayOfYear = date.getDayOfYear();
        System.out.println(dayOfYear);

        System.out.println(date.getDayOfWeek());
        System.out.println(date.getDayOfWeek().getValue());

        LocalDate bt = LocalDate.of(1996, 5, 28);
        System.out.println(bt);
        System.out.println(LocalDate.of(1996, Month.MAY, 28));
    }
}

输出

2023-06-25
2023
6
176
SUNDAY
7
1996-05-28
1996-05-28

获取当前日期,提供了获取年月日的API。

2.2 LocalTime

import java.time.LocalTime;

public class TimeDemo6 {
    public static void main(String[] args) {
        LocalTime time = LocalTime.now();
        System.out.println(time);

        int hour = time.getHour();
        System.out.println(hour);

        int minute = time.getMinute();
        System.out.println(minute);

        int second = time.getSecond();
        System.out.println(second);

        int nano = time.getNano();
        System.out.println(nano);

        System.out.println(LocalTime.of(8, 34));
    }
}

输出

16:10:54.705689100
16
10
54
705689100
08:34

相同的,通过now或者of获取相应对象

2.3 LocalDateTime

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

public class TimeDemo7 {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println(dateTime);
        System.out.println(dateTime.getYear());
        System.out.println(dateTime.getMonth());
        System.out.println(dateTime.getMonthValue());
        System.out.println(dateTime.getDayOfYear());
        System.out.println(dateTime.getHour());
        System.out.println(dateTime.getMinute());
        System.out.println(dateTime.getSecond());
        System.out.println(dateTime.getNano());

        LocalDate date = dateTime.toLocalDate();
        System.out.println(date);

        LocalTime time = dateTime.toLocalTime();
        System.out.println(time);
    }
}

输出

2023-06-25T16:20:58.344327900
2023
JUNE
6
176
16
20
58
344327900
2023-06-25
16:20:58.344327900

LocalDateTime是LocalDate和LocalTime的集合体。

2.4 日期时间操作

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.MonthDay;

public class TimeDemo8 {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println(dateTime);
        System.out.println(dateTime.plusDays(1));
        System.out.println(dateTime.plusMonths(1));
        System.out.println(dateTime.plusHours(1));
        System.out.println(dateTime.plusMinutes(2));

        System.out.println(dateTime.minusDays(1));
        System.out.println(dateTime.minusHours(1));
        System.out.println(dateTime.minusMonths(1));
        System.out.println(dateTime.minusMinutes(2));

        LocalDate date = LocalDate.now();
        LocalDate btDate = LocalDate.of(1996, 5, 28);
        System.out.println(date.equals(btDate));
        System.out.println(date.isBefore(btDate));
        System.out.println(date.isAfter(btDate));

        MonthDay btDay = MonthDay.of(5, 28);
        MonthDay nowDay = MonthDay.from(date);
        System.out.println(btDay.equals(nowDay));
    }
}

输出

2023-06-25T16:35:03.935338100
2023-06-26T16:35:03.935338100
2023-07-25T16:35:03.935338100
2023-06-25T17:35:03.935338100
2023-06-25T16:37:03.935338100
2023-06-24T16:35:03.935338100
2023-06-25T15:35:03.935338100
2023-05-25T16:35:03.935338100
2023-06-25T16:33:03.935338100
false
false
true
false

可以操作日期的加减,以及日期的判断。

2.5 Instant

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

public class TimeDemo9 {
    public static void main(String[] args) {
        Instant instant = Instant.now();
        System.out.println(instant);

        Instant instant1 = Instant.now();
        System.out.println(instant1.atZone(ZoneId.systemDefault()));

        Date date = Date.from(instant);
        System.out.println(date);

        Instant instant2 = date.toInstant();
        System.out.println(instant2);
    }
}

输出

2023-06-25T08:41:13.405915500Z
2023-06-25T16:41:13.405915500+08:00[Asia/Shanghai]
Sun Jun 25 16:41:13 CST 2023
2023-06-25T08:41:13.405Z

获取时间戳,就是日期和时间,可以与Date类相互转换。

2.6 Demo06DateTimeFormat

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

public class TimeDemo10 {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println(dateTime);

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
        System.out.println(dtf.format(dateTime));
        System.out.println(dateTime.format(dtf));

        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime dateTime1 = LocalDateTime.parse("2023-06-25 16:46:43", dtf1);
        System.out.println(dateTime1);
        System.out.println(dateTime1.getDayOfYear());

    }
}

输出

2023-06-25T16:48:01.474393100
2023-06-25 16:48:01 周日 下午
2023-06-25 16:48:01 周日 下午
2023-06-25T16:46:43
176

可以格式化日期时间,并且从格式化字符串中转换得到Date对象。格式化时两个对象都可以调用,可以双向。

2.7 Period

import java.time.LocalDate;
import java.time.Period;

public class TimeDemo11 {
    public static void main(String[] args) {
        LocalDate date = LocalDate.now();
        System.out.println(date);

        LocalDate bt = LocalDate.of(1996, 5, 28);
        Period period = Period.between(bt, date);
        System.out.println(period);
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());
    }
}

输出

2023-06-25
P27Y28D
27
0
28

计算两个日期之间的间隔,只能精确到年月日

2.8 Duration

import java.time.Duration;
import java.time.LocalDateTime;

public class TimeDemo12 {
    public static void main(String[] args) {
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println(dateTime);

        LocalDateTime bt = LocalDateTime.of(1996, 5, 28, 5, 36, 45);

        Duration duration = Duration.between(bt, dateTime);
        System.out.println(duration.toDays());
        System.out.println(duration.toHours());
        System.out.println(duration.toMinutes());
        System.out.println(duration.toMillis());
        System.out.println(duration.toNanos());
    }
}

输出

2023-06-25T17:02:52.802423600
9889
237347
14240846
854450767802
854450767802423600

计算时间间隔

2.9 ChronoUnit

用于在单个时间单位内测量一段时间

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

public class TimeDemo13 {
    public static void main(String[] args) {
        LocalDateTime today = LocalDateTime.now();
        System.out.println(today);

        LocalDateTime birthDate = LocalDateTime.of(1996,5, 28,5,34);
        System.out.println(birthDate);

        System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate, today));
        System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate, today));
        System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birthDate, today));
        System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birthDate, today));
        System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birthDate, today));
        System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birthDate, today));
        System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birthDate, today));
        System.out.println("相差的毫秒数:" + ChronoUnit.MILLIS.between(birthDate, today));
        System.out.println("相差的微秒数:" + ChronoUnit.MICROS.between(birthDate, today));
        System.out.println("相差的纳秒数:" + ChronoUnit.NANOS.between(birthDate, today));
        System.out.println("相差的半天数:" + ChronoUnit.HALF_DAYS.between(birthDate, today));
        System.out.println("相差的十年数:" + ChronoUnit.DECADES.between(birthDate, today));
        System.out.println("相差的世纪(百年)数:" + ChronoUnit.CENTURIES.between(birthDate, today));
        System.out.println("相差的千年数:" + ChronoUnit.MILLENNIA.between(birthDate, today));
        System.out.println("相差的纪元数:" + ChronoUnit.ERAS.between(birthDate, today));
    }
}

输出

2023-06-25T19:33:12.042049100
1996-05-28T05:34
相差的年数:27
相差的月数:324
相差的周数:1412
相差的天数:9889
相差的时数:237349
相差的分数:14240999
相差的秒数:854459952
相差的毫秒数:854459952042
相差的微秒数:854459952042049
相差的纳秒数:854459952042049100
相差的半天数:19779
相差的十年数:2
相差的世纪(百年)数:0
相差的千年数:0
相差的纪元数:0
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值