Java8 Date API

一 、Clock 时钟

Clock类提供了访问当前日期和时间的方法,Clock是时区敏感的,可以用来取代 System.currentTimeMillis() 来获取当前的微秒数。某一个特定的时间点也可以使用Instant类来表示,Instant类也可以用来创建老的java.util.Date对象。

import java.time.Clock;
import java.time.Instant;
import java.util.Date;

public class Test {
 
	public static void main(String[] args) {
		
		Clock clock = Clock.systemDefaultZone();
		long millis = clock.millis();
	
		Instant instant = clock.instant();
		Date from = Date.from(instant);
		
		System.out.println("millis :" + millis);
		System.out.println("from :" + from);
	}
}

二、Timezones 时区

import java.time.ZoneId;
import java.util.Set;

public class Test {
 
	public static void main(String[] args) {
		
		Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
		System.out.println(availableZoneIds);
	
		ZoneId of = ZoneId.of("Asia/Shanghai");
		
		ZoneId of1 = ZoneId.of("Asia/Aden");
		System.out.println(of.getRules());
		System.out.println(of1.getRules());
	}
}

三、LocalTime 本地时间

1、可以通过静态工厂方法of创建一个LocalDate实例
2、同过方法parse 解析时间
3、操作方式和LocalDate类似

import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.ChronoUnit;
import java.util.Locale;
import java.util.Set;

public class Test {
 
	public static void main(String[] args) {
		
		Set<String> availableZoneIds = ZoneId.getAvailableZoneIds();
		System.out.println(availableZoneIds);
	
		//获取当前时间
		ZoneId zoneId = ZoneId.of("Asia/Shanghai");
		LocalTime localTimeOld = LocalTime.now(zoneId);
		System.out.println("localTime :"+localTimeOld);
		
		//获取定时时间及时、分、秒
		LocalTime localTime = LocalTime.of(12, 25, 55);
		int hour = localTime.getHour();
		int minute = localTime.getMinute();
		int second = localTime.getSecond();
		System.out.println("localTime "+localTime+"\nhour :"+hour + "\nminute :" + minute + "second :"+second);
		
		//获取两个时间时间差(时间小的第一个参数结果是负数)
		long hoursBetween = ChronoUnit.HOURS.between(localTimeOld, localTime);
		long minutesBetween = ChronoUnit.MINUTES.between(localTimeOld, localTime);
		System.out.println("hoursBetween :"+hoursBetween);
		System.out.println("minutesBetween :"+minutesBetween);
		
		//多种工厂方法简化对象创建,包括字符串的解析
		DateTimeFormatter germanFormatter =
			    DateTimeFormatter
			        .ofLocalizedTime(FormatStyle.SHORT)
			        .withLocale(Locale.GERMAN);
		LocalTime parse = LocalTime.parse("12:25", germanFormatter);
		System.out.println("parse :"+parse);
		
	}
}

四、LocalDate 本地日期

LocalDate 表示了一个确切的日期,该对象值是不可变的,用起来和LocalTime基本一致。另外要注意的是这些对象是不可变的,操作返回的总是一个新实例。

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.ChronoUnit;
import java.util.Locale;

public class Test {

	public static void main(String[] args) {
		LocalDate today = LocalDate.now();
		LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS);
		LocalDate yesterday = tomorrow.minusDays(2);
		System.out.println(yesterday); 
		
		LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4);
		DayOfWeek dayOfWeek = independenceDay.getDayOfWeek();
		System.out.println(dayOfWeek);  
		
		
		DateTimeFormatter germanFormatter =  DateTimeFormatter
			                                 .ofLocalizedDate(FormatStyle.MEDIUM)
			                                 .withLocale(Locale.GERMAN);

			LocalDate xmas = LocalDate.parse("01.11.2019", germanFormatter);
			System.out.println(xmas);
	}
}

五、 LocalDateTime 本地时间日期

1、LocalDateTime,是LocalDate和LocalTime的合体。它同时表示了日期和时间,但不带有时区信息,可以直接创建,也可以通过合并日期和时间对象构造。
2、LocalDateTime和LocalTime还有LocalDate一样,都是不可变的。LocalDateTime提供了一些能访问具体字段的方法。

import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.temporal.ChronoField;


public class Test {
 
	public static void main(String[] args) {
		LocalDateTime sylvester = LocalDateTime.of(2019, Month.DECEMBER, 31, 23, 59, 59);

		DayOfWeek dayOfWeek = sylvester.getDayOfWeek();
		System.out.println(dayOfWeek);      

		Month month = sylvester.getMonth();
		System.out.println(month);          
		long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY);
		System.out.println(minuteOfDay);   
		
	}
}

六、Instant

从计算机的角度来看,建模时间最自然的格式是表示一个持续时间段上某个点的单一大整型数, Instant的设计初衷是为了便于机器使用,它包含的是由秒及纳秒所构成的数字。Instant类也支持静态工厂方法now,它能够帮你获取当前时刻的时间戳。

import java.time.Instant;

public class Test {
 
	public static void main(String[] args) {
		Instant now = Instant.now();
		System.out.println(now.getEpochSecond() + "." + now.getNano());
		System.out.println(System.currentTimeMillis());
	}
}

七、时间类的通用方法

  • LocalDate、 LocalTime、 LocalDateTime以及Instant这样表示时间点的日期时间类提供了大量通用的方法。
方法名 是否是静态方法 描述
form 根据传入的Temporal对象创建对象实例
now 根据系统时钟创建Temporal对象
of 由Temporal对象的某个部分创建该对象的实例
parse 由字符串创建Temporal对象的实例
atOffset 将Temporal对象和某个时区偏移相结合
atZone 将Temporal对象和某个时区相结合
format 使用某个指定的格式器将Temporal对象转化为字符串(Instant 类不提供该方法)
get 读取Temporal对象某一个部分的值
minus 创建Temporal对象的一个副本,通过将当前Temporal对象的值减去一定的时长创建该副本
plus 创建Temporal对象的一个副本,通过将当前Temporal对象的值加上一定的时长创建该副本
with 以该Temporal对象对象为模板,对某些状态进行修改创建该对象的副本

八、格式化

DateTimeFormatter通常用来格式化日期和时间,里面预定义了像BASIC_ISO_DATE和ISO_LOCAL_DATE这样的常量方便格式化。

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Test {
 
	public static void main(String[] args) {
		
		LocalDateTime now = LocalDateTime.now();
		String s = now.format(DateTimeFormatter.BASIC_ISO_DATE);
		String s1 = now.format(DateTimeFormatter.ISO_DATE_TIME);
		System.out.println(s);
		System.out.println(s1);
		
	}
}

本文作者:[魂皓轩][1] 欢迎关注公众号

本人保留所有权益,转载请注明出处。
欢迎有故事、有想法的朋友和我分享,可发送至 e-mail: lwqforit@163.com

[1]: 1 "文章编辑专用,同步微信公众号,微信,博客园,知乎,微博,思否(segmentfault),掘金,QQ

posted @ 2019-12-09 21:46  魂皓轩  阅读(430)  评论(0编辑  收藏  举报