Java时间类

3 篇文章 0 订阅

JDK8之前

java.lang.System类

System类提供的public static long currentTimeMillis()用来返回当前时 间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。此方法适于计算时间差。

计算世界时间的主要标准有:
UTC(Coordinated Universal Time) 协调世界时
协调世界时(英:Coordinated Universal Time),又称世界统一时间,世界标准时间,国际协调时间。英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。
世界标准时间UTC:GMT+0
GMT(Greenwich Mean Time) 格林尼治平时
世界时UT 即格林尼治时间,格林尼治所在地的标准时间。以地球自转为基础的时间计量系统。地球自转的角度可用地方子午线相对于地球上的基本参考点的运动来度量。为了测量地球自转,人们在地球上选取了两个基本参考点:春分点(见分至点)和平太阳,由此确定的时间分别称为恒星时和平太阳时。
但是格林尼治本地的时间比格林尼治平时,大一小时,也就是格林尼治本地的时间:GMT+1
CST(Central Standard Time) 北京时间
通常我们在数据库中存放,或者给用户看的时间都是CST时间
北京时间CST:GMT+8

java.util.Date类

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

构造器:
Date():使用无参构造器创建的对象可以获取本地当前时间。
Date(long date)

常用方法
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是时间标准。

import java.util.Date; Date date = new Date(); 
System.out.println(date); 
System.out.println(System.currentTimeMillis()); 
System.out.println(date.getTime()); 
Date date1 = new Date(date.getTime()); 
System.out.println(date1.getTime()); 
System.out.println(date1.toString());
result:
Sun Nov 17 10:05:05 CST 2019
1573956305354
1573956305328
1573956305328
Sun Nov 17 10:05:05 CST 2019

java.text.SimpleDateFormat类

Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat 类是一个不与语言环境有关的方式来格式化和解析日期的具体类。 它允许进行格式化:日期---->文本、解析:文本—>日期

格式化:
SimpleDateFormat() :默认的模式和语言环境创建对象
public SimpleDateFormat(String pattern):该构造方法可以用参数pattern 指定的格式创建一个对象,该对象调用1
public String format(Date date):方法格式化时间对象date

解析:
public Date parse(String source):从给定字符串的开始解析文本,以生成 一个日期。

Date date = new Date(); // 产生一个Date实例 
// 产生一个formater格式化的实例 
SimpleDateFormat formater = new SimpleDateFormat(); 
System.out.println(formater.format(date));// 打印输出默认的格式 
SimpleDateFormat formater2 = new SimpleDateFormat("yyyy年MM月dd日 EEE HH:mm:ss"); 
System.out.println(formater2.format(date)); 
}
result:
19-11-17 上午10:26
20191117日 星期日 10:26:58

java.util.Calendar(日历)类

Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。

获取Calendar实例的方法
使用Calendar.getInstance()方法
调用它的子类GregorianCalendar的构造器。

一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想 要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、 MINUTE、SECOND
public void set(int field,int value)
public void add(int field,int amount)
public final Date getTime()
public final void setTime(Date date)
注意:
获取月份时:一月是0,二月是1,以此类推,12月是11
获取星期时:周日是1,周二是2 , 。。。。周六是7

Calendar calendar = Calendar.getInstance(); 
System.out.println(calendar);
Date date = calendar.getTime(); // 从一个 Calendar 对象中获取 Date 对象 
System.out.println(date);
date = new Date(234234235235L);
System.out.println(date);
calendar.setTime(date); // 使用给定的 Date 设置此 Calendar 的时间  
System.out.println(calendar);
calendar.set(Calendar.DAY_OF_MONTH, 8); 
System.out.println("当前时间日设置为8后,时间是:" + calendar.getTime()); 
calendar.add(Calendar.HOUR, 2); 
System.out.println("当前时间加2小时后,时间是:" + calendar.getTime()); 
calendar.add(Calendar.MONTH, -2); 
System.out.println("当前日期减2个月后,时间是:" + calendar.getTime());
result:
java.util.GregorianCalendar[time=1573958152913,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=10,WEEK_OF_YEAR=47,WEEK_OF_MONTH=4,DAY_OF_MONTH=17,DAY_OF_YEAR=321,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=3,AM_PM=0,HOUR=10,HOUR_OF_DAY=10,MINUTE=35,SECOND=52,MILLISECOND=913,ZONE_OFFSET=28800000,DST_OFFSET=0]
Sun Nov 17 10:35:52 CST 2019
Sat Jun 04 09:03:55 CST 1977
java.util.GregorianCalendar[time=234234235235,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=1977,MONTH=5,WEEK_OF_YEAR=23,WEEK_OF_MONTH=1,DAY_OF_MONTH=4,DAY_OF_YEAR=155,DAY_OF_WEEK=7,DAY_OF_WEEK_IN_MONTH=1,AM_PM=0,HOUR=9,HOUR_OF_DAY=9,MINUTE=3,SECOND=55,MILLISECOND=235,ZONE_OFFSET=28800000,DST_OFFSET=0]
当前时间日设置为8,时间是:Wed Jun 08 09:03:55 CST 1977
当前时间加2小时后,时间是:Wed Jun 08 11:03:55 CST 1977
当前日期减2个月后,时间是:Fri Apr 08 11:03:55 CST 1977

JDK8之后

  • Date 类新增了 toInstant() 方法, 用于把 Date 转换成新的表示形式。

java.time包

  • java.time – 包含值对象的基础包 ,包含了所有关于本地日期(LocalDate)、本地时间 (LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime) 和持续时间(Duration)的类
  • java.time.chrono – 提供对不同的日历系统的访问
  • java.time.format – 格式化和解析时间和日期
  • java.time.temporal – 包括底层框架和扩展特性
  • java.time.zone – 包含时区支持的类

LocalDate、LocalTime、LocalDateTime 类

LocalDate、LocalTime、LocalDateTime 类是其中较重要的几个类,它们的实例 是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。 它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。

LocalDate代表ISO格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。
LocalTime表示一个时间,而不是日期。
LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。
注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示 法,也就是公历。
在这里插入图片描述

Instant类

Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01 日08时00分00秒)起至现在的总秒数。
在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是 时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连 续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机 处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中, 也是从1970年开始,但以毫秒为单位。
java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间 单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。 概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒 数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。 (1ns= 10^-9 (10的负9次方) ) 1秒 = 1000毫秒 =106微秒=109纳秒
在这里插入图片描述

java.time.format.DateTimeFormatter 类

该类提供了三种格式化方法:
预定义的标准格式。如: ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
在这里插入图片描述

其它API

ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris
ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12- 03T10:15:30+01:00 Europe/Paris。
其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如: Asia/Shanghai等
Clock:使用时区提供对当前即时、日期和时间的访问的时钟。
持续时间:Duration,用于计算两个“时间”间隔
日期间隔:Period,用于计算两个“日期”间隔
TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整 到“下一个工作日”等操作。
TemporalAdjusters : 该类通过静态方法 (firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用 TemporalAdjuster 的实现。

//Duration:用于计算两个“时间”间隔,以秒和纳秒为基准 
LocalTime localTime = LocalTime.now(); 
LocalTime localTime1 = LocalTime.of(15, 23, 32); 
//between():静态方法,返回Duration对象,表示两个时间的间隔 
Duration duration = Duration.between(localTime1, localTime); 
System.out.println(duration); 
System.out.println(duration.getSeconds()); 
System.out.println(duration.getNano()); 
LocalDateTime localDateTime = LocalDateTime.of(2016, 6, 12, 15, 23, 32); 
LocalDateTime localDateTime1 = LocalDateTime.of(2017, 6, 12, 15, 23, 32); 
Duration duration1 = Duration.between(localDateTime1, localDateTime); 
System.out.println(duration1.toDays());

//Period:用于计算两个“日期”间隔,以年、月、日衡量 
LocalDate localDate = LocalDate.now(); 
LocalDate localDate1 = LocalDate.of(2028, 3, 18); 
Period period = Period.between(localDate, localDate1); 
System.out.println(period); 
System.out.println(period.getYears()); 
System.out.println(period.getMonths()); 
System.out.println(period.getDays()); 
Period period1 = period.withYears(2); 
System.out.println(period1);

// TemporalAdjuster:时间校正器 
// 获取当前日期的下一个周日是哪天? 
TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY); 
LocalDateTime localDateTime = LocalDateTime.now().with(temporalAdjuster); 
System.out.println(localDateTime); 
// 获取下一个工作日是哪天? 
LocalDate localDate = 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("下一个工作日是:" + localDate);

与传统日期处理的转换

在这里插入图片描述


  1. 自定义格式字
     ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值