System
类提供的public static long currentTimeMillis()
用来返回当前时间与1970年1月1日0时0分0秒
之间以毫秒为单位的时间差。
long time = System.currentTimeMillis();
Timer
和 TimerTask
用于在后台线程中调度任务的 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
是用来处理日期、时间的一个类,并且自带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.util.Date
类的子类,为数据库的日期类型。
规范化的java.sql.Date
只包含年月日信息,时分秒毫秒都会清零,也就是说,如果你是2017-09-17 15:15:25
这样的时间点存取数据,那么存在数据库中的值就是:2017-09-17 00:00:00
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 |
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
Calendar类是一个抽象类,不可以被实例化,在程序中需要调用其静态方法getInstance()
来得到一个Calendar对象,然后根据这个对象再调用其他的方法,例如:Calendar calendar = Calendar.getInstance();
,一个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设置Calendarlong getTimeInMillis()
:获取时间戳(毫秒)Calendar instance = Calendar.getInstance();
// Calendar转Date
Date time = instance.getTime();
// Date转Calendar
instance.setTime(time);
JDK 1.0中包含了一个java.util.Date
类,但是它的大多数方法已经在JDK1.1引入Calendar
类之后被弃用了。而Calendar
并不比Date
好多少。它们面临的问题是:
Date
有用,Calendar
则不行。Java 8 吸收了Joda-Time
的精华,以一个新的开始为 Java 创建优秀的 API。
新的 java.time中包含了所有关于本地日期(LocalDate
)、本地时(LocalTime
)、本地日期时间(LocalDateTime
)、时区(ZonedDateTime
)和持续时间(Duration
)的类。
历史悠久的Date
类新增了toInstant()
方法, 用于把Date
转换成新的表示形式。这些新增的本地化时间日期 API 大大简化了日期时间和本地化的管理。
java.time.LocalDate
、java.time.LocalTime
、java.time.LocalDateTime
类是其中较重要的几个类,它们的实例是不可变的对象,分别表示使用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()
:从当前对象减去几小时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
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
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
用来格式化LocalDate
、LocalTime
、LocalDateTime
ISO_LOCAL_DATE_TIME
;ISO_LOCAL_DATE
;ISO_LOCAL_TIME
ofLocalizedDateTime(FormatStyle.LONG)
ofPattern(“yyyy-MM-dd hh:mm:ss”)
ofPattern(String pattern)
:静态方法 , 返回一个指定字符串格式的DateTimeFormatter
format(TemporalAccessor t)
:格式化一个日期、时间,返回字符串parse(CharSequence text)
:将指定格式的字符序列解析为一个日期、时间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
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()
。