时间类的总结

时间类的总结

一. Date

1.简介

​ 位置:java.util.Date

​ Date表示特定的瞬间,精确到毫秒。Date类中的大部分方法都已经被Calendar类中的方法所取代。

2.构造方法
方法名描述
Date()分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
Date(long date)分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
//自定义时间构造
public static void main(String[] args) {
        Date date = null;
        String str = "2019-8-22";
        String[] split = str.split("-");
        Calendar calendar = Calendar.getInstance();
        if (split.length == 3){
            int year = Integer.parseInt(split[0].trim());
            int month = Integer.parseInt(split[1].trim());
            int day = Integer.parseInt(split[2].trim());
            calendar.set(year,month-1,day);
        }
        date = calendar.getTime();
        System.out.println(date);
    }

打印结果
Thu Aug 22 14:23:57 CST 2019

3.Date类中的成员方法

1.判断两个日期对象的前后

		Date date1 = new Date();//获取当前系统时间
		Date date2 = new Date(10000);//获取从标准基准时间起10000毫秒的时间点
		boolean boo1 = date1.after(date2);//若date1在date2之后,则返回true,否则返回false
		boolean boo2 = date1.before(date2);//若date1在date2之前,则返回true,否则返回false

2.比较两个日期对象

		Date date1 = new Date();
		Date date2 = new Date(10000);
		int i = date1.compareTo(date2);

3.获取时间

		Date date = new Date();
		long l = date.getTime();

4.修改时间

		Date date = new Date();
		date.setTime(1000);

二. Calendar

1.简介

Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR
等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

2.构造

Calendar类时抽象类不能创建对象,可以通过Calendar类中的静态getInstance方法获取对象(一个费抽象子类对象).

public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.getTime());
    }
}

打印结果

Thu Aug 22 14:32:35 CST 2019

3.Calendar类中的常用静态常量属性
属性描述(这些都是特定与日历的值)
public static final int YEAR指示年的字段数字
public static final int MONTH指示月份的字段数字
public static final int DATE指示一个月中的某天
public static final int DAY_OF_MONTH指示一个月中的某天
public static final int DAY_OF_WEEK指示一周中的某天
public static final int DAY_OF_WEEK_IN_MONTH指示当月中的第几个星期
public static final int DAY_OF_YEAR指示一年中的某天
4.Calendar类中常用的成员方法

1.获取一个Calendar对象:

		Calendar c = Calendar.getInstance();//getInstance方法是一个静态的方法,直接通过类名调用
		System.out.println(c);

2.获取某个日历对象的指定属性的值:

		/*
		get(int field)	参数就是指定的属性,可以使用静态常量属性名代替int值
		*/
		//注意:获取日期属性,不能直接用c.DATE,DATE属性时静态常量,所有Calendar类对象都共享并相同的值
		Calendar c = Calendar.getInstance();
		System.out.println(c.get(Calendar.DATE));//获取c对象所表示日历的日期属性值

3.修改某个日历对象的指定属性值:

		/*
		set(int field, int value) 第一个参数表示属性,第二个参数表示修改的值
		*/
		Calendar c = Calendar.getInstance();	
		c.set(Calendar.YEAR, 2017);

4.获取某个属性所表示的最大、最小值

		/*
		getMaximum(int field)		获取属性的最大值
		getMinimum(int field)		获取属性的最小值
		*/
		Calendar c = Calendar.getInstance();
		int max = c.getMaximum(Calendar.DATE);//获取日期的最大值,无论c表示几月份,max的值都是31
		int min = c.getMinimum(Calendar.DATE);//获取日期的最小值,无论c表示几月份,min的值都是1

5.获取指定Calendar对象的指定属性的最大、最小值

		/*
		getActualMaximum(int field)	获取指定日历的指定属性的最大值
		getActualMinimum(int field)	获取指定日历的指定属性的最小值
		*/
		Calendar c = Calendar.getInstance();
		int max = c.getActualMaximum(Calendar.DATE);
		//若c表示的1月,则max值为31;若c表示的4月,则max值为30;
		int min = c.getActualMimimum(Calendar.DATE);//无论c表示几月份,min值都是1

三.SimpleDateFormat

1.简介

SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类。

它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

2.时间模式字母

通过SimpleDateFormat类将字符串和日期相互转换时,需要使用一些时间模式字母,常用的时间模式字母:

字母日期或时间元素示例
y1996;96
M年中的月份July;Jul;07
w年中的周数27
D年中的天数189
d月份中的天数10
aAm/pm 标记PM
H一天中的小时数(0-23)0
ham/pm 中的小时数(1-12)12
m小时中的分钟数30
s分钟中的秒数55
S毫秒数 1秒=1000毫秒 =1000000微秒=1000000000毫微秒(纳秒)978
public static void main(String[] args) throws Exception{
    //格式化日期
    //format(Date date)	将date对象格式化成指定格式的日期字符串
    Date time = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    System.out.println(sdf.format(time));
    //解析日期
    //parse(String str)	将str对象解析成一个日期对象
    Date date = sdf.parse("2019-04-22 12:23:12");
    System.out.println(date);
}

第四节:新时间日期API

Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。

在旧版的 Java 中,日期时间 API 存在诸多问题,其中有:

  • 非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。
  • 设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。
  • 时区处理麻烦 − 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。

Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:

  • Local(本地) − 简化了日期时间的处理,没有时区的问题。
  • ZoneId (时区) − 通过定制的时区处理日期时间。

线程安全问题演示:

public static void main(String[] args) throws Exception{
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");

		Callable<Date> task = new Callable<Date>() {

			@Override
			public Date call() throws Exception {
				return sdf.parse("20161121");
			}

		};

		ExecutorService pool = Executors.newFixedThreadPool(10);

		List<Future<Date>> results = new ArrayList<>();

		for (int i = 0; i < 10; i++) {
			results.add(pool.submit(task));
		}

		for (Future<Date> future : results) {
			System.out.println(future.get());
		}

		pool.shutdown();
	}

使用新时间日期API解决

public static void main(String[] args) throws Exception{
		
		DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyyyMMdd");
		Callable<LocalDate> task = new Callable<LocalDate>() {

			@Override
			public LocalDate call() throws Exception {
				return LocalDate.parse("20161002", formatter);
			}

		};

		ExecutorService pool = Executors.newFixedThreadPool(10);

		List<Future<LocalDate>> results = new ArrayList<>();

		for (int i = 0; i < 10; i++) {
			results.add(pool.submit(task));
		}

		for (Future<LocalDate> future : results) {
			System.out.println(future.get());
		}

		pool.shutdown();
	}
1. 本地化日期时间 API

LocalDate/LocalTime 和 LocalDateTime 类可以在处理时区不是必须的情况。

LocalDate、LocalTime、LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-8601日 历系统的日期、时间 、日期和时间。它们提供了简单的日期或时间,不包含与时区相关的信息。

public static void main(String[] args) {
		//当前时间
		LocalDateTime ldt=LocalDateTime.now();
		System.out.println(ldt);
		//其他时间
		LocalDateTime ldt2=LocalDateTime.of(2012, 10, 1, 10, 10,10);
		System.out.println(ldt2);
		
		//加时间
		LocalDateTime ldt3=ldt2.plusDays(2);
		System.out.println(ldt3);
		//减时间
		LocalDateTime ldt4 = ldt3.minusHours(2);
		System.out.println(ldt4);
		//获取时间部分
		System.out.println(ldt.getYear());
		System.out.println(ldt.getMonthValue());
		System.out.println(ldt.getDayOfMonth());
		System.out.println(ldt.getHour());
		System.out.println(ldt.getMinute());
		System.out.println(ldt.getSecond());
	}
2. Instant、ZoneId

Instant 时间戳 类似以前的Date、Timestamp

它是以Unix元年(传统 的设定为UTC时区1970年1月1日午夜时分)开始 所经历的描述进行运算

ZoneId 时区

public static void main(String[] args) throws Exception {
		//时间戳
		Instant instant=Instant.now();
		System.out.println(instant);
		Thread.sleep(1000);
		Instant instant2=Instant.now();
		
		long millis = Duration.between(instant, instant2).toMillis();
		System.out.println(millis);
		
		//时区
		System.out.println(ZoneId.getAvailableZoneIds());

		ZoneId zone1 = ZoneId.of("Europe/Berlin");
		ZoneId zone2 = ZoneId.of("Brazil/East");
		System.out.println(zone1.getRules());
		System.out.println(zone2.getRules());
  
  
  		 //时间转换
        //Date-----Instant-------LocalDateTime
        System.out.println("--------Date-----Instant-------LocalDateTime---------");
        Date date=new Date();
        //把date转成instant
        Instant instant1 = date.toInstant();
        //intant转成LocalDateTime
        LocalDateTime localDateTime = instant1.atZone(ZoneId.systemDefault()).toLocalDateTime();
        System.out.println(localDateTime);
        System.out.println("--------LocalDateTime-----Instant-------Date---------");

        Instant instant3 = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
        Date date2 = Date.from(instant3);
        System.out.println(date2);
	}
3. 时间矫正器 TemporalAdjuster

TemporalAdjuster : 时间校正器。有时我们可能需要获 取例如:将日期调整到“下个周日”等操作。
TemporalAdjusters : 该类通过静态方法提供了大量的常 用 TemporalAdjuster 的实现。
例如获取下个周日:

LocalDate date=LocalDate.now();
//下一个周5
System.out.println(date.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)));
//下一个周2
System.out.println(date.with(TemporalAdjusters.next(DayOfWeek.TUESDAY)));
//下一个周日(周日为每周的第一天)
System.out.println(date.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)));
4. DateTimeFormatter

java.time.format.DateTimeFormatter 类:该类提供了三种 格式化方法:
预定义的标准格式
语言环境相关的格式
自定义的格式

DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE;
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss E");
LocalDateTime ldt = LocalDateTime.now();
String strDate = ldt.format(dtf);
System.out.println(strDate);
LocalDateTime newLdt = ldt.parse(strDate, dtf);
System.out.println(newLdt);
er 类:该类提供了三种 格式化方法:
	预定义的标准格式
	语言环境相关的格式
	自定义的格式

```java
DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE;
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss E");
LocalDateTime ldt = LocalDateTime.now();
String strDate = ldt.format(dtf);
System.out.println(strDate);
LocalDateTime newLdt = ldt.parse(strDate, dtf);
System.out.println(newLdt);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值