时间线

在Java中,一个Instant表示时间线上的一个点。
静态方法Instant.now()会返回当前的瞬间时间点。你可以用Instant类对象作为时间戳。
为了计算两个瞬间时间点的时间差,可以用Duration.between()。
例如,计算一个算法的运行时间:

Instant start = Instant.now();  
runAlgorithm();  //自己定义个算法
Instant end = Instant.now();  
Duration timeElapsed = Duration.between(start, end);  
long millis = timeElapsed.toMillis();

一个Duration就是两个瞬间时间点的时间量,你可以调用这些方法:toNanos、toMillis、toSeconds、toMinutes、toHours或者toDays,将Duration的长度转换为常用的时间单位。
你也可以通过静态方法ofNanos、ofMillis等获取Duration对象:
Duration.ofDays(7).toMillis()

其中Instant和Duration类都是不可变的,并且所有的方法都会返回一个新的实例。

本地日期

Java API 中有两种人类时间

  • 本地日期/时间
  • 时区时间

本地日期/时间就是一天的日期和时间,没有关联时区信息。比如一个本地日期1903年6月14日。
一个有时区的日期/时间,它表示了时间轴上一个精准的时间点,它有时区信息、日期/时间。

LocalDate就是一个带年、月、日的日期对象。

LocalDate today = LocalDate.now();  //见天的日期
LocalDate date = LocalDate.of(1903,6,14);  
//或者使用Month枚举  
LocalDate.of(1903, Month.SEPTEMBER,14);

日期调整器

为了安排调度,TemporalAdjusters类提供了一些常用调整的静态方法。
比如:计算每月的第一个星期二

LocalDate firstTuesday = LocalDate.of(2020,1,1).with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));

本地时间

一个LocalTime表示本地时间,它不会考虑上午/下午。

LocalTime rightNow = LocalTime.now();  
LocalTime bedtime = LocalTime.of(22,30,0);

LocalDateTime类表示日期和时间,这个类适合存储确定时区的时间点,例如课程和事件的安排。如果你要处理跨夏令时的时间,或者需要对应不同时区的用户,你应该使用ZonedDateTime类。

格式化和解析

DateTimeFormatter类提供了3种格式化输出日期/时间值的方式:

  • 预定义的标准格式化
LocalDateTime t = LocalDateTime.now();
String formatted = DateTimeFormatter.ISO_LOCAL_DATE.format(t);
//更多格式自行查阅API
  • 本地化的日期和时间格式化
//FormatStyle提供SHORT、MEDIUM、LONG、FULL四种样式
LocalDateTime t = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);  
String formatted = formatter.format(t);

//想使用不同的local,只需要调用withLocale()
formatter.withLocale(Locale.FRANCE).format(t);
  • 自定义模板的格式化
formatter = DateTimeFormatter.ofPattern("E yyyy-MM-dd HH : mm");  
System.out.println(formatter.format(t));//输出:周六 2020-01-11 14 : 39

要从一个字符串中解析日期或时间,可以用静态方法parse。

LocalDate localDate = LocalDate.parse("1903-06-14");

WinRT
21 声望4 粉丝

临渊羡鱼,不如退而结网


« 上一篇
并发编程