Java学习——日期与时间

Posted 没谱的曲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习——日期与时间相关的知识,希望对你有一定的参考价值。

日期与时间

时间是物质的运动、变化的持续性、顺序性的表现。

时区


以前,人们通过观察太阳位置决定时间。各地区经度不同导致各地区相应的时间也会有所不同。因此,在1863年,首次使用了时区这一概念。通过给这一地区设立一个标准的区域时间,来解决各地时间差异的问题。世界上各个地区因为日出日落时间有所偏差,就会导致时间的差异,这一差异就是所谓的“时差”。

世界协调时间(UTC)

不属于任意时区 。协调世界时,又称世界统一时间,世界标准时间,国际协调时间,简称UTC。
点击 此处可查看世界协调时间(UTC)。

世界时(GMT)

世界时UT即格林尼治平太阳时间,是指格林尼治所在地的标准时间,也是表示地球自转速率的一种形式,简称GMT。
点击 此处可查看格林威治时间(GMT)。

Unix时间戳(Unix Time)

unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
点击 此处使用Unix时间戳转换工具。

java日期函数

java日期函数是指Java统计从1970年1月1日起的毫秒的数量表示日期的函数。

SimpleDateFormat

父类是DateFormat,是一个抽象类
SimpleDateFormat允许进行格式化(日期>>文本):将Date对象转成方便阅读的字符串
解析(文本>>日期):把字符串形式的时间转成Date对象
SimpleDateFormat中定义并输出当前时间的两种方式:

public static void main(String[] args) throws ParseException 

        //创建当前时间对象
        Date nowDate = new Date();

        //创建一个日期格式
        System.out.println("方法一:");
        SimpleDateFormat test1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        String time = test1.format(nowDate);
        System.out.println(time);

        System.out.println("方法二:");
        String test2 = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(nowDate));
        System.out.println(test2);

前后两种方法输出的时间和格式都相同:

解析(文本>>日期)把字符串形式的时间转换成Date对象:

//解析
        //定义字符串
        System.out.println("解析字符串:");
        String str1 = "2021-03-29 10:32:30";
        //创建格式(该格式要与字符串格式一致)
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = sdf.parse(str1);
        System.out.println("解析前字符串形式的时间:");
        System.out.println(str1);
        System.out.println("解析后date格式的时间:");
        System.out.println(date);

输出结果如下图所示:

Calendar

Calendar可以直接翻译为日历,为诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,也为操作日历字段提供了一些方法。
注意:使用Calendar时,month是从0开始计算的,而正常计时中,月份是从一月开始的,所以打印时间时为避免产生误会,需要将month加一。

获取今天的日期

// 获取当前的日历时间
        Calendar c = Calendar.getInstance();

        // 获取年
        int year = c.get(Calendar.YEAR);
        // 获取月
        int month = c.get(Calendar.MONTH);
        // 获取日
        int date = c.get(Calendar.DATE);
        System.out.println("-----今天-----");
        System.out.println(year + "年" + (month + 1) + "月" + date + "日");

输出结果:

使用add();方法修改年,以获取过去或以后的年:

// 十年前的今天
        c.add(Calendar.YEAR, -10);
        // 获取年
        year = c.get(Calendar.YEAR);
        // 获取月
        month = c.get(Calendar.MONTH);
        // 获取日
        date = c.get(Calendar.DATE);
        System.out.println("-----十年前的今天-----");
        System.out.println(year + "年" + (month + 1) + "月" + date + "日");

输出结果:

使用同样的方法可访问不同时间的年月日:

// 3年后的2月后5天前
        c.add(Calendar.YEAR, 3);
        c.add(Calendar.MONTH,2);
        c.add(Calendar.DATE, -5);
        // 获取年
        year = c.get(Calendar.YEAR);
        // 获取月
        month = c.get(Calendar.MONTH);
        // 获取日
        date = c.get(Calendar.DATE);
        System.out.println("-----3年后的5天前-----");
        System.out.println(year + "年" + (month + 1) + "月" + date + "日");
        System.out.println("--------------");

输出结果:

直接使用set();方法可以直接对年、月、日进行赋值操作:

// 赛博朋克
        c.set(2077, 6, 7);
        // 获取年
        year = c.get(Calendar.YEAR);
        // 获取月
        month = c.get(Calendar.MONTH);
        // 获取日
        date = c.get(Calendar.DATE);
        System.out.println("-----赛博朋克-----");
        System.out.println(year + "年" + (month + 1) + "月" + date + "日");

输出结果:

LocalDate、LocalTime、LocalDateTime

LocalDateLocalTimeLocalDateTime
代表ios格式(yyyy-MM-dd)的日期,可以存储生日、纪念日等日期。表示一个时间,而不是日期。是用来表示日期和时间的,这是最常用的类之一

三种时间的表示方式的使用:

//获取当前日期或者时间
        LocalDate localDate = LocalDate.now();
        LocalTime localTime = LocalTime.now();
        LocalDateTime localDateTime = LocalDateTime.now();

        System.out.println("输出日期:");
        System.out.println(localDate);

        System.out.println("输出日期加时间:");
        System.out.println(localDateTime);

        System.out.println("输出时间:");
        System.out.println(localTime);

输出结果:

使用of();方法自定义日期和时间:

//of();
        try 
            LocalDate localDate2 = LocalDate.of(2222, 02, 23);
            LocalDateTime localDateTime1 = LocalDateTime.of(2222, 02, 22, 22, 22, 22);

            System.out.println("输出自定义日期、时间:");
            System.out.println(localDateTime1);

            System.out.println("输出自定义日期:");
            System.out.println(localDate2);
         catch (Exception e) 
            System.out.println("错了");
        

输出结果:

其他方法:

 //.get
        //获取当前日期属性
        System.out.println("获取当前日信息:");
        System.out.println(localDateTime.getDayOfMonth());
        System.out.println("获取当前月信息:");
        System.out.println(localDateTime.getMonthValue());

        //with设置相关属性 体现不可变性 修改不影响原来的值
        LocalDateTime localDateTime2 = localDateTime.withDayOfMonth(22);
        System.out.println("with设置属性,修改不影响原本值");
        System.out.println(localDateTime);
        System.out.println(localDateTime2);

        //加减
        System.out.println("plus、minus加减相关属性");
        LocalDateTime localDateTime3 = localDateTime.plusMonths(3);
        System.out.println(localDateTime3);
        LocalDateTime localDateTime4 = localDateTime.minusYears(10);
        System.out.println(localDateTime4);

输出结果:

Instant

  • Instant:时间线上的一个瞬时点。这可能被用来记录应用程序中的时间时间戳。
  • 在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中,也是从1970年开始,但以毫秒为单位
  • java.time包通过值类型Instant提供机器视图,不提供处理人英意义上的时 单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。
  • (1 ns = 10-9s)1秒=1000毫秒=106微秒=109纳秒。
Instant中的方法:
  • now() 静态方法,返回默认UTC时区的Instant类的对象
  • atOffset(ZoneOffset offset) 结合即时的偏移来创建一个 OffsetDateTime
  • toEpochMilli() 返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
  • ofEpochMilli(long epochMilli) 静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
    示例:
Instant instant = Instant.now();//获取本初子午线时间
        System.out.println("-----本初子午线时间-----");
        System.out.println(instant);


        //结合即时的偏移来创建一个 OffsetDateTime;添加时间偏移量
        OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println("-----添加时间偏移量-----");
        System.out.println(offsetDateTime);

        //获取1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
        long milli = instant.toEpochMilli();
        System.out.println("-----获取1970.01.01 00:00:00到当前的毫秒数-----");
        System.out.println(milli);

        Instant instant1 = Instant.ofEpochMilli((161));
        System.out.println("-----添加指定的毫秒数-----");
        System.out.println(instant1);
        //给定特定的毫秒数,获取Instant实例
        OffsetDateTime offsetDateTime1 = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println("-----添加指定的偏移量-----");
        System.out.println(offsetDateTime1);

        //给定特定的秒数,获取Instant实例
        Instant instant2 = Instant.ofEpochSecond(instant.getEpochSecond());
        System.out.println("-----给定特定的秒数,获取Instant实例-----");
        System.out.println(instant2);

运行结果:

总结:

本博文中仅归纳了部分在Java中的日期与时间的内容,其中只例举了一些容易理解和容易掌握的方法,还有很多方法没有例举出来,在今后的学习过程中会再进一步的学习和理解,丰富该部分的内容。

以上是关于Java学习——日期与时间的主要内容,如果未能解决你的问题,请参考以下文章

Java进阶学习第二十二天——上传与下载

Java Review (二十基础类库----日期时间类)

Java Review (二十基础类库----日期时间类)

JVM学习十 -(复习)内存分配与回收策略

JVM学习十 -(复习)内存分配与回收策略

现在的编程和二十年前有什么不同?