Java13常用类3:Date类

4. Date类1:jdk1.8 之前

jdk1.8 之前的API:

  1. System类的currentTimeMillis():获取当前系统时间
  2. 两个Date类:
  • SimpleDateFormate类:用于格式化、解析
  • Calendar日历类的使用:抽象类

4.1 两个Date类

时间戳:指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起到此刻的总秒数。

1)System类的currentTimeMillis():

  1. 获取当前时间对应的毫秒数,Long类型,时间戳;
  2. 毫秒数:指获取1970年1月1日 0时0分0秒,到现在的毫秒数
  3. 作用常用来作为时间差

2)两个Date类
|--java.util.Date

  1. 两个构造器:①无参构造;②long类型 有参构造
  2. 两个方法:①toString(); ②long getTime();
    |----java.sql.Date:对应数据库中的 date类型
  3. 一个构造器:①long类型 有参构造
  4. 两个方法:①toString(); ②long getTime();
package com.lCommonClasses.eDateAndDateFormate;

import java.util.Date;
/** Date:日期类
 * 1.|--java.util.Date
 * 2.|---java.sql.Date
 */
public class Date1 {
    public static void main(String[] args) {
        /** 一、 java.util.Date
         * 构造器:一个有参构造器;一个无参构造器
         */
        //1.创建一个当前时间的Date对象
        Date date = new Date();
        //创建一个指定时间戳的Date实例;Sun Sep 15 13:26:28 CST 2013
        Date datePoint = new Date(1379222788828L);
        System.out.println(datePoint.toString());

        /*2.date: 当前系统时间
        date.getTime():获取1970年到现在的毫秒数*/
        System.out.println(date);
        System.out.println(date.getTime());


        /** 二、 java.sql.Date
         * 构造器:只有一个带参的构造器
         */
        // 1.只有年-月-日: 2023-03-19
        java.sql.Date date2 = new java.sql.Date(System.currentTimeMillis());
        System.out.println(date2.toString());// 结果,2023-03-19
        System.out.println(date2.getTime());// 结果,1679629191418
        
        // 2.将字符串转化为日期
        String t = "2019-8-20";
        java.sql.Date date3 = java.sql.Date.valueOf(t);
        System.out.println(date3.getClass());// 结果,class java.sql.Date
    }
}

4.2 SimpeDateFormat

  • java.text.SimpeDateFormat 类:是一个不与语言环境有关的方式来格式化和解析日期的具体的类
  • 可以格式化:日期 --> 文本
  • 可以解析:文本 --> 日期
  • 构造器:
    – SimpeDateFormat(): 默认的模式 和语言环境创建对象
    – public SimpeDateFormat(String pattern): 该构造方法可以用参数 pattern指定的格式创建一个对象
  • 格式化: 日期 --> 字符串
    – public String format(Date date): 该方法可以 格式化时间对象
  • 解析: 字符串 --> 日期
    – public Date parse(String source): 从给定字符串的开始解析文本,以生成一个日期
    /**
     * 默认格式
     * @throws ParseException 解析异常
     */
    @Test
    public void test1() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat();
        Date date = new Date();
        /* 1.`格式化: ` 日期 --> 字符串*/
        String strDate = sdf.format(date);
        System.out.println(strDate);//23-3-24 下午12:14

        /* 2.`解析: ` 字符串 --> 日期
        注意格式的书写,抛出解析异常:ParseException
        需要解析的字符串的格式,需要和默认格式保持一致*/
        Date date2 = sdf.parse("23-3-24 下午12:14");
        System.out.println(date2);//Fri Mar 24 12:14:00 CST 2023
    }

4.2.1 日期和时间模式

以下示例显示如何在美国区域设置中解释日期和时间模式。给定的日期和时间是美国太平洋时区的 2001-07-04 12:08:56 当地时间。我们可以进行自定义,比如:SimpeDateFormat (yyyy-MM-dd HH:mm:ss)

Date and Time PatternResult
"yyyy.MM.dd HH:mm:ss "2001.07.04 12:08:56
“yyyy.MM.dd G ‘at’ HH:mm:ss z”2001.07.04 AD at 12:08:56 PDT
“EEE, MMM d, ''yy”Wed, Jul 4, '01
“h:mm a”12:08 PM
“hh ‘o’‘clock’ a, zzzz”12 o’clock PM, Pacific Daylight Time
“K:mm a, z”0:08 PM, PDT
“yyyyy.MMMMM.dd GGG hh:mm aaa”02001.July.04 AD 12:08 PM
“EEE, d MMM yyyy HH:mm:ss Z”Wed, 4 Jul 2001 12:08:56 -0700
“yyMMddHHmmssZ”010704120856-0700
“yyyy-MM-dd’T’HH:mm:ss.SSSZ”2001-07-04T12:08:56.235-0700
“yyyy-MM-dd’T’HH:mm:ss.SSSXXX”2001-07-04T12:08:56.235-07:00
“YYYY-'W’ww-u”2001-W27-3

4.2.2 日期 字母含义

定义了以下模式字母(保留从“A”到“Z”和从“a”到“z”的所有其他字符):

LetterDate or Time ComponentPresentationExamples
GEra designatorTextAD
yYearYear1996; 96
YWeek yearYear2009; 09
MMonth in year (context sensitive)MonthJuly; Jul; 07
LMonth in year (standalone form)MonthJuly; Jul; 07
wWeek in yearNumber27
WWeek in monthNumber2
DDay in yearNumber189
dDay in monthNumber10
FDay of week in monthNumber2
EDay name in weekTextTuesday; Tue
uDay number of week (1 = Monday, …, 7 = Sunday)Number1
aAm/pm markerTextPM
HHour in day (0-23)Number0
kHour in day (1-24)Number24
KHour in am/pm (0-11)Number0
hHour in am/pm (1-12)、Number12
mMinute in hourNumber30
sSecond in minuteNumber55
SMillisecondNumber978
zTime zoneGeneral time zonePacific Standard Time; PST; GMT-08:00
ZTime zoneRFC 822 time zone-0800
XTime zoneISO 8601 time zone-08; -0800; -08:00

4.3 java.util.Calender 日历类(建议使用)

1)Date类的 API大部分被废弃了,替换为Calender

2)Calendar类是一个抽象类,主要用来完成日期字段之间相互操作的功能;

4.3.1 获取实例和常用方法

3) 获取Calendar实例的方法: Calendar.getInstance()方法

4)常用方法:

  1. get(int field)
  2. set(int field, int amount)
  3. add(int field, int amount)
  4. getTime(): Calendar -->Date
  5. setTime(); 使用指定 Date重置 Calendar
package com.lCommonClasses.eDateAndDateFormate;
import org.junit.Test;
import java.util.*;
/**
 * Calendar 日历类:也是一个抽象类,需要new它的子类
 * Calendar的实例化 和常用方法
 */
public class Calendar1 {
    @Test
    public void test1() {
        /**1.使用 Calendar的静态方法 getInstance()来实例化
         底层调用的还是实例化 Calendar的子类 GregorianCalendar*/
        Calendar calendar = Calendar.getInstance();
        // 结果,class java.util.GregorianCalendar
        System.out.println(calendar.getClass());

        /**2.1 get(int field) 获取年、月、日;月是从0开始的 */
        System.out.println(calendar.get(Calendar.MARCH) + 1);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
        //获取当前月最大天数
        System.out.println("get(,):" + calendar.getActualMaximum(Calendar.DATE));

        /**2.2 set(int field, int amount) */
        //月份自动 +1,即实际值是:4
        calendar.set(Calendar.MONTH, 3);
        calendar.set(Calendar.DAY_OF_MONTH, 16);
        System.out.println(calendar.get(Calendar.MONTH));
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));

        /**2.3 add(int field, int amount) */
        calendar.add(Calendar.DAY_OF_MONTH, 3);
        calendar.add(Calendar.DAY_OF_MONTH, -5);
        System.out.println("add(,):" + calendar.get(Calendar.DAY_OF_MONTH));


        /**2.4 getTime(); Calendar -->Date */
        Date date = calendar.getTime();// 日期类
        System.out.println(date);

        /**2.5 setTime(); 使用指定 Date重置 Calendar */
        Date date1 =new Date();
        calendar.setTime(date1);// 日期类转日历类
        System.out.println(calendar.get(Calendar.MONTH));
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
    }
}

4.3.2 常量含义意义

int field表示的意义
Calendar.YEAR年份
Calendar.MONTH月份
Calendar.DATE日期
Calendar.DAY_OF_MONTH日期,和上面的字段意义相同
Calendar.HOUR12小时制的小时
Calendar.HOUR_OF_DAY24小时制的小时
Calendar.MINUTE分钟
Calendar.SECOND
Calendar.DAY_OF_WEEK星期几

4.3.3 练习:util.Date ->sql.Date

练习1:将java.util.Date的实例转换为 java.sql.Date的实例
思路:寻找他们的相同点:时间戳

    @Test
    public void test1(){
        Date date1 = new Date();

        /* 错误实例:ClassCastException
        java.sql.Date date2 = (java.sql.Date) date1;
        System.out.println(date2);*/

        /* 正确示例:寻找相同点(时间戳)*/
        java.sql.Date date2 = new java.sql.Date(date1.getTime());
        System.out.println(date2);// 结果,2023-03-24
    }

4.3.4 日期字符串 保存到数据库

拓展2:将控制台获取的年月日(比如:2022-10-01)的字符串数据,保存在数据库中。
简化:得到 java.sql.Date的对象,此对象对应的时间为:2022-10-01
分析:字符串(解析)–> java.util.Date–> java.sql.Date

    @Test
    public void test2() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String timeStr="2022-10-01";

        // 将 timeStr解析为 java.util.Date
        Date date1 = sdf.parse(timeStr);

        // 转换为 java.sql.Date
        java.sql.Date date2 = new java.sql.Date(date1.getTime());
        System.out.println(date2);// 默认的调用的是toString()方法
        System.out.println(date2.toString());// 结果,2022-10-01
    }

4.4 Jdk1.8的日期类

Date和 Calendar面临的问题:

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

总结:对日期和时间的操作,一直是Java程序员最痛苦的地方之一。

第三次引入的API是成功的,并且Jdk1.8引入的java.time API已经纠正了过去的缺陷,将来很长一段时间它都会为我们提供服务。

jdk1.8的日期时间API包含
在这里插入图片描述

  • java.time - 包含值对象的基础包
  • java.time.chrono - 提供对不同的日历系统的访问
  • java.time.format - 格式化和解析 时间和日期
  • java.time.temporal - 包括底层框架和扩展特性
  • java.time.zone - 包含时区支持的类
  • 常用的有基础包、format包,尽管有68个新的公开类型,但是常用的只有三分之一。
属性含义说明
Instant代表时间相当于Date
LocalDate本地日期,比如:2023-01-14
LocalTime本地时间,比如:12:20:30
LocalDateTime本地日期时间,比如:2022-01-14 12:20:30
ZonedDateTime时区,(包含时区的完整日期时间)
Duration持续时间
Period代表时间段
ZoneOffset代表时区偏移量,比如+8:00
Clock代表时钟,比如获取美国纽约的时间
DateTimeFormatter日期和字符串格式转换

4.4.1 LocalDate、LocalTime、LocalDateTime

LocalDate、LocalTime、LocalDateTime–>类似于 Calender

  1. 实例化:now()、of(xx,xx,xx)
  2. 方法:get()、withXxx()设置、plusXxx()添加、minusXxx()减去、
方法描述
static LocalDate now()静态方法,根据当前时间创建对象/ 指定时区的对象
static LocalDate of(int year, Month month, int dayOfMonth)静态方法,根据指定日期/ 时间创建对象
getDayOfMonth()/ getDayOfYear()获取 月份(1~31)里/ 一年里的某天字段(1~366) 。
getDayOfWeek()获取 星期字段,这是一个枚举。
getMonth()使用枚举获取月份字段。
getMonthValue()/ getYear()获取 从 1 到 12 的月份字段/ 获取年份字段
getHour()/ getMinute()/ getSecond()获取 当前对象对应的时、分、秒字段。
withDayOfMonth()/ withDayOfYear()/ withMonth()/ withYear()将月份天数、年份天数、月份、年份设置为指定的值,并返回新的对象
with(TemporalAdjuster adjuster)将当前日期时间设置为校对器指定的日期时间
plusHours()/ plusDays()/ plusWeeks()/ plusMonths()/ plusYears()向当前对象 添加 几个小时、几天、几周、几月、几年
minusHours()/ minusDays()/ minusWeeks()/ minusMonths()/ minusYears()从当前对象减去几个小时、几天、几周、几月、几年
plus(TemporalAmount t)/ minus(TemporalAmount t)添加或减少 一个 Duration(期间) 或Period(时期)
isBefore()/ isAfter()比较两个 LocalDate
isLeapYear()判断是否为 闰年
format(DateTimeFormatter t)格式化本地日期、时间,返回一个字符串
parse(CharSequence text)将指定格式的字符串解析为日期、时间
/** Jdk1.8的 API1. 
 * LocalDate、LocalTime、LocalDateTime*/
    @Test
    public void test1(){
        /*1. static LocalDate now():获取当前日期和时间对应的实例 */
        LocalDate localDate = LocalDate.now();
        LocalTime localTime = LocalTime.now();
        LocalDateTime localDateTime = LocalDateTime.now();

        System.out.println(localDate);//2023-03-24
        System.out.println(localTime);//15:56:17.730
        System.out.println(localDateTime);//2023-03-24T15:56:17.730

        /*2. static LocalDate of(int year, Month month, int dayOfMonth):获取指定的日期、时间对应的实例*/
        LocalDate localDate1 = LocalDate.of(2022, 10, 01);
        LocalDateTime localDateTime1 = LocalDateTime.of(2021, 10, 01, 12, 25);
        System.out.println(localDate1);//2022-10-01
        System.out.println(localDateTime1);//2021-10-01T12:25
    }

    /** 1.2 getXxx() 获取;withXxx()设置;plusXxx()添加*/
    @Test
    public void test2(){
        /*1. getDayOfMonth() 获取 */
        LocalDateTime localDateTime1 = LocalDateTime.now();
        System.out.println(localDateTime1.getDayOfMonth());//24

        /**体现了不可变性*/
        /*2. withDayOfMonth(int i) 设置 */
        LocalDateTime localDateTime2 = localDateTime1.withDayOfMonth(12);
        System.out.println(localDateTime1);//2023-03-24T16:57:05.096
        System.out.println(localDateTime2);//2023-03-12T16:57:05.096

        /*3. plusXxx() 添加 */
        LocalDateTime localDateTime3 = localDateTime1.plusDays(5);
        LocalDateTime localDateTime4 = localDateTime2.plusDays(-5);
        System.out.println(localDateTime1);//2023-03-24T17:17:07.588
        System.out.println(localDateTime3);//2023-03-29T17:17:07.588
        System.out.println(localDateTime4);//2023-03-07T17:17:07.588
    }

4.4.2 Instant:瞬时;类似Date

  • Instant:时间线上的一个瞬时点。这可能被用来记录应用程序中的事件时间戳。
  • java.time.Instant:时间线上的一点,而不需要任何上下文信息(例如:时区)。它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数
  • 应用场景:订单号的生成
  1. 实例化:now()、ofEpochMilli(xx, xx, xx)
  2. 方法:toEpochMilli()
方法描述
now()静态方法,返回默认UTC时区的 Instant类的对象
ofEpochMilli(long epochMilli)静态方法,返回在 “1970-01-01 00:00:00”基础上加上指定毫秒数之后的 Instant类的对象
toEpochMilli()返回从 “1970-01-01 00:00:00”到此刻的毫秒数,即为时间戳
  1. 中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚时差均为+8,也就是UTC+8
  2. instant.atOffset(ZoneOffset.ofHours(8)); 时区偏移量
/** Jdk1.8的 API2. Instant */
    @Test
    public void test3(){
        // 1.now()
        Instant instant1 = Instant.now();
        System.out.println(instant1);//2023-03-24T09:56:39.591Z

        //  2.了解 atOffset(ZoneOffset.ofHours(8))
        OffsetDateTime instant2 = instant1.atOffset(ZoneOffset.ofHours(8));
        System.out.println(instant2);//2023-03-24T17:56:39.591+08:00

        //3.ofEpochMilli(long Milli)-->类似于Date
        Instant instant3 = Instant.ofEpochMilli(124578986532L);
        System.out.println(instant3);//1973-12-12T21:16:26.532Z

        //4.toEpochMilli() 获取时间戳
        long milliTime = instant1.toEpochMilli();
        System.out.println(milliTime);//1679652614997

        long time = new Date().getTime();
        System.out.println(time);//1679652615103
    }

4.4.3 DateTimeFormatter

1)DateTimeFormatter—>类似于 SimpleDateFormate:用于日期的格式化和 解析

  1. DateTimeFormatter主要是对LocalDate、LocalTime、LocalDateTime进行格式化、解析
  2. SimpleDateFormate是对 Date进行格式化、解析

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

方法描述
ofPattern(String pattern)静态方法,返回一个指定字符串格式的 DateTimeFormatter
format(localDateTime)格式化日期
parse(“2023/03/24 19:46:27”) + from(temporalAccessor)解析日期、时间字符串
/**Jdk1.8的 API3. DateTimeFormatter*/
    @Test
    public void test4(){
        //自定义格式,如:ofPattern("yyyy/MM/dd HH:mm:ss")
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");

        //格式化时间:日期、时间 -->字符串
        LocalDateTime localDateTime = LocalDateTime.now();
        String strDateTime = dateTimeFormatter.format(localDateTime);
        System.out.println(strDateTime);//2023/03/24 19:46:27

        //解析:字符串 -->日期、时间
        TemporalAccessor temporalAccessor = dateTimeFormatter.parse("2023/03/24 19:46:27");
        System.out.println(temporalAccessor);//{},ISO resolved to 2023-03-24T19:46:27
        //转化格式
        LocalDateTime localDateTime1 = LocalDateTime.from(temporalAccessor);
        System.out.println(localDateTime1);//2023-03-24T19:46:27
    }

4.4.4 其他API

4.1 ZoneId、ZonedDateTime(了解)

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

  • ZoneId:包含了所有的时区信息,一个时区的ID
  • ZonedDateTime:一个在 ISO-8601 日历系统市区的日趋时间
    其中每个时区都对应一个ID,地区ID都为 “{区域}/{城市}” 的格式,如:Asia/Shanghai 等
  • 常见时区:

Asia/Shanghai
UTC
America/New_York

  • 可以通过 ZoneId获取所有可用的时区ID:
/**
     * 1. 时区相关:ZoneId、ZonedDateTime
     */
    @Test
    public void test1(){
        /*需要知道一些时区ID ;
        Set<String>是一个集合,容器*/
        Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
        //快捷模板
        for (String availableZoneId : availableZoneIds) {
            System.out.println(availableZoneId);
        }
    }

    @Test
    public void test2(){
        ZonedDateTime t1 = ZonedDateTime.now();
        System.out.println(t1);

        ZonedDateTime t2 = ZonedDateTime.now(ZoneId.of("America/New_York"));
        System.out.println(t2);

    }
4.2 持续日期/时间:Period和 Duration(了解)

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

    @Test
    public void test3() {
        LocalDate nowTime = LocalDate.now();
        LocalDate oldTime = LocalDate.of(2018, 8, 15);
        Period between = Period.between(nowTime, oldTime);
        System.out.println(between);

        System.out.println("相差年数:" + between.getYears());// 相差年数:-4
        System.out.println("相差月数:" + between.getMonths());// 相差月数:-7
        System.out.println("相差日数:" + between.getDays());// 相差日数:-9
        System.out.println("相差总数:" + between.toTotalMonths());// 相差总月数:-55
    }
    @Test
    public void test4() {
        LocalDateTime t1 = LocalDateTime.now();
        LocalDateTime t2 = LocalDateTime.of(2018,10,01,0,0,0);
        Duration between = Duration.between(t1, t2);
        System.out.println(between);

        System.out.println("相差天数:" + between.toDays());
        System.out.println("相差小时数:" + between.toHours());
        System.out.println("相差分钟数:" + between.toMinutes());
        System.out.println("相差秒数:" + between.getSeconds());
        System.out.println("相差毫秒数:" + between.toMillis());
        System.out.println("相差纳秒数:" + between.toNanos());
        System.out.println("不够一秒的纳秒数:" + between.getNano());
    }
  1. Duration,用于计算两个 “时间” 间隔,以秒和纳秒为基准:
 @Test
    public void test5() {
        LocalTime time1 = LocalTime.now();
        LocalTime time2 = LocalTime.of(15, 23, 30);

        // between: 日期间隔,返回 Duration对象,表示两个时间的间隔
        Duration duration = Duration.between(time1, time2);
        System.out.println(duration);// 结果,PT-5H-30M-48.355S

        System.out.println(duration.getSeconds());// 结果,-19849
        System.out.println(duration.getNano());// 结果,645000000

        LocalDateTime localDateTime1 = LocalDateTime.of(2016, 6, 6, 12, 32, 30);
        LocalDateTime localDateTime2 = LocalDateTime.of(2017, 6, 6, 12, 32, 30);

        Duration duration1 = Duration.between(localDateTime1, localDateTime2);
        System.out.println(duration1.toDays());// 结果,365
    }
  1. Period,用于计算两个 “日期” 间隔,以年、月、日衡量:
    @Test
    public void test6() {
    	LocalDate now = LocalDate.now();
        LocalDate date = LocalDate.of(2035, 10, 24);

        Period period = Period.between(now, date);
        System.out.println(period);// 结果,P12Y7M

        System.out.println(period.getYears());// 结果,12
        System.out.println(period.getMonths());// 结果,7
        System.out.println(period.getDays());// 结果,0

        Period period1 = period.withYears(2);
        System.out.println(period1);// 结果,P2Y7M
    }
4.3 Clock(了解)

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

4.4 TemporalAdjuster时间校正器
  1. TemporalAdjuster,时间校正器。有时我们需要可能获取。如:将日期调整到 “下一个工作日” 等;
  2. TemporalAdjusters:该类通过静态方法(firstDayOfXxx()、lastDayOfXxx()、nextXxx())提供了大量的常用 TemporalAdjuster的实现。
package com.lCommonClasses.eDateAndDateFormate;
import org.junit.Test;
import java.time.*;
import java.time.temporal.*;
public class TimeJdk8_4 {
    @Test
    public void test1(){
        //获取当前日期的下一个周日是哪天?
        TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY);
        LocalDateTime localDateTime = LocalDateTime.now().with(temporalAdjuster);
        System.out.println(localDateTime);

        //获取下一个工作日是哪天?
        LocalDate workDate = LocalDate.now().with(new TemporalAdjuster() {
            @Override
            public Temporal adjustInto(Temporal temporal) {
                LocalDate date = (LocalDate) temporal;
                if (date.getDayOfWeek().equals(DayOfWeek.FRIDAY)){
                    return date.plusDays(3);
                }else if (date.getDayOfWeek().equals(DayOfWeek.SATURDAY)){
                    return date.plusDays(2);
                }else {
                    return date.plusDays(1);
                }
            }
        });
        System.out.println("下一个工作日是:"+workDate);
    }
}

4.4.5 与传统日期处理的转换

To 遗留类From 遗留类
java.time.Instant与 java.util.DateDate.from( instant)date.toInstant()
java.time.Instant与 java.sql.TimestampTimestamp.from( instant)timestamp.toInstant()
java.time.ZonedDateTime与 java.util.GregorianCalendarGregorianCalendar.from( ZonedDateTime)cal.toZonedDateTime()
java.time.LocalDate与 java.sql.TimeDate.valueOf( localDate)date.toLocalDate()
java.time.LocalTime与 java.sql.TimeDate.valueOf( localDate)date.toLocalDate()
java.time.LocalDateTime与 java.sql.TimestampTimestamp.valueOf( localDateTime)timestamp.toLocalDateTime()
java.time.ZoneId与 java.util.TimeZoneTimezone.getTimeZone( id)timeZone.toZoneId()
java.time.format.DateTimeFormatter与 java.text.DateFormatformatter.toFormat()

4.4.6 练习题:获取百天日期

package com.lCommonClasses.eDateAndDateFormate;
import org.junit.Test;
import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.Date;

public class TimeInterview1 {
    /**
     * 1.使用 Calendar获取当前时间,把这个时间设置为你的生日,
     * 再获取你的百天(出生后第100天)日期
     */
    @Test
    public void test1(){
        Calendar calendar = Calendar.getInstance();
        Date date = calendar.getTime();
        System.out.println("出生日期:" + date);

        calendar.add(Calendar.DAY_OF_YEAR,100);
        Date hundredDay = calendar.getTime();
        System.out.println("百天日期是:" + hundredDay);
    }

    /**
     * 2.使用 LocalDateTime获取当前时间,把这个时间设置为你的生日,
     * 再获取你的百天(出生后第100天)日期
     */
    @Test
    public void test2(){
        LocalDateTime date = LocalDateTime.now();
        System.out.println("出生日期:" + date);

        LocalDateTime hundredDay = date.plusDays(100);
        System.out.println("百天日期是:" + hundredDay);
    }
}

4.5 日期互转

4.5.1 long与Date、Calendar

package com.lCommonClasses.dateAndDateFormate;

import java.util.Calendar;
import java.util.Date;

/** DateReversal日期互转1: long与 Date、Calendar */
public class DateReversal1 {
    public static void main(String[] args) {
        /** 1.1 long与 Date */
        Date date = new Date();
        long time = date.getTime();
        System.out.println(date);
        System.out.println(time);

        /** 1.2 long与Calendar */
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR,2021);
        calendar.set(Calendar.MONTH,11);
        calendar.set(Calendar.DAY_OF_MONTH,6);
        long timeInMillis = calendar.getTimeInMillis();
        System.out.println(calendar);
        System.out.println(timeInMillis);
    }
}

4.5.2 Date与Calendar互转

package com.lCommonClasses.dateAndDateFormate;

import java.util.Calendar;
import java.util.Date;

/** DateReversal日期互转2: Date与 Calendar互转 */
public class DateReversal2 {
    public static void main(String[] args) {
        /**2.1 Date转 Calendar*/
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 结果,Sun Mar 19 20:36:20 CST 2023
        System.out.println(calendar.getTime());

        /** 2.1 Calendar转 Date */
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR,2000);
        //月份自动 +1,即实际值是:12
        c.set(Calendar.MONTH,11);
        c.set(Calendar.DAY_OF_MONTH,22);
        c.add(Calendar.DAY_OF_MONTH,2);
        // 结果,Sun Dec 24 21:14:33 CST 2000
        System.out.println(c.getTime());
    }
}

4.5.3 Date与String互转

package com.lCommonClasses.dateAndDateFormate;

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

/** DateReversal日期互转3: Date与 String互转 */
public class DateReversal3 {
    public static void main(String[] args) {
        /**3.1 Date转String*/
        SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
        String dateStr=sdf.format(new Date());
        System.out.println(dateStr);// 结果,2023-03-19

        /**3.2 String转 Date: 注意格式必须一致*/
        String str="2022-11-06";
        SimpleDateFormat sDF= new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = sDF.parse(str);
            System.out.println(date);
        } catch (ParseException e) {
            System.out.println("String转 Date错误");
        }
    }
}

4.5.4 Calendar与String互转

package com.lCommonClasses.dateAndDateFormate;

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

/** DateReversal日期互转4: Calendar与 String互转 */
public class DateReversal4 {
    public static void main(String[] args) throws ParseException {
        /** 4.1 Calendar 转化成 String*/
        Calendar c = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str = sdf.format(c.getTime());
        // String str = sdf.format(new Date());
        System.out.println(str);

        /** 4.2 String (先转Date,再)转化成 Calendar*/
        String str1="2020-11-6";
        SimpleDateFormat sdf1= new SimpleDateFormat("yyyy-MM-dd");
        Date date =sdf1.parse(str1);
        c.setTime(date);
        System.out.println(c.getTime());
    }
}
  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值