如何用 Java 获取与设置当前的时间呢?可以设置时间的 API 有很多,我们记录几个经常用到的吧

开始之前,让我们普及一个概念:

Java 中的时间戳:是指从 1970年1月1日0时0分0秒 到目前时间对应的毫秒数。没错,时间戳是不停变化的

目录

java.util.Date

java.sql.Date

JDK8之前的日期时间API

java.text.SimpleDateFormat

java.util.Calendar

JDK8及之后的新日期时间API

java.time.LocalDate/LocalTime/LocalDateTime

java.time.Instant

java.time.format.DateTimeFormatter


java.util.Date

两个方法的使用

1. toString():显式当前的年、月、日、时、分、秒

2. getTime():获取当前 Data 对象对应的时间戳

import org.junit.Test;
import java.util.Date;

public class MyTest {
    @Test
    public void test(){
        Date date = new Date();
        System.out.println(date.toString());
        System.out.println(date.getTime());
    }
}

java.sql.Date

对应着数据库中的日期类型的变量

import org.junit.Test;
import java.util.Date;

public class MyTest {
    @Test
    public void test(){
        java.sql.Date date = new java.sql.Date(436358945356L);//给定时间戳的构造器
        System.out.println(date);
        //将java.util.Date对象转换为java.sql.Date对象
        Date date1 = new java.sql.Date(436358945356L);
        java.sql.Date date2 = (java.sql.Date) date1;
        Date date3 = new Date();
        java.sql.Date date4 = new java.sql.Date(date3.getTime());
    }
}

JDK8之前的日期时间API

java.text.SimpleDateFormat

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

import org.junit.Test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MyTest {
    @Test
    public void test() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat();
        Date date = new Date();
        //格式化:日期 --> 字符串
        String format = sdf.format(date);
        System.out.println(format);
        //解析:格式化逆过程,字符串 --> 日期
        String str = "22-4-3 下午4:15";
        Date date1 = sdf.parse(str);
        System.out.println(date1);
    }
}

java.util.Calendar

Calendar 是一个抽象基类,主用于完成日期字段之间相互操作的功能

import org.junit.Test;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class MyTest {
    @Test
    public void test() {
        Calendar calendar = new GregorianCalendar();
        System.out.println(calendar.getTime());
        //常用方法
        // get()
        int days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);
        //set()
        calendar.set(Calendar.DAY_OF_MONTH,22);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);
        //add()
        calendar.add(Calendar.DAY_OF_MONTH,-3);
        days = calendar.get(Calendar.DAY_OF_MONTH);
        System.out.println(days);
    }
}

JDK8及之后的新日期时间API

JDK 1.0 中包含了一个 java.util.Date 类,但是它的大多数方法已经在 JDK 1.1 引入 Calendar 类之后被弃用了。而 Calendar 并不比 Date 好多少。他们面临的问题是:

可变性:像日期和时间这样的类应该是不可变的

偏移性:Date 中的年份是从 1900 开始的,而月份都从 0 开始

格式化:格式化只对 Date 有用,Calendar 则不行

此外,它们的线程也不是安全的

import org.junit.Test;
import java.util.Date;

public class MyTest {
    @Test
    public void test() {
        //我们想获取时间2002-3-20,用JDK8之前的方法,不可以直接得到,存在偏移量
        Date date = new Date(2022 - 1900,3 - 1,20);
        System.out.println(date);
    }
}

因此为了更高效的获取时间信息,我们在 JDK 8 及之后设置了新的日期时间 API:java . time

java.time.LocalDate/LocalTime/LocalDateTime

LocalDateTime 相较于 LocalDate 和 LocalTime ,使用频率更高

import org.junit.Test;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class MyTest {
    @Test
    public void test() {
        LocalDate ld = LocalDate.now();//获取当前日期
        LocalTime lt = LocalTime.now();//获取当前时间
        LocalDateTime ldt = LocalDateTime.now();//获取当前日期和时间
        System.out.println(ld);
        System.out.println(lt);
        System.out.println(ldt);
        //设置年、月、日、时、分、秒,没有偏移量
        LocalDateTime ldt1 = LocalDateTime.of(2022,3,20,6,45);
        System.out.println(ldt1);
        //getXxx()
        System.out.println(ld.getDayOfWeek());
        //不可变性
        LocalDate ld1 = ld.withDayOfMonth(22);
        System.out.println(ld);//当前时间
        System.out.println(ld1);//更改后时间
    }
}

java.time.Instant

Instant 时间线上的瞬时点。这可能被用来记录应用程序中的事件时间戳

import org.junit.Test;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;

public class MyTest {
    @Test
    public void test() {
        //now():获取本初子午线对应的标准时间
        Instant instant = Instant.now();
        System.out.println(instant);
        //添加时间偏移量
        OffsetDateTime odf = instant.atOffset(ZoneOffset.ofHours(8));
        System.out.println(odf);
        //获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数
        long milli = instant.toEpochMilli();
        System.out.println(milli);
         //给定毫秒数,获取 Instant 实例
        Instant instant1 = Instant.ofEpochMilli(1648977151854L);
        System.out.println(instant1);
    }
}

java.time.format.DateTimeFormatter

可以格式化和解析日期与时间

import org.junit.Test;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;

public class MyTest {
    @Test
    public void test() {
        //方式一:预定义的标准格式
        DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        //格式化:日期 --> 字符串
        LocalDateTime localDateTime = LocalDateTime.now();
        String str1 = formatter.format(localDateTime);
        System.out.println(str1);
        //解析:字符串 --> 日期
        TemporalAccessor parse = formatter.parse("2022-04-03T17:21:33.470");
        System.out.println(parse);
        //方式二:本地化相关的格式
        DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
        //格式化
        String str2 = formatter1.format(localDateTime);
        System.out.println(str2);
        //方式三:自定义的格式
        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
        //格式化
        String str3 = formatter2.format(LocalDateTime.now());
        System.out.println(str3);
    }
}
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐