【Java笔记】日期时间API(日期时间的获取、修改与格式化)
如何用 Java 获取与设置当前的时间呢?可以设置时间的 API 有很多,我们记录几个经常用到的吧开始之前,让我们普及一个概念:Java 中的时间戳:是指从 1970年1月1日0时0分0秒 到目前时间对应的毫秒数。没错,时间戳是不停变化的目录java.util.Datejava.sql.DateJDK8之前的日期时间APIjava.text.SimpleDateFormatjava.util.Ca
如何用 Java 获取与设置当前的时间呢?可以设置时间的 API 有很多,我们记录几个经常用到的吧
开始之前,让我们普及一个概念:
Java 中的时间戳:是指从 1970年1月1日0时0分0秒 到目前时间对应的毫秒数。没错,时间戳是不停变化的
目录
java.time.LocalDate/LocalTime/LocalDateTime
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);
}
}
更多推荐
所有评论(0)