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 = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        System.out.println(new Date());
    }
},0,2000);

java.util.Date

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

构造方法

常用方法

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

构造方法

常用方法

格式化编码

字符 描述 实例
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 //周六

常用方法

与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好多少。它们面临的问题是:

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日历系统是国际标准化组织制定的现代公民的日期和时间的表示法,也就是公历。

常用方法

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的精度可以达到纳秒级。

常用方法

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

格式化

常用方法

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()