1、本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)
LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。
LocalTime表示一个时间,而不是日期
LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。
|
描述 |
now() / now(ZoneId zone) |
静态方法,根据当前时间创建对象/指定时区的对象 |
of() |
静态方法,根据指定日期/时间创建对象 |
getDayOfMonth()/getDayOfYear() |
获得月份天数(1-31) /获得年份天数(1-366) |
getDayOfWeek() |
获得星期几(返回一个 DayOfWeek 枚举值) |
getMonth() |
获得月份, 返回一个 Month 枚举值 |
getMonthValue() / getYear() |
获得月份(1-12) /获得年份 |
getHours()/getMinute()/getSecond() |
获得当前对象对应的小时、分钟、秒 |
withDayOfMonth()/withDayOfYear()/withMonth()/withYear() |
将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象 |
with(TemporalAdjuster t) |
将当前日期时间设置为校对器指定的日期时间 |
plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours() |
向当前对象添加几天、几周、几个月、几年、几小时 |
minusMonths() / minusWeeks()/minusDays()/minusYears()/minusHours() |
从当前对象减去几月、几周、几天、几年、几小时 |
plus(TemporalAmount t)/minus(TemporalAmount t) |
添加或减少一个 Duration 或 Period |
isBefore()/isAfter() |
比较两个 LocalDate |
isLeapYear() |
判断是否是闰年(在LocalDate类中声明) |
format(DateTimeFormatter t) |
格式化本地日期、时间,返回一个字符串 |
parse(Charsequence text) |
将指定格式的字符串解析为日期、时间 |
//now() @Test public void testLocalDateTime(){ LocalDate date = LocalDate.now(); LocalTime time = LocalTime.now(); LocalDateTime datetime = LocalDateTime.now(); } |
//of()或parse @Test public void testLocalDate() { // LocalDate date = LocalDate.now(); // LocalDate date = LocalDate.of(2017, 3, 20); LocalDate date = LocalDate.parse(“2017-03-12”); } |
public static void main(String[] args) { LocalDateTime t = LocalDateTime.now(); System.out.println(“这一天是这一年的第几天:”+t.getDayOfYear()); System.out.println(“年:”+t.getYear()); System.out.println(“月:”+t.getMonth()); System.out.println(“月份值:”+t.getMonthValue()); System.out.println(“日:”+t.getDayOfMonth()); System.out.println(“星期:”+t.getDayOfWeek()); System.out.println(“时:”+t.getHour()); System.out.println(“分:”+t.getMinute()); System.out.println(“秒:”+t.getSecond()); System.out.println(t.getMonthValue()); } |
@Test public void testLocalDate2() { LocalDate date = LocalDate.now();
//withXxx()方法,不改变原来的date对象,返回一个新的对象,不可变性 // LocalDate date2 = date.withDayOfMonth(1);//获取这个月的第一天 LocalDate date2 = date.with(TemporalAdjusters.firstDayOfMonth());// 获取这个月的第一天 System.out.println(date2);
// 获取这个月的最后一天 LocalDate date3 = date.with(TemporalAdjusters.lastDayOfMonth()); System.out.println(date3);
//45天后的日期 LocalDate date4 = date.plusDays(45); System.out.println(date4);
//20天前的日期 LocalDate date5 = date.minusDays(20); System.out.println(date5);
boolean before = date.isBefore(date5); System.out.println(date+”是否比”+date5+”早” + before);
System.out.println(date+”是否是闰年:”+date.isLeapYear());
} |
MonthDay month = MonthDay.of(8, 14); MonthDay today = MonthDay.from(date); System.out.println(“今天是否是生日:” + month.equals(today)); |
2、瞬时:Instant
Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。
在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中,也是从1970年开始,但以毫秒为单位。
java.time包通过值类型Instant提供机器视图。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。
时间戳:指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
public static void main(String[] args) { Instant t = Instant.now(); System.out.println(t);
//偏移8个小时 OffsetDateTime atOffset = t.atOffset(ZoneOffset.ofHours(8)); System.out.println(atOffset);
long milli = t.toEpochMilli(); System.out.println(milli);
Instant in2 = Instant.ofEpochSecond(10000000); System.out.println(in2); } |
3、带时区的日期、时间的处理
作为一个开发者,如果不用去处理时区和它带来的复杂性,那是幸运的。java.time包下的LocalDate、LocalTime、LocalDateTime和Instant基本能满足需求。当你不可避免时区时,ZonedDateTime等类可以满足我们的需求。
ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12-03T10:15:30+01:00 Europe/Paris。
- 其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如:Asia/Shanghai等
- now():使用系统时间获取当前的ZonedDateTime
- now(ZoneId):返回指定时区的ZonedDateTime
ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris
- getAvailableZoneIds():静态方法,可以获取所有时区信息
- of(String id):静态方法,用指定的时区信息获取ZoneId对象
Clock:使用时区提供对当前即时、日期和时间的访问的时钟。
public static void main(String[] args) { Set<String> availableZoneIds = ZoneId.getAvailableZoneIds(); for (String string : availableZoneIds) { System.out.println(string); }
ZonedDateTime t = ZonedDateTime.now(); System.out.println(t);
ZonedDateTime t1 = ZonedDateTime.now(ZoneId.of(“America/New_York”)); System.out.println(t1);
// Clock clock = Clock.systemDefaultZone(); Clock c = Clock.system(ZoneId.of(“America/New_York”)); System.out.println(c.getZone()); System.out.println(c.instant()); } |
4、持续时间:Duration
Duration:用于计算两个“时间”间隔
public static void main(String[] args) { LocalDateTime t1 = LocalDateTime.now(); LocalDateTime t2 = LocalDateTime.of(2017, 8, 29, 0, 0, 0, 0); Duration between = Duration.between(t1, t2); System.out.println(between);
System.out.println(“相差的总天数:”+between.toDays()); System.out.println(“相差的总小时数:”+between.toHours()); System.out.println(“相差的总分钟数:”+between.toMinutes()); System.out.println(“相差的总秒数:”+between.getSeconds()); System.out.println(“相差的总毫秒数:”+between.toMillis()); System.out.println(“相差的总纳秒数:”+between.toNanos()); System.out.println(“不够一秒的纳秒数:”+between.getNano()); } |
5、日期间隔:Period
Period:用于计算两个“日期”间隔
public static void main(String[] args) { LocalDate t1 = LocalDate.now(); LocalDate t2 = LocalDate.of(2018, 12, 31); Period between = Period.between(t1, t2); System.out.println(between);
System.out.println(“相差的年数:”+between.getYears());//1年 System.out.println(“相差的月数:”+between.getMonths());//又7个月 System.out.println(“相差的天数:”+between.getDays());//零25天 System.out.println(“相差的总数:”+between.toTotalMonths());//总共19个月 } |
上一篇: 大数据培训之资源调度器
下一篇: java培训进阶之时间校正器