时间和日期

时间和日期

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

image-20210924195548743

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

image-20210924200506681

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

image-20210924200624805

posted on 2021-10-08 19:18  gyp666  阅读(757)  评论(0)    收藏  举报