跳过正文
  1. 文章/
  2. Java/
  3. 常用API/
  4. JDK原生/

1、时间日期

·5444 字·11 分钟· loading · loading · ·
Java 常用API JDK原生
GradyYoung
作者
GradyYoung
JDK原生 - 点击查看当前系列文章
§ 1、时间日期 「 当前文章 」

java.lang.System
#

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

long time = System.currentTimeMillis();

java.util.Timer
#

TimerTimerTask 用于在后台线程中调度任务的 java.util 类。 TimerTask 负责任务的执行, Timer 负责任务的调度。

构造方法
#

  • Timer():创建一个定时器
  • Timer(boolean isDaemon):创建一个定时器,指定其线程是否为守护线程
  • Timer(String name):创建一个定时器,指定线程名
  • Timer(String name,boolean isDaemon):创建一个定时器,并且指定其线程是否为守护线程

常用方法
#

  • cancel():终止计时器,丢弃所有已安排的任务
  • purge():从任务队列中移除所有已取消的任务
  • schedule(TimerTask task,Date time):在指定时间执行指定任务
  • schedule(TimerTask task,Date firstTiime,long period):在指定时间执行指定任务,并按照固定延迟重复执行
  • schedule(TimerTask task,long delay):在指定延迟后执行一次指定任务
  • schedule(TimerTask task,long delay,long period):在指定延迟后执行指定任务,并按照固定延迟重复执行
  • scheduleAtFixedRate(TimerTask task,Date firstTiime,long period):在指定时间执行指定任务,并按照固定速率重复执行
  • scheduleAtFixedRate(TimerTask task,long delay,long period):在指定延迟后执行指定任务,并按照固定速率重复执行
Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        System.out.println(new Date());
    }
},0,2000);

java.util.Date
#

java.util.Date是用来处理日期、时间的一个类,并且自带toString()方法

构造方法
#

  • Date():创建一个对应当前时间的Date对象
  • Date(long date):创建指定毫秒数的Date对象

常用方法
#

  • toString():把此 Date 对象转换为以下形式的字符串: dow mon dd hh:mm:ss zzz yyyy,显示当前的年、月、日、时、分、秒 。 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准
  • getTime():返回自1970年1月1日00:00:00GMT以来此 Date 对象表示的毫秒数(时间戳)
  • boolean after(Date date):若当调用此方法的Date对象在指定日期之后返回true,否则返回false
  • boolean before(Date date):若当调用此方法的Date对象在指定日期之前返回true,否则返回false

java.sql.Date
#

java.sql.Date类为java.util.Date类的子类,为数据库的日期类型。

规范化java.sql.Date只包含年月日信息,时分秒毫秒都会清零,也就是说,如果你是2017-09-17 15:15:25这样的时间点存取数据,那么存在数据库中的值就是:2017-09-17 00:00:00

java.text.SimpleDateFormat
#

构造方法
#

  • public SimpleDateFormate():使用默认模式和日期格式
  • public SimpleDateFormate(String pattern):使用给定的模式和默认的日期格式

常用方法
#

  • public final String format(Date date):可以将Date类型的日期,转化为自定格式的字符串
  • public Date parse(String source):可以将字符串格式的日期,转化为Date类型的日期

格式化编码
#

字符 描述 实例
G 纪元标记 AD
y 四位年份 2001
M 月份 July or 07
d 一个月的日期 10
h A.M./P.M. (1~12)格式小时 12
H 一天中的小时 (0~23) 22
m 分钟数 30
s 秒数 55
S 毫秒数 234
E 星期几 Tuesday
D 一年中的日子 360
F 一个月中第几周的周几 2 (second Wed. in July)
w 一年中第几周 40
W 一个月中第几周 1
a A.M./P.M. 标记 PM
k 一天中的小时(1~24) 24
K A.M./P.M. (0~11)格式小时 10
z 时区 Eastern Standard Time

Demo
#

import java.text.ParseException; 
import java.text.SimpleDateFormat;
import java.util.Date; 
public class DateTest {   
  public static void main(String[] args) throws ParseException { 
    //Date类可以获取当前的日期      
    Date d1 = new Date();       
    //因为Date类有toString方法,所以可以直接输出      
    System.out.println(d1);         
    //SimpleDateFormat类的format方法,可以将Date类型的日期,转化为自定格式的字符串   
    //HH返回的是24小时制的时间
    //hh返回的是12小时制的时间   
    //其中yy-MM-dd HH-mm-ss中的字母格式固定    
    SimpleDateFormat s1 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");        
    String str1 = s1.format(d1);     
    System.out.println(str1);       
    //SimpleDateFormat类的parse方法,可以将固定格式的字符串日期,转化为Date类型      
    String str2 = "2020-3-12 18-50-44";      
    SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");         
    Date d2 = s2.parse(str2);  
    System.out.println(d2);   
  }
}
输出
Tue Mar 30 12:18:27 CST 2021
2021年03月30日 12时18分27秒 
Thu Mar 12 18:50:44 CST 2020

java.util.Calendar
#

Calendar类是一个抽象类,不可以被实例化,在程序中需要调用其静态方法getInstance()来得到一个Calendar对象,然后根据这个对象再调用其他的方法,例如:Calendar calendar = Calendar.getInstance();,一个Calendar的实例是系统时间的抽象表示。

Calendar常量
#

Calendar.YEAR //表示年份
Calendar.MONTH //表示月份,月份是从0开始计的,0-11
Calendar.DATE //表示当前时间为多少号(日历式的多少号)
Calendar.HOUR //表示小时(12小时制)
Calendar.HOUR_OF_DAY //表示小时(24小时制)
Calendar.MINUTE //表示分钟数
Calendar.SECOND //表示秒数
Calendar.MILLENSECOND //表示毫秒数
Calendar.WEEK_OF_MONTH //当前时间是所在当前月的第几个星期(日历式的第几周)
Calendar.WEEK_OF_YEAR //当前时间是所在当前年的第几个星期
Calendar.DAY_OF_WEEK_IN_MONTH //当前时间是所在当前月的第几个星期,以月份天数为标准,一个月的1号为第一周,8号为第二周
Calendar.DAY_OF_WEEK //一周七天中,当前时间是一周中的第几天,第一天是星期天,使用时需要-1
Calendar.DAY_OF_YEAR //表示一年中的第几天
Calendar.DAY_OF_MONTH //表示一个月中的第几天,结果等同于Calendar.DATE
Calendar.AM_PM //表示是上午还是下午
Calendar.SUNDAY //周日
Calendar.MONDAY //周一
Calendar.TUESDAY //周二
Calendar.WEDNSDAY //周三
Calendar.THURSDAY //周四
Calendar.FRIDAY //周五
Calendar.SATURDAY //周六

常用方法
#

  • public int get(int filed):根据日历常量,获取其对应的值
  • public final void set(int year,int month,int day):设置时间为指定的年,月,日
  • public final void set(int year, int month, int date, int hourOfDay, int minute,int second):设置年月日时分秒
  • public void set(int field, int value):设置指定日历常量的值
  • public abstract void add(int field,int amount):将指定的日历常量增加amount(负数则为减)
  • Date getTime():转java.util.Date
  • void setTime(Date date):根据Date设置Calendar
  • long getTimeInMillis():获取时间戳(毫秒)

与Date互转
#

Calendar instance = Calendar.getInstance();
// Calendar转Date
Date time = instance.getTime();
// Date转Calendar
instance.setTime(time);

JDK1.8新API
#

JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是:

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

Java 8 吸收了Joda-Time的精华,以一个新的开始为 Java 创建优秀的 API。 新的 java.time中包含了所有关于本地日期(LocalDate)、本地时(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。 历史悠久的Date类新增了toInstant()方法, 用于把Date转换成新的表示形式。这些新增的本地化时间日期 API 大大简化了日期时间和本地化的管理。

LocalDate、LocalTime、LocalDateTime
#

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

ISO-8601
#

ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法,也就是公历。

常用方法
#

  • now()/now(ZoneId zone):静态方法,根据当前时间创建对象/指定时区的对象
  • of():静态方法,根据指定日期/时间创建对象
  • getDayOfMonth()/getDayOfYear():获得月份天数(1-31) /获得年份天数(1-366)
  • getDayOfWeek():获得星期几(返回一个 DayOfWeek 枚举值)
  • getMonth():获得月份, 返回一个 Month 枚举值
  • getMonthValue() / getYear():获得月份(1-12) /获得年份
  • getHour()/getMinute()/getSecond():获得当前对象对应的小时、分钟、秒
  • withDayOfMonth():将月份天数修改为指定的值并返回新的对象
  • withDayOfYear():将年份天数修改为指定的值并返回新的对象
  • withMonth():将月份修改为指定的值并返回新的对象
  • withYear():将年份修改为指定的值并返回新的对象
  • plusDays():向当前对象添加几天
  • plusWeeks():向当前对象添加几周
  • plusMonths():向当前对象添加几个月
  • plusYears():向当前对象添加几年
  • plusHours():向当前对象添加几小时
  • minusMonths():从当前对象减去几月
  • minusWeeks():从当前对象减去几周
  • minusDays():从当前对象减去几天
  • minusYears():从当前对象减去几年
  • minusHours():从当前对象减去几小时

Demo
#

LocalDateTime dateTime = LocalDateTime.now();
System.out.println(dateTime); //2023-05-23T11:30:28.315
int year = dateTime.getYear();
System.out.println(year); // 2023
DayOfWeek dayOfWeek = dateTime.getDayOfWeek();
System.out.println(dayOfWeek.name()); // TUESDAY
System.out.println(dayOfWeek.getValue()); // 2

LocalDateTime localDateTime = dateTime.minusDays(30);
System.out.println(localDateTime); // 2023-04-23T11:30:28.315

LocalDateTime of = LocalDateTime.of(1998, 1, 20, 12, 30, 30, 30);
System.out.println(of); // 1998-01-20T12:30:30.000000030

java.time.Instant
#

Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。

它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。

常用方法
#

  • now():静态方法,返回默认UTC时区的Instant类的对象
  • ofEpochMilli(long epochMilli):静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
  • atOffset(ZoneOffset offset):结合即时的偏移来创建一个OffsetDateTime(加减时间)
  • toEpochMilli():返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
Instant now = Instant.now();
System.out.println(now); // 2023-05-23T03:41:05.227Z

long l = now.toEpochMilli();
System.out.println(l); // 1684813287231

OffsetDateTime offsetDateTime = now.atOffset(ZoneOffset.ofHours(10));
System.out.println(offsetDateTime); // 2023-05-23T13:41:05.227Z

Instant instant = Instant.ofEpochMilli(1684813265227L);
System.out.println(instant); // 2023-05-23T03:41:05.227Z

Date与LocalDate、LocalTime、LocalDateTime转换
#

Instant也常用于Date与LocalDate、LocalTime、LocalDateTime转换

Date date = new Date();
System.out.println(date); // Tue May 23 11:45:59 CST 2023
Instant instant = date.toInstant();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("UTC+8"));
System.out.println(localDateTime); // 2023-05-23T11:45:59.654
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime); // 2023-05-23T11:51:01.196
ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("UTC+8"));
Instant instant = zonedDateTime.toInstant();
Date from = Date.from(instant);
System.out.println(from); // Tue May 23 11:51:01 CST 2023

java.time.format.DateTimeFormatter
#

用来格式化LocalDateLocalTimeLocalDateTime

格式化
#

  • 预定义的标准格式:ISO_LOCAL_DATE_TIMEISO_LOCAL_DATEISO_LOCAL_TIME
  • 本地化相关的格式:ofLocalizedDateTime(FormatStyle.LONG)
  • 自定义的格式:ofPattern(“yyyy-MM-dd hh:mm:ss”)

常用方法
#

  • ofPattern(String pattern):静态方法 , 返回一个指定字符串格式的DateTimeFormatter
  • format(TemporalAccessor t):格式化一个日期、时间,返回字符串
  • parse(CharSequence text):将指定格式的字符序列解析为一个日期、时间

Demo
#

LocalDateTime now = LocalDateTime.now();

DateTimeFormatter f1 = DateTimeFormatter.ISO_DATE_TIME;
String str = f1.format(now);
System.out.println(str); // 2023-05-23T12:01:07.894

TemporalAccessor parse = f1.parse(str);
LocalDateTime from = LocalDateTime.from(parse);
System.out.println(from); // 2023-05-23T12:01:07.894

DateTimeFormatter SDF = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String str = SDF.format(now);
System.out.println(str); // 2023-05-23 12:01:07

java.time.Duration
#

Duration 是 Java 中表示时间段的类,用于计算两个时间点之间的间隔。它包含秒(seconds)和纳秒(nanos)两个部分,可以表示毫秒及更小的时间单位。与 Java 中的其他时间类不同,Duration 不包含毫秒这个属性。

常用方法
#

Duration.of(long duration):这个方法用于创建一个表示给定持续时间的Duration对象,单位为纳秒。持续时间可以是从零到Long.MAX_VALUE之间的任何值。

Duration.of(long amount, TemporalUnit unit):用于创建表示特定时间单位的持续时间对象。该方法接受两个参数:amount:表示持续时间的长整型数值。unit:表示时间单位的 TemporalUnit 枚举类型或其子类。

Duration.ofDays(long days):这个方法用于创建一个表示给定天数的Duration对象。

Duration.ofHours(long hours):这个方法用于创建一个表示给定小时数的Duration对象。

Duration.ofMinutes(long minutes):这个方法用于创建一个表示给定分钟数的Duration对象。

Duration.ofSeconds(long seconds):这个方法用于创建一个表示给定秒数的Duration对象。

Duration.ofMillis(long millis):这个方法用于创建一个表示给定毫秒数的Duration对象。

Duration.ofNanos(long nanos):这个方法用于创建一个表示给定纳秒数的Duration对象。

Duration.between(LocalDateTime start, LocalDateTime end):用于计算两个 LocalDateTime 对象之间的持续时间。该方法接受两个参数:start:表示起始时间的 LocalDateTime 对象。end:表示结束时间的 LocalDateTime 对象,返回值是Duration对象;

Duration.get(...):此方法返回在给定单位中的持续时间。它接受一个java.time.temporal.TemporalUnit参数,并返回该单位的数量。例如,如果你使用java.time.temporal.ChronoUnit.SECONDS,此方法将返回持续时间中的秒数。

Duration.plus(...):用于将当前Duration对象与另一个Duration对象相加,返回一个新的Duration对象,表示两个时间段的总和。

Duration.minus(...):用于从一个Duration对象中减去另一个Duration对象。它返回一个新的Duration对象,表示当前Duration对象与减去的那一个之间的差值。

Duration.toDays():将Duration对象转换为天数。它返回一个整数值,表示时间段中包含的天数。除此之外,还有toHours()toMinutes()toSeconds()toMillis()toNanos()

JDK原生 - 点击查看当前系列文章
§ 1、时间日期 「 当前文章 」