java.time由5个包组成参考:
- java.time – 包含值对象的基础包
- java.time.chrono – 提供对不同的日历系统的访问
- java.time.format – 格式化和解析时间和日期
- java.time.temporal – 包括底层框架和扩展特性
- java.time.zone – 包含时区支持的类
基本API
日期 LocalDate
LocalDate是其中最重要的类之一。它是表示日期的不可变类型,不包含时间和时区。
LocalDate date = LocalDate.of(2014, Month.JUNE, 10);
int year = date.getYear(); // 2014年
Month month = date.getMonth(); // 6月
int dom = date.getDayOfMonth(); // 10
DayOfWeek dow = date.getDayOfWeek(); // 星期二
int len = date.lengthOfMonth(); // 30 (6月份的天数)
boolean leap = date.isLeapYear(); // false (不是闰年)
由于LocalDate是不可变类型,每次操作都会产生一个新的实例,而原有实例不收任何影响。
LocalDate date = LocalDate.of(2014, Month.JUNE, 10);
date = date.withYear(2015); // 2015-06-10
date = date.plusMonths(2); // 2015-08-10
date = date.minusDays(1); // 2015-08-09
时间 LocalTime
LocalTime是值类型,且跟日期和时区没有关联。当我们对时间进行加减操作时,以午夜基准,24小时一个周期。因此,20:00加上6小时,结果就是02:00。
LocalTime time = LocalTime.of(20, 30);
int hour = date.getHour(); // 20
int minute = date.getMinute(); // 30
time = time.withSecond(6); // 20:30:06
time = time.plusMinutes(3); // 20:33:06
时间和日期组合LocalDateTime
LocalDateTime是LocalDate和LocalTime的简单组合。它表示一个跟时区无关的日期和时间。LocalDateTime可以直接创建,或者组合时间和日期:
LocalDateTime dt1 = LocalDateTime.of(2014, Month.JUNE, 10, 20, 30);
LocalDateTime dt2 = LocalDateTime.of(date, time);
LocalDateTime dt3 = date.atTime(20, 30);
LocalDateTime dt4 = date.atTime(time);
LocalDateTime的其他方法跟LocalDate和LocalTime相似。下面总结了用到的方法前缀:
方法前缀 | 详细信息 |
---|---|
of | 静态工厂方法,从组成部分中创建实例 |
from | 静态工厂方法,尝试从相似对象中提取实例。from()方法没有of()方法类型安全 |
now | 静态工厂方法,用当前时间创建实例 |
parse | 静态工厂方法,总字符串解析得到对象实例 |
get | 获取时间日期对象的部分状态 |
is | 检查关于时间日期对象的描述是否正确 |
with | 返回一个部分状态改变了的时间日期对象拷贝 |
plus | 返回一个时间增加了的、时间日期对象拷贝 |
minus | 返回一个时间减少了的、时间日期对象拷贝 |
to | 把当前时间日期对象转换成另外一个,可能会损失部分状态 |
at | 用当前时间日期对象组合另外一个,创建一个更大或更复杂的时间日期对象 |
format | 提供格式化时间日期对象的能力 |
时间点Instant
Instant表示自1970年1月1日0时0分0秒(UTC)开始的秒数。用于机器可读的时间存储。Instant的精度可以达到纳秒级。
Instant start = Instant.now();
// perform some calculation
Instant end = Instant.now();
assert end.isAfter(start);
时间修改器TemporalAdjuster
时间修改器TemporalAdjuster类提供一个预装包的、能操纵日期的功能,比如根据月份的最后一天获取日期的对象。
//import static java.time.DayOfWeek.*
//import static java.time.temporal.TemporalAdjusters.*
LocalDate date = LocalDate.of(2014, Month.JUNE, 10);
date = date.with(lastDayOfMonth());
date = date.with(nextOrSame(WEDNESDAY));
时间长度Duration
Duration表示以秒和纳秒为基准的时长。例如,“23.6秒”。Period表示以年、月、日衡量的时长。例如,“3年2个月零6天”。它们可以作为参数,传给主要的时间/日期类的增加或减少时间的方法:
Period sixMonths = Period.ofMonths(6);
LocalDate date = LocalDate.now();
LocalDate future = date.plus(sixMonths);
解析和格式化DateTimeFormatter
DateTimeFormatter是最通用的创建格式化器的方式。包括:
- 常用ISO格式常量,如ISO_LOCAL_DATE
- 字母模式,如ofPattern(“dd/MM/uuuu”)
- 本地化样式,如ofLocalizedDate(FormatStyle.MEDIUM)
DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/uuuu");
LocalDate date = LocalDate.parse("24/06/2014", f);
String str = date.format(f);
时间比较
//时间大小
dayOne.isBefore(dayTwo);
//时间差
long between = ChronoUnit.MONTHS.between(dayOne, dayTwo);
新旧版本兼容参考:
//java.util.Date转LocalDate;
Date input = new Date();
LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
JDK8类 | From JDK8 | to JDK8 | JDK7类 |
---|---|---|---|
java.time.Instant | java.util.Date | ||
Date.from(instant) | date.toInstant() | ||
java.time.Instant | java.sql.Timestamp | ||
Timestamp.from(instant) | ts.toInstant() | ||
java.time.Instant | java.nio.file.attribute.FileTime | ||
FileTime.from(instant) | fileTime.toInstant() | ||
ZonedDateTime | java.util.GregorianCalendar | ||
GregorianCalendar.from(zonedDateTime) | cal.toZonedDateTime() | ||
LocalDate | java.sql.Time | ||
Date.valueOf(localDate) | date.toLocalDate() | ||
java.time.LocalTime | java.sql.Time | ||
Date.valueOf(localDate) | date.toLocalTime() | ||
LocalDateTime | java.sql.Timestamp | ||
Timestamp.valueOf(localDateTime) | ts.toLocalDateTime() | ||
java.time.ZoneId | java.util.TimeZone | ||
Timezone.getTimeZone(id) | timeZone.toZoneId() | ||
DateTimeFormatter | java.text.DateFormat | ||
formatter.toFormat() | 无 |
更多资料
官方文档:http://docs.oracle.com/javase/tutorial/datetime/TOC.html