在Java8之前, 日期时间Api 使用的是Date 和 Calendar
新时间API
新的时间API,位于Java.time包里
LocalDateTime获取当前日期和时间LocalDate获取当前日期LocalTime获取当前时间DateTimeFormatter格式化日期of()方法可以设置日期时间parse()方法同of类似,只不过可以按标准格式传入
import java.time.*;
import java.time.format.*;
public class main{
public static void main(String[] args){
/**
* 通过 now() 方法获取当前日期时间
*/
// 当前日期 2019-12-02
LocalDate ld = LocalDate.now();
// 当前时间 16:43:04.786
LocalTime lt = LocalTime.now();
// 当前日期和时间 2019-12-02T16:43:19.427
LocalDateTime ldt = LocalDateTime.now();
/**
* 通过 of() parse()设置日期或时间
*/
// 设置日期 2019-12-02
LocalDate ld2 = LocalDate.of("2019-12-02");
// 设置时间 16:43:04.786
LocalTime lt2 = LocalTime.of("16:43:19");
// 当前日期和时间 2019-12-02T16:43:19.427
LocalDateTime ldt2 = LocalDateTime.of("2019-12-02T16:43:19");
LocalDateTime dt = LocalDateTime.parse("2019-11-19T15:16:17");
/**
* 通过 LocalDateTime 格式化日期 通过java.time.format引入
*/
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(dtf.format(LocalDateTime.now())); // 2019-12-02 17:07:28
}
}
ISO 8601规定的日期和时间分隔符是T。标准格式如下:
- 日期:
yyyy-MM-dd- 时间:
HH:mm:ss- 带毫秒的时间:
HH:mm:ss.SSS- 日期和时间:
yyyy-MM-dd'T'HH:mm:ss- 带毫秒的日期和时间:
yyyy-MM-dd'T'HH:mm:ss.SSS
其它日期的运算方法
-
plusDays()增加天数 -
plusHours()增加小时 ... -
minusDays()减小天数 -
minusMonths()减少分钟 ... -
withYear()调整年 -
withMonth()调整月 -
withDayOfMonth()调整日 -
withHour()调整时 -
withMinute()调整分 -
withSecond()调整秒 -
isBefore()判断某个日期是否在另一个前面 -
isAfter()判断某个日期是否在另一个后面 -
Duration计算两个时刻之间的时间间隔 -
Period计算两个日期之间的天数
import java.time.*;
import java.time.format.*;
public class main{
public static void main(String[] args){
// 时间增量
LocalTime time = LocalTime.now();
LocalTime newTime = time.plusHours(2); // 增加两个小时
/**
* 使用with调整日期时间
*/
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime ldt2 = ldt.withDayOfMonth(10); // 日期变为10
LocalDateTime ldt3 = ldt.withYear(2018); // 年份变为2018
/**
* with的其它运算方法
*/
// 本月第一天00:00时刻:
LocalDateTime firstDay = LocalDate.now().withDayOfMonth(1).atStartOfDay();
// 本月最后1天:
LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
// 下月第1天:
LocalDate nextMonthFirstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfNextMonth());
// 本月第1个工作日:
LocalDate firstWeekday = LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
/**
* isAfter 和 isBefore
*/
// 当前日期在 2019-12-04 之前返回 true, 否则 false
LocalDate.now().isBefore(LocalDate.of(2019, 12, 04));
//当前日期在"09:29:00"之后为返回 true, 否则false
LocalTime.now().isAfter(LocalTime.parse("09:29:00"));
/**
* Duration 和 Period
*/
LocalDateTime start = LocalDateTime.of(2019, 11, 19, 8, 15, 0);
LocalDateTime end = LocalDateTime.of(2020, 1, 9, 19, 25, 30);
Duration d = Duration.between(start, end); // 返回PT1616H15M30S
// PT1616H15M30S 表示1616小时15分钟30秒
}
}
Duration的类型类似于P...T...的形式,如PT1616H15M30S(1616小时15分钟30秒),PT之间表示日期间隔,T后面表示时间间隔
旧时间API
旧时间API 主要包含在Java.util包里,主要包括
Date日期和时间的对象,无时区信息SimpleDateFormat格式化日期Calendar设置获取日期和时间,并且可以进行简单运算
Date
import java.util.*;
public class main{
public static void main(String[] args){
Date date = new Date() // 获取当前时间
System.out.println(date.getYear()); // 返回从1900年到当前的年数(加上1990是当前年份)
System.out.println(date.getMont()); // 返回月份0-11,从0开始算
System.out.println(date.getDate()); // 返回日期1-31
System.out.println(date.toString()); // 转换为字符串,如:Mon Dec 02 11:15:32 CST 2019
System.out.println(date.toLocalString()); // 返回本地时区格式时间:2019-12-2 11:15:32
System.out.println(date.toGMTString()); // 返回GMT时区格式的时间:2 Dec 2019 03:17:13 GMT
}
}
Date 无时区信息
SimpleDateFormat
使用SimpleDateFormat 进行格式化
yyyy:年MM:月dd: 日HH: 小时mm: 分钟ss: 秒
import java.util.Date;
import java.text.SimpleDateFormat;
public class Main {
public static void main(String[] args) {
Date date = new Date();
// 也可以 SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
var sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(date)); // 返回类似 2019-11-10 10:12:54
}
}
Calendar
Calendar和Date类似,除了获取日期外,还可以进行简单的日期和时间运算
- 通过
Calendar来获取日期
import java.util.*;
public class Main {
public static void main(String[] args) {
// 获取当前时间:
// Calendar.getInstance() 是GreogrianCalendar的一个实例
Calendar c = Calendar.getInstance();
int y = c.get(Calendar.YEAR); // 获取年份 例如:2019
int m = c.get(Calendar.MONTH); // 获取月份 0-11
int d = c.get(Calendar.DAY_OF_MONTH); // 获取日期1-31
int w = c.get(Calendar.DAY_OF_WEEK); // 获取星期0-6
int hh = c.get(Calendar.HOUR_OF_DAY); // 获取小时
int mm = c.get(Calendar.MINUTE); // 获取分钟
int ss = c.get(Calendar.SECOND); // 获取秒数
int ms = c.get(Calendar.MILLISECOND); // 获取毫秒
}
}
- 通过
Calendar的set方法来设置 日期
import java.util.*;
public class Main{
public static void main(String[] arys){
Calendar cal = Calendar.getInstance();
cal.set(2019, 11, 2, 13, 44, 51);// 2019-11-02 13:44:51
cal.set(Calendar.YEAR, 2014);// 设置年
cal.set(Calendar.MONTH, 7);//设置月(月份0代表1月)
cal.set(Calendar.DATE, 11);//设置日
cal.set(Calendar.HOUR_OF_DAY, 15);//设置时
cal.set(Calendar.MINUTE, 33);//设置分
cal.set(Calendar.SECOND, 32);//设置秒
}
}
- 通过
Calendar的add方法来进行时间运算
import java.util.*;
public class Main{
public static void main(String[] arys){
Calendar cal = Calendar.getInstance();
cal.add(Calendar.YEAR, 1);// 增加一年
cal.add(Calendar.MONTH, 1);//增加一月
cal.add(Calendar.DATE, 1);//增加一日
cal.add(Calendar.HOUR_OF_DAY, -1);// 减小一小时
cal.add(Calendar.MINUTE, 1);//分
cal.add(Calendar.SECOND, 1);//秒
}
}
Calendar.getTime()可以将一个Calendar对象转换成Date对象