学习 Java 的过程中,难免会跟时间处理打交道,那我们今天就来看看,Java 中最常见的一些日期和时间处理的知识。
即所处地区所处时区的时间;
要准确表达时间,还要依赖时区,时区表达方式主要有如下三种:
GMT
或 UTC
加时区偏移表示 ,如 GMT+08:00
表示东八区;CST
表示中国标准世界,但同时也表示美国中部时间;Asia/Shanghai
;使用 Locale
表示一个国家或地区的日期、时间、数字、货币等格式,由 语言_国家 的字母缩写构成;
Epoch Time
,即时间戳,在不同编程语言中有如下几种存储方式:
主要提供了两套处理时间和日期的 API:
java.util
中,主要包括 Date、Calendar、TimeZone
这几个类;java.time
中,主要包括 LocalDateTime、ZoneDateTime、ZoneId
等,自 Java 8 引入;import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
// 获取当前时间
Date date = new Date();
// 年份
System.out.println(date.getYear() + 1900);
// 月份
System.out.println(date.getMonth() + 1);
// 日期
System.out.println(date.getDate);
// 转换为本地时间
System.out.println(date.toLocaleString());
// 转换为 GMT 时区
System.out.println(date.toGMTString());
}
}
yyyy
:年MM
:月dd
:日HH
:小时mm
:分钟ss
:秒可用于获取并设置年、月、日、时、分、秒,比 Date
多了一个可以作简单日期和时间运算的功能;
import java.util.*;
public class Main{
public staitc void main(String[] args) throws Exception{
// 获取当前时间
Calendar cal = Calendar.getInstance();
// 获取年、月、日、时、分、秒
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
}
}
getTime()
方法,可以将一个 Calendar
对象转换为 Date
对象,然后利用 SimpleDateFormat
进行格式化;相较于 Date
和 Calendar
,提供了时区转换功能,主要步骤如下:
SimpleDateFormat
并设定目标时区;Date
对象(对象无时区信息,时区信息存储在 SimpleDateFormat
中);import java.util.*;
import java.text.*;
public class Main{
public static void main(String[] args) throws Exception{
Calendar cal = Calendar.getInstance();
cal.clear();
// 设定时区
cal.setTimeZone(TimZone.getTimeZone("Asia/Shanghai"));
// 设定时间
cal.set(2020, 3 /* 4 月 */, 25, 13, 30, 0);
// 显示时间:
var sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println(sdf.format(c.getTime()));
}
}
java.time
中所提供的新的时间和日期 API,主要涉及的类型:
LocalDateTime、LocalDate、LocalTime
ZonedDateTime
Instant
ZoneId、ZoneOffset
Duration
DateTimeFormatter
import java.time.*;
public class Main{
public static void main(String[] args) throws Exception{
// 当前日期
LocalDate date = LocalDate.now();
// 当前时间
LocalTime time = LocalTime.now();
// 当前日期和时间
LocalDateTime dateTime = LocalDateTime.now();
}
}
T
,规定的标准格式如下: yyyy-MM-dd
HH:mm:ss
HH:mm:ss.SSS
yyyy-MM-dd T HH:mm:ss
yyyy-MM-dd T HH:mm:ss.SSS
withYear()
withMonth()
withDayOfMonth()
withHour()
withMinute()
withSecond()
Duration
和 Period
Duration
:表示两个时刻间的时间间隔;Period
:表示两个日期之间的天数;用于表示带时区的日期和时间;
import java.time.*;
public class Main{
public static void main(String[] args) throws Exception{
ZonedDateTime zoneTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
// 中国时区转换为纽约时间
ZonedDateTime newZoneTime = zoneTime.withZoneSameInstant(ZoneId.of("America/New_York"));
// 转换为本地时间
LocalDateTime local = zoneTime.toLocalDateTime();
System.out.println(zoneTime);
System.out.println(newZoneTime);
}
}
相较于 SimpleDateFormat
,DateTimeFormatter
不仅是不变对象,还是线程安全的,有如下两种使用方式;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
Locale
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E, yyyy-MM-dd HH:mm:ss", Locale.US)
import java.time.*;
import java.time.format.*;
import java.util.Locale;
public class Main{
public static void main(String[] args) throws Exception{
ZonedDateTime zdt = ZonedDateTime.new();
var formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm ZZZZ");
System.out.println(formatter.format(zdt));
var zhFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd EE HH:mm", Locale.CHINA);
System.out.println(zhFormatter.format(zdt));
var usFormatter = DateTimeFormatter.ofPattern("E, MMMM/dd/yyyy EE HH:mm", Locale.US);
System.out.println(usFormatter.format(zdt));
}
}
时间戳在 java.time
中用 Instant
类型表示,相当于 java.util
中的 currentTimeMills()
,返回以毫秒表示的当前时间戳;
Instant
内部核心字段public final class Instant implements ...{
private final long seconds;
private final int nanos;
}
LocalDateTie、ZoneId、Instant、ZonedDateTime、long
之间相互转换关系;
以上就是 Java 中关于日期和时间的相关学习笔记了