我是靠谱客的博主 震动黄豆,最近开发中收集的这篇文章主要介绍JavaSE进阶:常用类(三)7.Date类8.Calendar类9.SimpleDateFormat类10.JDK8新增日期类 11.System类,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

7.Date类

8.Calendar类

9.SimpleDateFormat类

10.JDK8新增日期类

1.概述

2.LocalTime、LocalDate、LocalDateTime

3.DateTimeFormatter*(未吃透)

4.Duration/Period

Period

Duration

5.Instant/ChronoUnit

Instant

ChronoUnit

 11.System类


7.Date类

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

时间单位:1s(秒) = 1,000ms(毫秒) = 1,000,000 (微秒) = 1,000,000,000 = ns(纳秒)

还剩下的方法:

toString()                     北美中部时间

toLocaleString()           北京时间                已经过时但是可以使用

getTime()                     返回从1970年到当前日期对应的总毫秒值。可以推演时间(往前或往后)

after()                           今天是否在昨天之后

before()                        今天是否在昨天之前

compareTo()                比较第二个值在第一个值得前面还是后面

equals()                        判断输入的两个值是否相等(是否为一天)

package java_se.java_jinjie.neibulei.demo07;
import java.util.Date;
public class Demo02 {
public static void main(String[] args) {
//1.创建Data对象
//今天现在的时间
Date date1 = new Date();
System.out.println(date1.toString());
//北美中部时间
System.out.println(date1.toLocaleString()); //北京时间,虽然过时,但是还是可以用
//昨天现在的时间=今天现在的时间-一天
一天=60秒*60分钟*24小时*1000毫秒
1000毫秒=1秒 一天=1*60*60*24
Date date2 = new Date(date1.getTime()-60*60*24*1000);
System.out.println(date2.toLocaleString());
//2.方法after(是否在括号内的时间之后) before(是否在括号内的时间之前)
boolean b1 = date1.after(date2);//今天是否在昨天之后
System.out.println(b1);//true
boolean b2 = date1.before(date2);//今天是否在昨天之前
System.out.println(b2);//false
//比较第二个值在第一个值得前面(1)还是后面(-1)
compareTo
int d= date1.compareTo(date2);//第二个数比第二个数小,日期在第一个值的前面
System.out.println(d);//1
int d2= date2.compareTo(date1);//第二个数比第一个数大,日期在第二个值的后面
System.out.println(d2);//-1
int d3=date1.compareTo(date1);//今天和今天比相等则为0
System.out.println(d3);//0
//比较是否相等equals
boolean b4 = date1.equals(date2);//肯定不相等
System.out.println(b4);//false
}
}

8.Calendar类

Calendar提供了获取或设置各种日历字段的方法
构造方法 protected Calendar(); 由于是protected(受保护的类),Calendar是一个抽象类 所以无法直接创建

日历字段 : 组成日历的每个部分,都称为日历字段: 年,月,日,星期,时分秒

其他方法
方法名说明
static Calendar getInstance()使用默认时区和区域获取当前日历
void set(int year, int month, int date, int hourofday, int minute, int second)设置日历的年、月、日、时、分、秒
int get(int field)返回给定日历字段的值。字段比如年、月、日
void setTime(Date date)用给定的date设置此日历时间
Date getTime()返回一个date表示此日历的时间
void add(int field, int amount)按照日历的规则,给指定字段添加或减少时间量
long getTimeInMilles()毫秒为单位返回该日历的时间值
public int getActualMaximum(int field_value)返回指定日历字段可能具有的最大值
public int getActualMinimum(int field_value)返回指定日历字段可能具有的最小值
package java_se.java_jinjie.neibulei.demo07;
import java.util.Calendar;
public class Demo03 {
public static void main(String[] args) {
//1.创建一个Calendar对象
Calendar calendar = Calendar.getInstance();
//获取时间
System.out.println(calendar.getTime());
//毫秒值单位获取从1970年到现在时间
System.out.println(calendar.getTimeInMillis());
//2.获取时间信息
//获取年
int year=calendar.get(Calendar.YEAR);
//获取月
月是0-11月 要+1
int month=calendar.get(Calendar.MONTH);
//获取日
int date=calendar.get(Calendar.DATE);
int day=calendar.get(Calendar.DAY_OF_MONTH);
//获取小时
int hour=calendar.get(Calendar.HOUR);//12小时
int hour1=calendar.get(Calendar.HOUR_OF_DAY);//24小时
//获取分钟
int minute=calendar.get(Calendar.MINUTE);
//获取秒
int second=calendar.get(Calendar.SECOND);
//输出时间
System.out.println(year+"年"+(month+1)+"月"+day+"日"+hour1+":"+minute+":"+second);
//3.修改时间
Calendar calendar2=Calendar.getInstance();
calendar2.set(Calendar.DAY_OF_MONTH,5);//把天数修改为5日
System.out.println(calendar2.getTime().toLocaleString());//获取时间
//4.添加或减少时间
calendar2.add(Calendar.HOUR,-1);//减去一个小时
System.out.println(calendar2.getTime().toLocaleString());
calendar2.add(Calendar.HOUR,1);//加上一个小时
System.out.println(calendar2.getTime().toLocaleString());
//5.调用月最大的一天和最小的一天
int max= calendar2.getActualMaximum(Calendar.DAY_OF_MONTH);//本月最大的一天
int min= calendar2.getActualMinimum(Calendar.DAY_OF_MONTH);//本月最小的一天
System.out.println(max);//31
System.out.println(min);//1
}
}

9.SimpleDateFormat类

SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类
进行格式化(日期→文本)parse、解析(文本→日期)format

常用的时间模式字母
字母日期或时间示例
y2019
M年中月份08
d月中天数10
H1天中小时数22
m分钟16
s59
S毫秒356
package java_se.java_jinjie.neibulei.demo07;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo04 {
public static void main(String[] args) throws ParseException {
//创建SimpleDateFormat对象
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
//创建Date
Date date=new Date();
//格式化date(把日期转成字符串)
format格式化
String str=sdf.format(date);
System.out.println(str);//2022年08月12日10:43:52
//解析(把字符串转成日期)
parse解析
Date date2=sdf.parse("1111年11月11日11:11:11");//需要抛出异常 如果你输入的形式和创建SimpleDateFormat对象不一样,运行报错需要改正,抛出异常也没用
System.out.println(date2);//Sat Nov 11 11:11:11 CST 1111
}
}

10.JDK8新增日期类

1.概述

从Java 8开始,java.time包提供了新的日期和时间API,主要涉及的类型有
    LocalDate:不包含具体时间的日期。
    LocalTime:不含日期的时间。
    LocalDateTime:包含了日期及时间。
    Instant:代表的是时间戳。
    DateTimeFormatter 用于做时间的格式化和解析的
    Duration:用于计算两个“时间”间隔
    Period:用于计算两个“日期”间隔

新增的API严格区分了时刻、本地日期、本地时间,并且,对日期和时间进行运算更加方便。
其次,新API的类型几乎全部是不变类型(和String的使用类似),可以放心使用不必担心被修改。

2.LocalTime、LocalDate、LocalDateTime

LocalDate、LocalTime、LocalDateTime
   他们 分别表示本地日期、时间、日期时间对象,他们的类的实例是不可变的对象。
   他们三者构建对象和API都是通用的

构建对象的方式
方法名说明示例

public static Xxxx now();

静态方法,根据当前时间创建对象

LocaDate localDate = LocalDate.now();
LocalTime llocalTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();

public static Xxxx of(…);

静态方法,指定日期/时间创建对象

LocalDate localDate1 = LocalDate.of(2099 , 11,11);
LocalTime localTime1 = LocalTime.of(11, 11, 11);
LocalDateTime localDateTime1 = LocalDateTime.of(2020,10,6,13,23,43);

package java_se;
import java.time.LocalDate;
public class Test {
public static void getInstance() {
//静态方法now()
LocalDate localDate = LocalDate.now();
System.out.println("localDate = " + localDate);//当前时间
//静态方法of()设置日期
LocalDate of = LocalDate.of(2022, 5, 10);//指定时间
System.out.println("of = " + of);
}
}
获取日历字段的方法:get开头
方法名说明

int getYear()

获取年

public int getMonthValue()

获取月份(1-12

int getDayOfMonth()

获取月份的天数/第几天

int getDayOfYear()

获取年中第几天

DayOfWeek getDayOfWeek()

获取星期

package java_se.java_jinjie.neibulei.demo08;
import java.time.DayOfWeek;
import java.time.LocalDate;
public class Test1 {
public static void get(){
LocalDate localDate = LocalDate.now();
//获取年份
int year = localDate.getYear();
//获取月份
int monthvalue = localDate.getMonthValue();
//获取天数
int dayOfMonth = localDate.getDayOfMonth();
//获取年中第几天
int dayOfYear = localDate.getYear();
//获取星期
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
System.out.println("year = " + year);
System.out.println("monthValue = " + monthvalue) ;
System.out.println("dayOfMonth = "+ dayOfMonth) ;
System.out.println("dayOfYear = "+dayOfYear);
System.out.println("dayOfWeek = "+dayOfWeek);
}
public static void main(String[] args) {
LocalDate localDate = LocalDate.now();
//获取年份
int year = localDate.getYear();
//获取月份
int monthValue = localDate.getMonthValue();
//获取天数
int dayOfMonth = localDate.getDayOfMonth();
//获取年中第几天
int dayOfYear = localDate.getDayOfYear();
//获取星期
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
System.out.println("year = " + year);//2022年
System.out.println("monthValue = " + monthValue);//8月
System.out.println("dayOfMonth = "+ dayOfMonth);//12号
System.out.println("dayOfYear = "+dayOfYear);//224
System.out.println("dayOfWeek = "+dayOfWeek);//FRIDAY 星期五
}
}
设置日历字段的方法:with开头

方法名

说明

LocalDate withYear(int year)

设置年份

LocalDate withMonth(int month)

设置月份

LocalDate withDayOfMonth(int day)

设置月中的天数

package java_se.java_jinjie.neibulei.demo08;
import java.time.LocalDate;
public class Test2 {
public static void main(String[] args) {
LocalDate localDate = LocalDate.now() ;//现在日期
System.out.println("localDate ="+ localDate);//localDate =2022-08-12
//设置年,月,日
//方法调用链
LocalDate newLocal = localDate.withYear(2025).withMonth(10).withDayOfMonth(25);//修改后日期
System.out.println("newLocal = " +newLocal);//newLoca1 = 2025-10-25
}
public static void with() {
LocalDate localDate = LocalDate.now() ;
System.out.println("localDate ="+ localDate);
//设置年,月,日
//方法调用链
LocalDate newLocal = localDate.withYear(2025).withMonth(10).withDayOfMonth(25);
System . out . println("newLoca1 = " +newLocal);
}
}

LocalDateTime综合了 LocalDate 和 LocalTime 里面的方法,所以下面只用 LocalDate 和 LocalTime 来举例。
这些方法返回的是一个新的实例引用,因为LocalDateTime 、LocalDate 、LocalTime 都是不可变的。 

修改相关API
方法名说明

plusDays, plusWeeks, plusMonths, plusYears

向当前 LocalDate 对象添加几天、几周、几个月、几年

minusDays, minusWeeks, minusMonths, minusYears

从当前 LocalDate 对象减去几天、几周、几个月、几年

withDayOfMonth, withDayOfYear, withMonth, withYear

将月份天数、年份天数、月份、年份 修改或设置为指定的值并返回新的LocalDate 对象

isBefore(早于), isAfter(晚于)

比较两个 LocalDate(返回值为boolean)

package java_se.java_jinjie.neibulei.demo08;
import java.time.*;
public class GFG {
public static void main(String[] args) {
//
将日期转成字符串
LocalDate date = LocalDate.parse("2018-11-13");
System.out.println("原来的时间为:" + date);//原来的时间为:2018-11-13
//增加日期
新的日期
加上5天
LocalDate returnvalue = date.plusDays(5);
System.out.println("增加后的时间为:" + returnvalue);//增加后的时间为:2018-11-18
//减少日期
新的日期
减去5天
LocalDate returnvalue1 = date.minusDays(5);
System.out.println("减少后的时间为:" + returnvalue1);//减少后的时间为:2018-11-08
// 修改日期
LocalDate result = date.withDayOfMonth(01);
System.out.println("修改后的日期为" + result);修改后的日期为2018-11-01
//如果此日期早于()内日期则返回true,否则false
System.out.println("判断的结果为:"+returnvalue.isBefore(returnvalue1));//判断的结果为:false
//如果此日期晚于()内日期则返回true,否则false
System.out.println("判断的结果为:"+returnvalue.isAfter(returnvalue1));//判断的结果为:true
}
}

3.DateTimeFormatter*(未吃透)

在JDK8中,引入了一个全新的日期与时间格式器DateTimeFormatter。
正反都能调用format方法

package java_se.java_jinjie.neibulei.demo08;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Test3 {
public static void main(String[] args) {
//现在的日期准确到毫秒
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);//2021-03-01T15:09:17.077
//获取的格式化实现为
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//日期改成字符串
String ldtStr = ldt.format(dtf);
System.out.println(ldtStr);//2021-03-01 15:09:17
String ldtStr1 = dtf.format(ldt);
System.out.println(ldtStr1);//2021-03-01 15:09:17
}
}

4.Duration/Period

Period

在Java8中,我们可以使用以下类来计算日期之间的偏差:java.time.Period
主要是 Period 类方法 getYears(),getMonths() 和 getDays() 来计算,只能精确到年月日。
static Period between(LocalDate d1,LocalDate d2):计算两个日期之间的差值,用于 LocalDate 之间的比较。

package java_se.java_jinjie.neibulei.demo08;
import java.time.LocalDate;
import java.time.Period;
//Period
public class Test5 {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
System.out.println(today);// 2021-03-01
LocalDate birthDate = LocalDate.of(1995, 1, 11);
System.out.println(birthDate); // 1995-01-11
//
用于计算日期差值
Period period = Period.between(birthDate, today);//第二个数减去第一个数的日期
System.out.printf("年龄 : %d 年 %d 月 %d 日", period.getYears(), period.getMonths(), period.getDays());
}
}

Duration

在Java8中,我们可以使用以下类来计算时间之间的偏差:java.time.Duration
提供了使用基于时间的值测量时间量的方法。
static Period between(Temporal d1,Temporal d2):计算两个日期之间的差值,用于LocalDateTime之间的比较。也可用于 Instant 之间的比较。

package java_se.java_jinjie.neibulei.demo08;
import java.time.Duration;
import java.time.LocalDateTime;
//Duration
public class Test4 {
public static void main(String[] args) {
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
LocalDateTime birthDate = LocalDateTime.of(1990, 10, 1, 10, 50, 30);
System.out.println(birthDate);
Duration duration = Duration.between(birthDate, today);//第二个参数减第一个参数
System.out.println(duration.toDays());//两个时间差的天数
System.out.println(duration.toHours());//两个时间差的小时数
System.out.println(duration.toMinutes());//两个时间差的分钟数
System.out.println(duration.toMillis());//两个时间差的毫秒数
System.out.println(duration.toNanos());//两个时间差的纳秒数
}
}

5.Instant/ChronoUnit

Instant

JDK8获取时间戳特别简单,且功能更丰富。Instant类由一个静态的工厂方法now()可以返回当前时间戳。
时间戳是包含日期和时间的,与java.util.Date很类似,事实上Instant就是类似JDK8 以前的Date。
Instant和Date这两个类可以进行转换。

package java_se.java_jinjie.neibulei.demo08;
import java.time.Instant;
import java.util.Date;
public class Test6 {
public static void main(String[] args) {
//创建当前初始化时间
Instant instant = Instant.now();
System.out.println("当前时间戳是:" + instant);
//时间类型转换instant转date
Date date = Date.from(instant);
System.out.println("当前时间戳是:" + date);
//时间类型转换date转instant
instant = date.toInstant();
System.out.println(instant);
}
}

ChronoUnit

java.time.temporal.ChronoUnit
lChronoUnit类可用于在单个时间单位内测量一段时间,这个工具类是最全的了,可以用于比较所有的时间单位

package java_se.java_jinjie.neibulei.demo08;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class Test7 {
public static void main(String[] args) {
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
LocalDateTime birthDate = LocalDateTime.of(1990,10,1,10,50,30);
System.out.println(birthDate);
System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate,today));
System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate, today));
System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birthDate, today));
System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birthDate, today));
System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birthDate, today));
System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birthDate, today));
System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birthDate, today));
System.out.println("相差的毫秒数:" + ChronoUnit.MILLIS.between(birthDate, today));
System.out.println("相差的微秒数:" + ChronoUnit.MICROS.between(birthDate, today));
System.out.println("相差的纳秒数:" + ChronoUnit.NANOS.between(birthDate, today));
System.out.println("相差的半天数:" + ChronoUnit.HALF_DAYS.between(birthDate, today));
System.out.println("相差的十年数:" + ChronoUnit.DECADES.between(birthDate, today));
System.out.println("相差的世纪(百年)数:" + ChronoUnit.CENTURIES.between(birthDate, today));
System.out.println("相差的千年数:" + ChronoUnit.MILLENNIA.between(birthDate, today));
System.out.println("相差的纪元数:" + ChronoUnit.ERAS.between(birthDate, today));
}
}

 11.System类

主要用于获取系统的属性数据和其他操作,构造方法私有的

方法名说明
static void arraycopy(...)复制数组
static long currentTimeMillis();获取当 前系统时间,返回毫秒值
static void gc();建议jvm赶快启动垃圾回收期器回收垃圾
static void exit(int status);退出jvm 如果参数是0表示正常退出jvm 非0表示异常退出
package java_se.java_jinjie.neibulei.demo07;
public class Demo05 {
public static void main(String[] args) {
//1.arraycopy 复制
本地方法jvm提供的比Array.copy(original, newLength)效率高
//Array.copy(original, newLength)方法就是调用的System.arraycopy
//src:原数组 srcPos:从哪个位置开始复制0 dest:目标数组 destPos:目标数组的位置 length: 复制的长度
int[] arr = {20, 18, 39, 3,85,68,12,4};
int[] dest = new int [8];
//模板:System.arraycopy(src, srcPos, dest, destPos,length);
System.arraycopy(arr,4,dest,0,4);
for (int i = 0; i < dest.length; i++) {
System.out.print(dest[i]+" ");
}
//2.System.currentTimeMillis()获取当前系统时间从1970年到现在的毫秒数
System.out.println(System.currentTimeMillis());
//还可以用计算代码的执行时间
long start =System.currentTimeMillis();
for (int i = -999999999; i < 999999999; i++) {
for (int j = -99999999; j < 99999999; j++) {
int result=i+j;
}
}
long end=System.currentTimeMillis();
System.out.println("用时:"+(end-start));//9毫秒
//3.System.gc(); 告诉垃圾回收器回收
//被引用了不会被回收
//
Student s1 = new Student("aaa",19);
//
Student s2 = new Student("bbb",19);
//
Student s3 = new Student("ccc",19);
//
System.gc();//空白因为被引用了
//只是创建对象没有引用Student的name和age
new Student("aa",19);
new Student("bb",19);
new Student("cc",19);
System.gc();//回收了cc
19(换行)回收了bb
19(换行)回收了aa
19
//4.System.exit() 退出jvm
退出jvm之后后面就不能运行了
System.exit(0);
System.out.println("退出了jvm");
}
}

最后

以上就是震动黄豆为你收集整理的JavaSE进阶:常用类(三)7.Date类8.Calendar类9.SimpleDateFormat类10.JDK8新增日期类 11.System类的全部内容,希望文章能够帮你解决JavaSE进阶:常用类(三)7.Date类8.Calendar类9.SimpleDateFormat类10.JDK8新增日期类 11.System类所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部