Java 时间日期类API

Java 关于日期时间API

Java中关于日期时间API分为JDK8之前JDK8两类日期时间API

JDK8之前

System类的方法

  • currentTimeMillis() 用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。

    获取当前时间对应的毫秒数,long类型,时间戳

    当前时间与1970年1月1日0时0分0秒之间的毫秒数

    常用来计算时间差

java.util.Date

构造器
Date():使用无参构造器创建的对象可以获取本地当前时间。
Date(long 毫秒数):把该毫秒值换算成日期时间对象
常用方法
getTime(): 返回自 19701100:00:00 GMT 以来此 Date 对象表示的毫秒数。
toString(): 把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准。
import java.util.Date;
public DateTimeTest{
    public static void main(String []args){
        Date d1 = new Date();					//创建一个基于当前系统时间Date的实例
        System.out.println(d1);
        System.out.println(d1.toString());
        System.out.println(d1.getTime());		//输出对应毫秒数

        Date d2 = new Date(1718987075508L);		//创建一个基于指定时间戳的Date的实例
        System.out.println(d2.toString());
    }
}
//输出结果
Sat Jun 22 00:26:26 CST 2024
Sat Jun 22 00:26:26 CST 2024
1718987186574
Sat Jun 22 00:24:35 CST 2024

Java.sql.Date

import java.sql.Date;
public class DateTest{
    public static void main(String []args){
        Date d1 = new Date(1718987075508L);
        System.out.println(d1.toString());
        System.out.println(d1.getTime());
    }
}
//输出结果
2024-06-22
1718987075508

java.text.SimpleDateFormat

  • java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类
  • 可以进行格式化 : 日期 ——> 文本
  • 可以进行解析: 文本——>日期 简单来说,将字符串转化为时间
import java.text.SimpleDateFormat;
 public void test2() throws ParseException {
//        格式化 , 将日期转化为字符串
        SimpleDateFormat sdf = new SimpleDateFormat();
        java.util.Date date = new Date();
        String strDate = sdf.format(date);
        System.out.println(strDate);    //2024/6/22 00:56
//          解析,将字符串转化为日期
        Date date1 = sdf.parse("2024/6/22 00:54");
        System.out.println(date1);  //Sat Jun 22 00:54:00 CST 2024
    }

也可以根据自己需求,制定日期的格式

日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串中,未加引号的字母 'A''Z''a''z' 被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (') 引起来,以免进行解释。"''" 表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。

定义了以下模式字母(所有其他字符 'A''Z''a''z' 都被保留):

字母日期或时间元素表示示例
GEra 标志符TextAD
yYear1996; 96
M年中的月份MonthJuly; Jul; 07
w年中的周数Number27
W月份中的周数Number2
D年中的天数Number189
d月份中的天数Number10
F月份中的星期Number2
E星期中的天数TextTuesday; Tue
aAm/pm 标记TextPM
H一天中的小时数(0-23)Number0
k一天中的小时数(1-24)Number24
Kam/pm 中的小时数(0-11)Number0
ham/pm 中的小时数(1-12)Number12
m小时中的分钟数Number30
s分钟中的秒数Number55
S毫秒数Number978
z时区General time zonePacific Standard Time; PST; GMT-08:00
Z时区RFC 822 time zone-0800
日期和时间模式结果
"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

例如,EEE, MMM d, ''yy,则输出会按照Wed, Jul 4, '01 格式

public class Test{
   public void test2() throws ParseException {
//        格式化 , 将日期转化为字符串
       SimpleDateFormat sdf = new SimpleDateFormat("EEE, MMM d, ''yy");
       java.util.Date date = new Date();
       String strDate = sdf.format(date);
       System.out.println(strDate);  
//          解析,将字符串转化为日期
       Date date1 = sdf.parse(strDate);
       System.out.println(date1);  
   }
}
//输出
//周六, 6月 22, '24
//Sat Jun 22 00:00:00 CST 2024

Date有两种包中都存在java.util.Datejava.sql.Date,如何将控制台获取的年月日的字符串数据,保存在数据库中?

public class DateTest{
    public static void main(String []args){
        java.util.Date d1 = new Date();
        java.sql.Date d2 = new java.sql.Date(d1.getTime());
    }
}

java.util.Calendar(日历)

calendar是一个抽象类,需要创建子类的实例

获取Calendar实例的方法

  • 使用Calendar.getInstance()方法
  • 调用它的子类GregorianCalendar(公历)的构造器。

常用方法

- 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的时间
public class Test{
    public static void main(String []args){
        Calendar calendar = Calendar.getInstance();
        //get(int field)
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //22
        //set(int field,xx)
        calendar.set(Calendar.DAY_OF_MONTH,22);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //22
        //add(int field,xx)
        calendar.add(Calendar.DAY_OF_MONTH,1);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //22
        calendar.add(Calendar.DAY_OF_MONTH,5);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //28
        //getTime()  将calender——>Date
        Date date = calendar.getTime();
        System.out.println(date);           //Fri Jun 28 01:27:04 CST 2024
        //setTime()  将Date ——> calender  使用指定Date设置Calender
        calendar.setTime(new Date());
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //22
    }
}

JDK8.0,新日期时间API

Calendar和Date存在着一些问题

  • 可变性:像日期和时间这样的类应该是不可变的。

  • 偏移性:Date中的年份是从1900开始的,而月份都从0开始。

  • 格式化:格式化只对Date有用,Calendar则不行。

  • 此外,它们也不是线程安全的;不能处理闰秒等。

public class Test{
   public static void main(String []args){
 //Calendar可变性
       Calendar calendar = Calendar.getInstance();
       System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //22
       calendar.set(Calendar.DAY_OF_MONTH,4);
       System.out.println(calendar.get(Calendar.DAY_OF_MONTH));    //4
       //偏移性
       Date d1 = new Date(2022,12,1);
       System.out.println(d1.toString());  //Mon Jan 01 00:00:00 CST 3923 ,此时是基于1900来说的2022年
   }
}

对日期和时间的操作,在java 8 引入新的API,可以正常使用

java.time

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

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

本地日期时间:LocalDate、LocalTime、LocalDateTime

方法描述
now() / now(ZoneId zone)静态方法,根据当前时间创建对象/指定时区的对象
of(xx,xx,xx,xx,xx,xxx)静态方法,根据指定日期/时间创建对象
getDayOfMonth()/getDayOfYear()获得月份天数(1-31) /获得年份天数(1-366)
getDayOfWeek()获得星期几(返回一个 DayOfWeek 枚举值)
getMonth()获得月份, 返回一个 Month 枚举值
getMonthValue() / getYear()获得月份(1-12) /获得年份
getHours()/getMinute()/getSecond()获得当前对象对应的小时、分钟、秒
withDayOfMonth()/withDayOfYear()/withMonth()/withYear()将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
with(TemporalAdjuster t)将当前日期时间设置为校对器指定的日期时间
plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours()向当前对象添加几天、几周、几个月、几年、几小时
minusMonths() / minusWeeks()/minusDays()/minusYears()/minusHours()从当前对象减去几月、几周、几天、几年、几小时
plus(TemporalAmount t)/minus(TemporalAmount t)添加或减少一个 Duration 或 Period
isBefore()/isAfter()比较两个 LocalDate
isLeapYear()判断是否是闰年(在LocalDate类中声明)
format(DateTimeFormatter t)格式化本地日期、时间,返回一个字符串
parse(Charsequence text)将指定格式的字符串解析为日期、时间
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Test{
    public static void main(String []args){
//JDK8 的api, LocalDate , LocalTime, LocalDateTime
        //now(),获取当前日期和时间
        LocalDate localDate = LocalDate.now();
        LocalTime localTime = LocalTime.now();
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDate);
        System.out.println(localTime);
        System.out.println(localDateTime);
        //2024-06-22
        //01:48:23.292879500
        //2024-06-22T01:48:23.294301


        //of(): 获取指定日期,时间的对应实例
        LocalDate localDate1 = LocalDate.of(2024,6,22);
        LocalTime localTime1 = LocalTime.of(12,3,45);
        System.out.println(localDate1);
        System.out.println(localTime1);
        //2024-06-22
        //12:03:45

        //getXXX()
        System.out.println(localDate1.getMonth());  //JUNE
        System.out.println(localDate1.getDayOfYear());  //174

        //不可变性
        //使用withXXX()系列方法,可以将日期修改为指定日期,并返回值
        System.out.println(localDateTime);
        LocalDateTime localDateTime1 = localDateTime.withYear(2023);
        System.out.println(localDateTime1);
        System.out.println(localDateTime);
        //2024-06-22T01:57:04.071432400
        //2023-06-22T01:57:04.071432400     返回值赋道localDateTime1中了,但localDateTime没有改变
        //2024-06-22T01:57:04.071432400

    }
}

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到当前时间的毫秒数,即为时间戳
public class InstantTest{
    public static void main(String []args){
        Instant instant = Instant.now();
        System.out.println(instant);
        //2024-06-21T18:01:37.922280800Z

        long milliTime = instant.toEpochMilli();
        System.out.println(milliTime);
        //1718993008494
    }
}

日期时间格式化:DateTimeFormatter

ofPattern(String pattern)静态方法,返回一个指定字符串格式的DateTimeFormatter
format(TemporalAccessor t)格式化一个日期、时间,返回字符串
parse(CharSequence text)将指定格式的字符序列解析为一个日期、时间
public class Test{
    public static void main(String []args){
        //自定义的格式,ofPattern()
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
        //格式化,日期、时间——>字符串
        LocalDateTime localDateTime = LocalDateTime.now();
        String strDateTime = dateTimeFormatter.format(localDateTime);
        System.out.println(strDateTime);
        //2024-06-22 02:07:41

        //解析,将字符串——> 日期、时间
        TemporalAccessor temporalAccessor = dateTimeFormatter.parse("2022/12/05 15:04:44");
        LocalDateTime localDateTime1 = LocalDateTime.from(temporalAccessor);
        System.out.println(localDateTime1);
    }
}

与传统日期处理的转换

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.toLocalTime()
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()
  • 22
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值