java.lang.System #
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
long time = System.currentTimeMillis();
java.util.Timer #
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 #
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.Datevoid setTime(Date date):根据Date设置Calendarlong 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.LocalDate、java.time.LocalTime、java.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 #
用来格式化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):静态方法 , 返回一个指定字符串格式的DateTimeFormatterformat(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()。