时间线
在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");
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。