时间和日期
时间和日期
java.lang.System类中提供的currentTimeMillis()(通常将它称为时间戳)
返回从1970年1月1日0时0分0秒之间的以毫秒为单位的时间差(long型)
java.util.Date类
表示特定的时间,精确到毫秒
构造器
Date()无参构造器,获取本地创建的时间
Date(long date)
方法
toString()方法(精确到秒)
getTime()方法(和时间戳相同)
java.sql.Date类
对应着数据库中的表中的日期类型。
public class Date extends java.util.Date
JDK8之前的时间日期API都是不易于国际化的,大部分已经很少被使用了
java.text.SimpleDateFormat类
可以实现对日期的(Date类)的格式化和解析
1、格式化:将一个日期转换成指定格式的字符串format()
2、解析:格式化的逆过程parse()
默认格式为yy-MM-dd 上午/下午HH:mm,如果我们不想使用默认格式需要在创建SimpleDateFormat对象的时候不用使用默认构造器
public void test01() throws ParseException {
SimpleDateFormat simpleDateFormat=new SimpleDateFormat();
Date date=new Date();
System.out.println(date.getTime());
System.out.println(date.toString());
System.out.println("***************************************");
System.out.println(simpleDateFormat.format(date));
String myDate="21-9-24 下午2:05";
Date tempDate1=simpleDateFormat.parse(myDate);
System.out.println(tempDate1.toString());
//不使用默认构造器
SimpleDateFormat simpleDateFormat1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("*********************************************");
System.out.println(simpleDateFormat1.format(date));
}

@Test
public void test02() throws ParseException {
String str="2020-01-01";
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
Date date=simpleDateFormat.parse(str);
System.out.println(date.toString());
java.sql.Date date1=new java.sql.Date(date.getTime());
System.out.println(date1.toString());
}
java.util.Canlender类
这个类是一个抽象类,主要是宛城日期字段之间相互操作的功能.
获取Calender实例的方法:
使用Canlender.getinstance方法(返回GregorianCalendar对象)
调用它的子类GregorianCalendar的构造器
一个Calendar的实例是系统时间的抽象表示,通过get(int field)的方法来获取想要得到的时间信息。比如Year、Month、Day_of_week、Hour_of_day、Minute、Second
public void set(int field,int value)
public void add(int field,int value) value可以是负数
public final Date getTime()
public final void setTime(Date date)
注意:
获取月份的时候,我们是从0开始的
获取星期的时候,周日是1。
@Test
public void test03(){
Calendar calendar=Calendar.getInstance();
int days=calendar.get(calendar.DAY_OF_YEAR);
System.out.println(days);
calendar.set(calendar.DAY_OF_YEAR,22);
days=calendar.get(calendar.DAY_OF_YEAR);
System.out.println(days);
calendar.add(calendar.DAY_OF_YEAR,-3);
days=calendar.get(calendar.DAY_OF_YEAR);
System.out.println(days);
Date date=calendar.getTime();
System.out.println(date);
Date date1=new Date(19018909876567L);
calendar.setTime(date1);
System.out.println(calendar.getTime());
}
然后我们再看看jdk8中新增加了那些api
以前的api存在的问题:
1、可变性:像日期时间这种应该是不可以变的
2、偏移性:Date中的年份是从1900年开始的,月份是从0开始的
3、格式化:格式化只对Date有用,对Calendar则是不行的
4、此外他们也不是线程安全的,也不能处理闰秒等问题
java8中包含本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)等类,并且历史悠久的Date类增加了toInstant方法可以将Date类转换成新的形式。
java.time包
下面这个三个类都是不可变的。
LocalDate:表示ios格式(yyyy-MM-dd)的日期
LocalTime:表示一个时间,而不是日期
LocalDateTime:可以用来表示时间和日期
//获取当前日期
LocalDate now = LocalDate.now();
//获取今年的年份
now.getYear();
//获取本月的月份
now.getMonth();
//获取本月的第几天
now.getDayOfMonth();
//获取当前时间
LocalTime.now();
//获取当前日期+时间
LocalDateTime.now();
//构造日期
LocalDate.of(2020,06,05);
//构造日期
LocalDate.parse("2020-06-05");
//本月第一天
LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
//本月 第n天
LocalDate.now().withDayOfMonth(n);
//本月最后一天
LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
//计算已过去的日期
LocalDate.now().minusDays(1);//昨天
LocalDate.now().minusWeeks(1);//上周
LocalDate.now().minusMonths(1);//上个月
LocalDate.now().minusYears(1);//上一年
//计算将来的日期(加法)
LocalDate.now().plusDays(1);//明天
LocalDate.now().plusWeeks(1);//下周
LocalDate.now().plusMonths(1);//下个月的今天
LocalDate.now().plusYears(1);//明年
//计算相差天数,切记不要使用Period.between()[因为跨月的话天数会重置,还要自己去计算月份,甚至年份] 要用 ChronoUnit.DAYS.between
LocalDate date = LocalDate.of(2020,06,16);
//当天日期
LocalDate nowDate = LocalDate.now();
//计算2020-06-05 距离今天相差多少天 (返回结果大于0,表示date是较小的时间,反之,date是较大的时间,等于0,代表是同一天)
ChronoUnit.DAYS.between(date, nowDate);
//LocalDateTime或ZonedLocalDateTime时,我们要进行格式化显示,就要使用DateTimeFormatter
//获取当前日期
LocalDate now = LocalDate.now();
String format = DateTimeFormatter.ofPattern("yyyy:MM:dd").format(now);
System.out.println(format);
@Test
public void test04(){
LocalDate localDate1=LocalDate.now();
LocalTime localTime1=LocalTime.now();
LocalDateTime localDateTime1=LocalDateTime.now();
System.out.println(localDate1);
System.out.println(localTime1);
System.out.println(localDateTime1);
LocalDate localDate2=LocalDate.of(2021,12,1);
LocalTime localTime2=LocalTime.of(13,12,12);
LocalDateTime localDateTime2=LocalDateTime.of(2020,12,3,12,3,4);
System.out.println(localDate2);
System.out.println(localTime2);
System.out.println(localDateTime2);
}

Instant瞬时
时间线上的一个瞬时点,这可能被用来记录应用程序中的事件时间戳。
在java.time包中,通过Instant提供机器视图,不提供处理人类意义上的时间单位,他只是表示时间线上的一个点,不需要任何上下文信息,比如:时区,只是简单的表示1970年1月1日0时0分0秒(UTC)开始的秒数(可以精确到纳秒)
常见的时间标准:
UTC (世界) GMT (欧洲) CST(美国) RPC(中国)
@Test
public void test05(){
//now方法,获取当前的时间点 是指在本初子午线上的时间(GMT)
Instant instant=Instant.now();
System.out.println(instant);
//添加偏移量
OffsetDateTime offsetDateTime=instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);
System.out.println(instant);
//获取时间戳
Long milli=instant.toEpochMilli();
System.out.println(milli);
//根据毫秒数进行实例化
Instant instant1=Instant.ofEpochMilli(10239489883884L);
System.out.println(instant1);
}
java.time.format.DateTimeFormatter类
该类提供了三种格式化方法
1、预定义的格式标准:ISO_LOCAL_DATE_TIME,ISO_LOCAL_DATE,ISO_LOCAL_TIME
2、本地化相关的格式
比如ofLocalizedDateTime (FormatStyle.LONG/FormatStyle.MEDIUM/FormatStyle.SHORT)
或者ofLocalozedDate(FormatStyle.LONG/FormatStyle.MEDIUM/FormatStyle.SHORT/FormatStyle.FULL)
3、自定义的格式,比如ofPattern("yyyy-MM-dd hh:mm:ss E")

@Test
public void test06(){
DateTimeFormatter dateTimeFormatter1=DateTimeFormatter.ISO_DATE_TIME;
LocalDateTime localDateTime=LocalDateTime.now();
String str1=dateTimeFormatter1.format(localDateTime);
TemporalAccessor temporalAccessor1=dateTimeFormatter1.parse("2021-09-24T19:45:02.785");
System.out.println(temporalAccessor1);
System.out.println(str1);
DateTimeFormatter dateTimeFormatter2=DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
String str2=dateTimeFormatter2.format(localDateTime);
System.out.println(str2);
DateTimeFormatter dateTimeFormatter3=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String str3=dateTimeFormatter3.format(localDateTime);
System.out.println(str3);
}
关于时间的api有太多的api了,上面只是实现了一些简单的基础操作。
System类
该类的构造器是私有的,所以无法创建该类的对象,但是他的方法都是static,所以我们可以直接通过类进行调用。
该类有三个成员变量,分别是in、out、err。分别是标准输入流,标准输出流,标准错误输出流
成员方法 :
native long currentTimeMillis()
void exit(int status)
该方法的作用是退出程序,其中status的值为0代表正常退出,非0代表异常退出。
gc()
请求系统进行垃圾回收,秩序系统是否进行立刻回收,取决于垃圾回收算法的执行情况。
getProperty(String key)
该方法的作用是获取系统中属性名为key的属性对应的值

Math类
java.lang.Math提供了一系列静态方法用于科学计算,返回值一般是double

BigInteger可以表示不可变的任意精度的整数。

BigDecimal类支持不可变的、任意精度的有符号的十进制定点数

浙公网安备 33010602011771号