java 程序头_Java 常用类-程序员头大的日期时间API

第二节、日期时间API

一、JDK8之前日期时间API

1.1 java.lang.System类

System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。

此方法适于计算时间差。@Test

public void test1() {

// 获取当前时间;

// 返回的是距离1970年的一个long型的数【毫秒数】,这种毫秒数通常称为时间戳,通常用于生成订单

long timeMillis = System.currentTimeMillis();

System.out.println(timeMillis);

}

// 运行结果

1601090613188

1.2 java.util.Date类

表示特定的瞬间,精确到毫秒构造器:Date():使用无参构造器创建的对象可以获取本地当前时间。

Date(long date) :创建指定毫秒数的Date对象

常用方法getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象 表示的毫秒数。(时间戳)

toString():把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat),zzz是时间标准。

其它很多方法都过时了@Test

public void test2() {

// 获取当前时间

Date date = new Date();

System.out.println(date.toString());

// 将日期时间格式转为时间戳格式

long time = date.getTime();

System.out.println(time);

}

1.3 java.text.SimpleDateFormat类理论:Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat 类是一个不与语言环境有关的方式来格式化和解析日期的具体类。

它允许进行格式化:日期——>文本。解析:文本——>日期

格式化:SimpleDateFormat() :默认的模式和语言环境创建对象

public SimpleDateFormat(String pattern):该构造方法可以用参数pattern 指定的格式创建一个对象,该对象调用:

public String format(Date date):方法格式化时间对象date

解析:

public Date parse(String source):从给定字符串的开始解析文本,以生成 一个日期

代码:@Test

public void test7() throws ParseException {

// 1.0 将日期格式化为指定格式

Date date = new Date();

System.out.println(date);

/**

* 构造器的参数可以有参也可以无参,无参那个缺乏灵活性。通常都用有参的这个构造器,自己制定格式,如:

* 1. yyyy-MM-dd hh:mm:ss 年4位 月2位【为了和分钟区别开,建议大写】 日2位 时分秒各2位

* 2. yyyy年MM月dd日 hh时mm分ss秒

*/

// SimpleDateFormat formatPattern = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

SimpleDateFormat formatPattern = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");

String formatDate = formatPattern.format(date);

System.out.println(formatDate);

System.out.println("--------------我是分割线---------------");

// 2.0 将字符串解析为日期

String strDate = "2020/10/01";

// 注意:这里需要指定类型,并且类型与字符串类型需一致。不然会报一个ParseException异常。

SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");

Date parse = format.parse(strDate);

System.out.println(parse);

}

问题:

如何将String str = "2020-11-11" 转换为java.sql.Date格式?

思路1:先把str转为java.util.Date下的日期格式,再强制类型转换@Test

public void test8() throws ParseException {

String str = "2020-11-11";

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

// 思路1:强制类型转换

java.sql.Date parse = (java.sql.Date)format.parse(str);

System.out.println(parse);

}

报错:java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date 无法强制类型转为java.sql.Date格式。

分析原因:平常我们做的强制类型转换是父类引用指向子类对象,再加强转即可【多态】。如:Date date = new java.sql.Date(1601090613188L);

java.sql.Date date1 = (java.sql.Date) date;

System.out.println(date1);

​ 现在这个之所以会失败,是因为我们相当于new了一个父类,直接将父类强制转换为子类,这当然是错的。【子类中有其他属性、方法,父类中没有,当然这种强制类型当然会失败】

思路2:通过时间戳@Test

public void test9() throws ParseException {

String str = "2020-11-11";

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

// 思路2:通过时间戳。【无论util下的Date还是sql下的Date都有时间戳,让时间戳做中间商】

Date parse = format.parse(str);

long time = parse.getTime();

java.sql.Date date = new java.sql.Date(time);

System.out.println(date);

}

1.4 java.util.Calendar(日历)类Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。

获取Calendar实例的方法使用Calendar.getInstance()方法

调用它的子类GregorianCalendar的构造器

一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想 要的时间信息。。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、 MINUTE、SECONDpublic void set(int field,int value)

public void add(int field,int amount)

public final Date getTime()

public final void setTime(Date date)

注意:获取月份时:一月是0,二月是1,以此类推,12月是11

获取星期时:周日是1,周二是2 , 。。。。周六是7

代码@Test

public void test10() {

// 获取Calendar实例

Calendar calendar = Calendar.getInstance();

// 获取今天是今年的第几天

int yearDay = calendar.get(Calendar.DAY_OF_YEAR);

System.out.println("今天是今年的第:"+yearDay+"天");

// 获取今天是这个月的第几天

int monthDay = calendar.get(Calendar.DAY_OF_MONTH);

System.out.println("今天是这个月的第:"+monthDay+"天");

// 获取今天是本周的第几天【注意这里加了1的】

int weekDay = calendar.get(Calendar.DAY_OF_WEEK);

System.out.println("今天是本周的第几:"+(weekDay-1)+"天");

// public void set(int field,int value) 改值

calendar.set(Calendar.DAY_OF_YEAR,1);

int yearDayChange = calendar.get(Calendar.DAY_OF_YEAR);

System.out.println("我把今天是今年的第"+yearDay+"天,改为今天是今年的第"+yearDayChange+"天");

// public void add(int field,int amount) 在原本的基础上加

calendar.set(Calendar.DAY_OF_MONTH,5);

int monthAddDay = calendar.get(Calendar.DAY_OF_MONTH);

System.out.println("今天是这个月的第:"+monthAddDay+"天,然而我加了5天时间");

System.out.println("================不是分割线================");

// getTime() 相当于把日历——>new Date();

Date time = calendar.getTime();

System.out.println(time);

// setTime() 相当于new Date()——>日历

Date date = new Date();

calendar.setTime(date);

System.out.println(date);

}

二、JDK8中的日期时间API

2.1 新时间日期APIjava.time – 包含值对象的基础包

java.time.chrono – 提供对不同的日历系统的访问

java.time.format – 格式化和解析时间和日期

java.time.temporal – 包括底层框架和扩展特性

java.time.zone – 包含时区支持的

说明:大多数开发者只会用到基础包和format包,也可能会用到temporal包。因此,尽 管有68个新的公开类型,大多数开发者,大概将只会用到其中的三分之一。

2.2 LocalDate、LocalTime、LocalDateTimeLocalDate、LocalTime、LocalDateTime 类是其中较重要的几个类,它们的实例 是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。 它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区 相关的信息。LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。

LocalTime表示一个时间,而不是日期。

LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。

2.3 常用方法

442581now() 静态方法,根据当前时间创建对象/指定时区的对象@Test

public void test1() {

// 1. 获取当前日期

LocalDate nowDate = LocalDate.now();

// 2. 获取当前时间

LocalTime nowTime = LocalTime.now();

// 3. 获取当前日期时间

LocalDateTime nowDateTime = LocalDateTime.now();

System.out.println("当前日期是:"+nowDate);

System.out.println("当前时间是:"+nowTime);

System.out.println("当前日期时间是:"+nowDateTime);

}

of(),静态方法,根据指定日期/时间创建对象@Test

public void test2() {

LocalDateTime localDateTime = LocalDateTime.of(2020, 11, 11, 12, 12, 12);

System.out.println(localDateTime);

}

getDayOfMonth()/getDayOfYear(),获得月份天数(1-31) /获得年份天数(1-366)@Test

public void test3() {

LocalDateTime localDateTime = LocalDateTime.now();

// 1.获得该月的第几天

int dayOfMonth = localDateTime.getDayOfMonth();

System.out.println("今天是该月的第:" + dayOfMonth + "天");

// 2. 获得该年的第几天

int dayOfYear = localDateTime.getDayOfYear();

System.out.println("今天是该年的第:"+dayOfYear+"天");

}

2.4 瞬时:InstantInstant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。

在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是 时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中, 也是从1970年开始,但以毫秒为单位。

java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间 单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。 概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒 数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级

(1 ns = 10-9 s) 1秒 = 1000毫秒 =109纳秒

API

442581

2.5 格式化与解析日期或时间

java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法:

预定义的标准格式。如ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME

本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)

自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)

442581

代码:@Test

public void test4() {

// DateTimeFormatter 格式化与解析日期或时间

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");

LocalDateTime localDateTime = LocalDateTime.now();

// 格式化

String format = dateTimeFormatter.format(localDateTime);

System.out.println(format);// 2020-10-02 10:52:13

//解析

TemporalAccessor parse = dateTimeFormatter.parse("2020-10-02 10:52:13");

System.out.println(parse);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值