//在没有加锁的情况下,直接操作了实例,会导致线程不安全。
public void setTime(long time) {
fastTime = time;
cdate = null;
}
Java日期/时间API包
Java日期/时间API包含以下相应的包。
Java日期/时间API类
常用方法:
与LocalDate类似,只不过操作的元素变成了时、分、秒
相当于LocalDate与LocalTime结合
它是以Unix元年时间(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的秒数进行计算。
常用方法:
方法:
Duration duration1 =Duration.between(LocalTime.now(),LocalTime.now());
Duration duration2 =Duration.between(Instant.now(),Instant.now());
//exception will happen here
Duration duration3 =Duration.between(LocalDate.now(),LocalDate.now());
System.out.println(duration1);
System.out.println(duration2);
只简单介绍下between方法,其他方法;类比Duration
此类提供打印和解析的主要应用程序入口点,并提供以下常见实现DateTimeFormatter:
更复杂的格式化程序由【DateTimeFormatterBuilder】提供 。
格式化/解析可以通过【LocalDate/LocalTime/LocalDateTime】的format/parse方法实现,调用这两个方法的时候会传递一个【DateTimeFormatter】实例进去
时间/日期字符串解析
String dateStr ="2018-12-12 10:20";
LocalTime localTime = LocalTime.parse(dateStr,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
时间/日期 格式化
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("HH:mm:ss");
System.out.println(localDate.format(formatter1));
System.out.println(localTime.format(formatter2));
TemporalAdjuster—调整时间对象的策略。
调整器是修改时间对象的关键工具。 它们存在于外部化调整过程中,根据策略设计模式允许不同的方法。
例子将时间调整到获取月底最后一天:
LocalDate localDate = LocalDate.now();
LocalDate lastDayPfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("当月最后一天是"+lastDayPfMonth);
有时候需要对日期和时间进行比较复杂的查询,这时候可以利用TemporalQuery接口,它只有唯一一个查询方法R queryFrom(TemporalAccessor temporal)。下面的例子利用这个接口和lambda表达式实现了一个查询到年底还有几天的查询对象,然后调用query方法执行这个查询并返回结果。
TemporalQuery daysAwayQuery = (temporal)->{
LocalDate localDate = LocalDate.from(temporal);
LocalDate lastDayOfYear = localDate.with(TemporalAdjusters.lastDayOfYear());
return lastDayOfYear.getDayOfYear() - localDate.getDayOfYear();
};
LocalDate now = LocalDate.now();
int days = now.query(daysAwayQuery);
System.out.println(MessageFormat.format("距离下一年还有{0}天",days));
给定一个时刻,使用不同时区解读,日历信息是不同的。ZoneId用于识别用于在Instant和LocalDateTime之间转换的规则。
默认时区是ZoneId.systemDefault(),可以这样构建ZoneId:
//北京时区
ZoneId bjZone = ZoneId.of("GMT+08:00")
Instant now = Instant.ofEpochSecond(0L);
LocalDateTime dateTime1 = LocalDateTime.ofInstant(now,ZoneId.systemDefault());
LocalDateTime dateTime2= LocalDateTime.ofInstant(now,ZoneId.of("GMT+09:00"));
System.out.println(dateTime1);
System.out.println(dateTime2);
时间戳与时区无关。
时间不分东西南北、在地球的每一个角落都是相同的。他们都有一个相同的名字,叫时间戳。时间戳 指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。
1884年在华盛顿召开的国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。
全球同一时刻不同时区的本地时间不同
例如,中国时间:10:00 AM
对于美国西部时间:18:00 PM(冬令时)17:00 PM(夏令时)。
以东八区为例
东八区的时间 2018-11-11 12:00:00,转换成时间戳的步骤: