Java学习笔记(七)——Java处理日期和时间
一、日期和时间的概念
(一)日期
2018-09-19
2018-1-1
(二)时间
1 . 不带有日期的时间:
12:56:32
2 . 带有日期的时间:
2018-09-19 12:56:32
- 带有日期的时间,可以表示时刻(Instant)
(三)时区
1 . 时区的概念
当我们在描述当前的时间:2018-09-19 13:00:00时,实际上是指本地时间,如果目前我们处于中国境内,这个本地时间便是指北京时间。
在不同时区在同一时刻,他们的本地时间是不同的。
全球共有24个时区划分,我们将英国伦敦所属时区称为标准时区,其他时区按照地理位置东西偏移程度,以小时为单位进行划分。
北京时间所在时区为东八区(GMT+08:00)。
2 . 时区的表示方式
(1)GMT:标准时区+时区偏移量
(2)UTC:标准时区+时区偏移量
- GMT与UTC是基本等价的,区别在于UTC使用更精确的原子钟进行计时,每个一段时间会进行精确调整
- 在程序开发的过程中可以忽略GMT与UTC之间的误差,计算机时钟在连接网络时会自动通过服务器进行同步
(3)CST:
- 中国标准时间(China Standard Time)
- 美国中部时间(Central Standard Time USA)
(4)国家/城市:例如:Asia/Shanghai
- 这里的城市并不是任意一个城市,而是由国际标准组织规定认证的城市
3 . 夏令时
夏令时(DST:Daylight Saving Time)是指在夏季开始时,将时间向后调整1小时。在夏季结束之后,再将时间向前调整1小时。
中国的夏令时开始于1986年,于1992年中止。
世界各国的夏令时均有不同调整规则。
由于存在夏令时,同一地区用GMT/UTC和城市表示的时区可能导致时间不同
时间 | 2017-11-20 | 2018-06-20 |
---|---|---|
GMT-05:00 | 19:00 | 19:00 |
UTC-05:00 | 19:00 | 19:00 |
America/NewYork | 19:00 | 20:00 |
4 . 地区
地区Locale表示一个国家或地区的日期、时间、数字、货币等格式
- zh_CN表示中国的Locale:2018-09-19
- en_US表示美国的Locale:09/19/2018
在计算机中,使用Locale在日期、时间、货币和字符串之间进行转换:
Locale | 中国消费者 | 美国消费者 |
---|---|---|
商品价格 | 2698.00 | 2,698.00 |
购买日期 | 2018-09-19 | 09/19/2018 |
在编程过程中需要理解Locale用来针对当地用户习惯格式化日期、时间、数字、货币等。
二、Date和Calendar
(一)Date
1 . 数据的存储和展示
存储方式:数据的存储方式指示数据在计算机内存中的保存方式
展示方式:在代码中打印输出的十六进制、十进制、货币形式
//存储方式:
int n = 123400;
//展示方式:
System.out.println(n);//"123400"
printHex(n);//"0xle208"
format(n);//"$123,400"
所以,使用字符串和时区表示的日期和时间实际上就是日期和时间的展示方式
2 . 如何存储日期和时间
(1)在计算机中,使用Epoch Time来存储日期和时间。
(2)Epoch Time:从1970年1月1日零点整(格林威治时区/GMT+00:00)到目前时刻所经历的秒数。
例如:
- 北京时间 2016-11-20 08:15:01 = 1476900901
- 伦敦时间 2016-11-20 00:15:01 = 1476900901
使用毫秒数表示: - 北京时间 2016-11-20 08:15:01.123 = 1476900901123
使用浮点数表示: - 北京时间 2016-11-20 08:15:01.123 = 1476900901.123
(3)当使用Epoch Time来存储时间时,实际上存储的是一个整数。
- 对于Epoch=1476900901,全球各地任何一个时区,其当地时间都可以被唯一的确定。
(4)在Java中,使用long类型的整型来表示毫秒数。
- Epoch Time
- Timestamp(时间戳)
3 . JDK API
Java的JDK中拥有两套处理时间和日期的API:
(1)java.util
- Date
- Calendar
- …
(2)java.time(JDK >= 1.8)
- LocalDate
- LocalTime
- ZonedDateTime
- Instant
- …
4 . java.util.Date
java.util.Date表示当前日期和时间
(1)获取时间
import java.util.Date;
Date now = new Date();//获取当前时间
System.out.println(now);//Mon Nov 14 19:35:24 CST 2016
- 使用new Date()获取当前时间
- 使用long getTime()获取epoch表示的当前时间戳
(2)java.util.Date转化为String
- toString():使用默认格式来转换Date
- toGMTString():使用默认格式来转换Date
- toLocaleString():使用默认格式来转换Date
- SimpleDateFormat:用于Date和String的解析和格式化
import java.util.Date;
Date new = new Date();
System.out.println(now.toString());
System.out.println(now.toGMTString());
System.out.println(now.toLocaleString());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = sdf.format(now);
System.out.println(s);
把String解析为java.util.Date
- SimpleDateFormat
- 用预定义字符串表示格式化的内容
- yyyy:年份
- MM:月份
import java.util.Date;
public class Main {
public static void main(String[] args) throws Exception {
// 获取系统当前时间戳:
System.out.println(System.currentTimeMillis());
// 获取当前时间:
Date now = new Date();
System.out.println(now);
// 把Date转化为long:
long t = now.getTime();
System.out.println(t);
// 把long转化为Date:
System.out.println(new Date(t));
}
}
将Date对象转化为String:
import java.util.Date;
public class Date2String {
public static void main(String[] args) throws Exception {
// 获取当前时间:
Date now = new Date();
// 以当前时区打印日期时间:
System.out.println(now.toString());
// 以GMT+00:00时区打印日期时间:
System.out.println(now.toGMTString());
// 以当前时区+当前Locale打印日期时间:
System.out.println(now.toLocaleString());
}
}
格式化Date对象:
import java.text.SimpleDateFormat;
import java.util.Date;
public class Format {
public static void main(String[] args) throws Exception {
// 获取当前时间:
Date now = new Date();
// 指定格式打印:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//2018-09-19 14:32:55
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
//2018-09-19 14:33:18 CST
//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
//2018-09-19 14:33:37 +0800
System.out.println(sdf.format(now));
}
}
格式化字符串的定义:
https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class Parse {
public static void main(String[] args) throws Exception {
// 按系统Locale解析日期时间:
String s1 = "2016-11-20 12:15:59";
Date date1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(s1);
System.out.println(date1);
// 解析MMM时默认按照系统Locale:
String s2 = "Nov/20/2016 12:15:59";
Date date2 = new SimpleDateFormat("MMM/dd/yyyy HH:mm:ss", Locale.US).parse(s2);
System.out.println(date2);
// 按ISO 8601标准格式解析:
String iso = "2016-11-20T12:15:59";
Date date3 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").parse(iso);
System.out.println(date3);
}
}
(3)java.util.Date的问题
- 不能转换时区
- 不能进行日期和时间的加减
- 不能计算两个日期相差多少天
- 不能计算某个月第一个星期一是哪一天
(二)Calendar
1 . java.util.Calendar
在Java中使用java.util.Calendar来设置和获取年、月、日、时、分、秒。
- Date getTime():
import.util.Calendar;
//当前时间的Calendar对象
Calendar c = new Calendar.getInstance();
//获取年月日时分秒
int y = c.get(Calendar.YEAR);
int m = c.get(Calendar.MONTH);
int d = c.get(Calendar.DAY_OF_MONTH);
int w = c.get(Calendar.DAY_OF_WEEK);
int hh = c.get(Calendar.HOUR_OF_DAY);
int mm = c.get(Calendar.MINUTE);
int ss = c.get(Calendar.SECOND);
int ms = c.get(Calendar.MILLISECOND);
- long getTimeInMillis():获取long类型的Epoch Time
2 . 设置特定的日期和时间
- setTime(Date):设置指定时间
- setTimeInMillis():设置long类型的时间
- clear():清除所有日期和时间
- set(int field, int value):传入常量和对应的值
import.util.Calendar;
//获取当前时间
Calendar c = new Calendar.getInstance();
//设置指定时间
c.setTime(new Date());
//清除所有日期和时间
c.clear();
c.set(Calendar.YEAR, 2018);
c.set(Calendar.MOUTH, 8);//11月
c.set(Calendar.DAY_OF_MOUTH, 19);
c.set(Calendar.HOUR_OF_DAY, 17);
c.getTime();
//2018-09-10 17:00:00
3 . 设置时区并获得转换后的时间
- TimeZone表示时区
- getAvailableIDs()可以枚举所有有效的时区ID
- setTimeZone(TimeZone):让Calendar将时间转换为指定的TimeZone
- get(int field, int value):获取设定时区的本地时间
import.util.Calendar;
//获取当前时间
Calendar c = new Calendar.getInstance();
c.setTimeZone(TimeZone.getTimeZone("America/New_York"));
int hh = c.get(Calendar.HOUR_OF_DAY);
int mm = c.get(Calendar.MINUTE);
int ss = c.get(Calendar.SECOND);
4 . 加减日期和时间
- add(int field, int value)
import.util.Calendar;
//获取当前时间
Calendar c = new Calendar.getInstance();
// +5 days
c.add(Calendar.DAY_OF_MOUTH, 5);
// - 2 hours
c.add(Calendar.HOUR_OF_DAY -2);
下面是一个获取当前日期和时间信息的例子:
import java.util.Calendar;
public class Main {
public static void main(String[] args) throws Exception {
// 获取当前时间表示的Calendar:
Calendar c = Calendar.getInstance();
// 转换为Date打印:
System.out.println(c.getTime());
// 转换为long打印:
System.out.println(c.getTimeInMillis());
// 获取年月日时分秒:
System.out.println(" Year = " + c.get(Calendar.YEAR));
// 注意月份从0开始:1月=0,2月=1,...,12月=11:
System.out.println(" Month = " + c.get(Calendar.MONTH));
System.out.println(" Day = " + c.get(Calendar.DAY_OF_MONTH));
// 注意星期从1开始:星期日=1,星期一=2,...,星期六=7:
System.out.println(" Weekday = " + c.get(Calendar.DAY_OF_WEEK));
System.out.println(" Hour = " + c.get(Calendar.HOUR_OF_DAY));
System.out.println(" Minute = " + c.get(Calendar.MINUTE));
System.out.println(" Second = " + c.get(Calendar.SECOND));
System.out.println(" Millis = " + c.get(Calendar.MILLISECOND));
// 默认时区:
System.out.println("TimeZone = " + c.getTimeZone());
}
}
设置日期和时间:
import java.util.Calendar;
public class SetTime {
public static void main(String[] args) throws Exception {
// 获取当前时间表示的Calendar:
Calendar c = Calendar.getInstance();
// 转换为Date打印:
System.out.println(c.getTime());
// 设置为指定时间:
c.clear();
c.set(Calendar.YEAR, 2018);
c.set(Calendar.MONTH, 9); // 11月
c.set(Calendar.DAY_OF_MONTH, 19);
c.set(Calendar.HOUR_OF_DAY, 17);
System.out.println(c.getTime());
}
}
设置时区并转换时间:
import java.util.Calendar;
import java.util.TimeZone;
public class Zone {
public static void main(String[] args) throws Exception {
// 获取当前时间:
Calendar c = Calendar.getInstance();
System.out.println(c.getTime());
// 获取纽约时间:
c.setTimeZone(TimeZone.getTimeZone("America/New_York"));
int y = c.get(Calendar.YEAR);
int m = c.get(Calendar.MONTH) + 1;
int d = c.get(Calendar.DAY_OF_MONTH);
int hh = c.get(Calendar.HOUR_OF_DAY);
int mm = c.get(Calendar.MINUTE);
int ss = c.get(Calendar.SECOND);
System.out.println(y + "-" + m + "-" + d + " " + hh + ":" + mm + ":" + ss);
}
}
加减日期和时间:
import java.util.Calendar;
public class Calculate {
public static void main(String[] args) throws Exception {
// 获取当前时间表示的Calendar:
Calendar c = Calendar.getInstance();
// 转换为Date打印:
System.out.println(c.getTime());
// + 5 days:
c.add(Calendar.DAY_OF_MONTH, 5);
// - 2 hours:
c.add(Calendar.HOUR_OF_DAY, -2);
// 转换为Date打印:
System.out.println(c.getTime());
}
}
三、java.time的API
(一)LocalDateTime
1 . java.time
Java的java.time提供了新的日期和时间API
- LocalDate:本地日期
- LocalTime:本地时间
- LocalDateTime:本地日期和时间
- ZonedDateTime
- ZoneId
- Instant
- Formatter
2 . java.time API的特点
- 严格区分日期和时间
- 所有的类均为不变类(类似String)
- 修复了Month和Week的常量值
- Mouth范围1~12(Jan ~ Dec)
- Week范围1~7(Mon ~ Sun)
3 . 常用方法
- LocalDate:日期
- LocalTime:时间
- LocalDateTime:日期+时间
- DateTimeFormatter:格式化日期和时间
Import.java.time.*;
LocalDate d = LocalDate.now();//当前日期
LocalTime t = LocalTime.now();//当前时间
LocalDateTime dt = LocalDateTime.new();//当前日期和时间
System.out.println(dt);//严格按照IOS 8601的格式进行打印:2018-09-19T20:15:34.012
//指定日期和时间
LocalDate d2 = LocalDate.of(2018, 9, 19);//2018-09-19
LocalTime t2 = LocalTime.of(20, 15, 34);//20:15:34
LocalDateTime dt2 = LocalDateTime.of(2018, 9, 19, 20, 15, 34);//
LocalDateTime dt2 = LocalDateTime.of(d2, t2);//
4 . Formatter
新的API提供了DateTimeFormatter对象
//对日期进行格式化日期和时间
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(dtf.format(LocalDateTime.now()));
//从字符串解析出日期和时间
LocalDateTime dt2 = LocalDateTime.parse("2018-09-10 20:15:34", dtf);
System.out.println(dt2);
默认按照ISO 8601解析和格式化
5 . 日期和时间的运算
(1)对日期时间进行加减运算
- plusDays()
- minusHours()
- plusWeeks()
// +5天
LocalDate today = LocalDate.now();
LocalDate after5days = today.plusDays(5);
// -2小时
LocalDateTime now = LocalDateTime.now();
LocalDateTime before2hours = now.minusHours(2);
// +1月-2周
LocalDate d = today.plusMouth(1).minusWeeks(2);
6 . 日期和时间的调整
- withDayOfMouth()
- withMouth()
- withHour()
- with()
//将日期调整到本月第1天
LocalDate firstDay = LocalDate.now().withDayOfMouth(1);
//将秒和纳秒调整为零
LocalTime at = LocalTime.now().withSecond(0).withNano(0);
//计算本月最后一天
LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayMouth());
//本月第1个周日
LocalDate firstSunday = LocalDate.now().with(TemporalAdjusters.firstInMouth(DayOfWeek.SUNDAY));
7 . 判断日期和时间的先后
- isBefore()
- isAfter()
- equals():判断两个日期是否相等
LocalDate d1 = LocalDate.of(2018, 09, 19);
LocalDate d2 = LocalDate.of(2018, 09, 20);
Sysem.out.println(d1.isBefore(d2));//true
Sysem.out.println(d1.isAfter(d2));//false
8 . 计算日期的Period
Period:从某一天到指定的另一天,中间相差多少日期
LocalDate d1 = LocalDate.of(2016, 11, 20);
LocalDate d2 = LocalDate.of(2050, 1, 1);
//使用until()方法得到Period对象
Period p = d1.until(d2);
System.out.println(p);//P33Y1M12D(相差33年1个月12天)
可以分别取出对应的整数:
- getYears()
- getMouths()
- getDays()
下面是一些例子:
获取日期和时间:
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Main {
public static void main(String[] args) throws Exception {
// 获取当前本地日期:
LocalDate d1 = LocalDate.now();
System.out.println(d1);
System.out.println("Week = " + d1.getDayOfWeek().getValue());
// 注意11月=11:
LocalDate d2 = LocalDate.of(2016, 11, 30);
System.out.println(d2);
// 获取当前本地时间:
LocalTime t1 = LocalTime.now();
System.out.println(t1);
LocalTime t2 = LocalTime.of(15, 16, 17);
System.out.println(t2);
// 获取当前本地日期和时间:
LocalDateTime dt1 = LocalDateTime.now();
System.out.println(dt1);
// 用LocalDate和LocalTime组合:
LocalDateTime dt2 = LocalDateTime.of(d2, t2);
System.out.println(dt2);
}
}
格式化和解析:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Format {
public static void main(String[] args) {
// 格式化:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(dtf.format(LocalDateTime.now()));
// 按ISO格式解析:
LocalDateTime dt1 = LocalDateTime.parse("2016-11-30T15:16:17");
System.out.println(dt1);
// 按指定格式解析:
LocalDateTime dt2 = LocalDateTime.parse("2016-11-30 15:16:17", dtf);
System.out.println(dt2);
}
}
计算日期和时间:
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.temporal.TemporalAdjusters;
public class Calculate {
public static void main(String[] args) throws Exception {
// 获取当前日期和时间:
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
// + 5 days:
LocalDateTime ldt2 = ldt.plusDays(5);
System.out.println(ldt2);
// - 2 hours:
LocalDateTime ldt3 = ldt2.minusHours(2);
System.out.println(ldt3);
// 获得当月第一天:
LocalDate firstDay = LocalDate.now().withDayOfMonth(1);
LocalDate firstDay2 = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
System.out.println(firstDay.equals(firstDay2));
System.out.println(firstDay);
// 获得当月最后一天:
LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
System.out.println(lastDay);
// 获得当月第一个星期日:
LocalDate firstSunday = LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY));
System.out.println(firstSunday);
// 判断两个日期哪个在前:
System.out.println(firstSunday.isBefore(LocalDate.now()));
// 两个日期相差?年?月?天:
Period p = LocalDate.now().until(LocalDate.of(2050, 1, 1));
System.out.println(p);
// 两个日期一共相差多少天:
System.out.println(LocalDate.of(2050, 1, 1).toEpochDay() - LocalDate.now().toEpochDay());
}
}
注意:
LocalDateTime无法与long进行转换
- 因为LocalDateTime没有时区,无法确定某一时刻
- ZonedDateTime设有时区,可以与long进行转换
(二)ZonedDateTime
1 . 概念
ZonedDateTime实际上就是:LocalDateTime + ZoneId
ZonedDateTime是一个带时区的日期和时间
ZoneId是新的时区对象,用来取代旧的java.util.TimeZone
Instant:时刻对象(epoch seconds)
import java.time.*;
ZonedDateTime zbj = ZonedDateTime.now();//获取当前时区的日期和时间
ZonedDateTime zbj = ZonedDateTime.now(ZoneId.of("America/New_York"));//获取指定时区的日期和时间
2 . atZone()
如果我们已经拥有LocalDateTime,就可以使用atZone()从LocalDateTime转换成ZonedDateTime:
import java.time.*;
LocalDateTime ldt = LocalDateTime.of(2016, 11, 30, 8, 15, 59);
//关联到当前默认时区
ZonedDateTime bj = ldt.atZone(ZoneId.systemDefault());
//关联到指定时区
ZonedDateTime ny = ldt.atZone(ZoneId.of("America/New_York"));
3 . 时区转换
- withSameInstant()
import java.time.*;
LocalDateTime ldt = LocalDateTime.of(2016, 11, 30, 8, 15, 59);
//获取当前默认时区
ZonedDateTime bj = ldt.atZone(ZoneId.systemDefault());
//转换到指定时区
ZonedDateTime ny = ldt.withSameInstant(ZoneId.of("America/New_York"));
4 . Instant
- Instant用来表示时刻
- 可以转换为long(注意单位是秒)
- 可以理解为是一个epoch time,也就是long类型的包装类型
- ZonedDateTime对象通过toInstant()可以转化为Instant对象
- Instant对象通过atZone()可以转化为ZonedDateTime对象
- Instant可以通过get.EpochSecond()返回long类型的整型
Instant ins = Instant.now();
Instant ins2 = ZonedDateTime.now().toInstant();
ZonedDateTime zdt = ins.atZone(ZoneId.of("Z"));
long epoch = ins.getEpochSecond();
5 . TemporalAmount
TemporalAmount:表示一段时间1天/2小时/30分钟等,可用于日期和时间的加减
TemporalAmount拥有两个子类:
- Duration
- Period
// 2天
Period twoDays = Period.ofDays(2);
// 1小时
Duration oneHour = Duration.ofHours(1);
// 30分钟
Duration halfHour = Duration.ofMinutes(30);
ZonedDateTime zdt = ZonedDateTime.now();
.minus(twoDays);
.plus(oneHours);
.plus(halfHours);
获取和转换时区的日期和时间:
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) throws Exception {
// 获取当前默认时区的日期和时间:
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now);
// 打印时区:
System.out.println(now.getZone());
// 获取Instant:
Instant ins = now.toInstant();
System.out.println(ins.getEpochSecond());
// 按指定时区获取当前日期和时间:
ZonedDateTime london = ZonedDateTime.now(ZoneId.of("Europe/London")); // 伦敦时间
System.out.println(london);
// 把伦敦时间转换到纽约时间:
ZonedDateTime newyork = london.withZoneSameInstant(ZoneId.of("America/New_York")); // 纽约时间
System.out.println(newyork);
}
}
将LocalDateTime转换为ZonedDateTime:
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class Local2Zoned {
public static void main(String[] args) throws Exception {
// 把LocalDateTime转换为ZonedDateTime:
LocalDateTime ldt = LocalDateTime.of(2016, 11, 30, 8, 15, 59);
// 关联到当前默认时区:
ZonedDateTime bj = ldt.atZone(ZoneId.systemDefault());
System.out.println(bj);
// 关联到纽约时区:
ZonedDateTime ny = ldt.atZone(ZoneId.of("America/New_York"));
System.out.println(ny);
}
}
转换时区:
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class ChangeZone {
public static void main(String[] args) {
// 把LocalDateTime转换为ZonedDateTime:
LocalDateTime ldt = LocalDateTime.of(2016, 11, 30, 8, 15, 59);
// 关联到当前默认时区:
ZonedDateTime bj = ldt.atZone(ZoneId.systemDefault());
System.out.println(bj);
// 转换到纽约时区:
ZonedDateTime ny = bj.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println(ny);
}
}
注意:不要自行试图通过加减时区偏移量进行计算
6 . 其他class
(1)ZoneOffset:时区偏移量(不考虑夏令时)
(2)OffsetDateTime:类似于ZonedDateTime
(3)OffsetTime:是带有Offset的LocalTime
(4)ChronoLocalDate:用于实现其他历法
(5)ChronoLocalDateTime:用于实现其他历法
推荐阅读
-
Java学习笔记 DbUtils数据库查询和log4j日志输出 使用
-
java学习笔记(基础篇)—关键字static和final
-
Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别
-
Java开发笔记(四十三)更好用的本地日期时间
-
Java8简明学习之新时间日期API
-
JAVA时间日期处理类,主要用来遍历两个日期之间的每一天
-
为什么不建议使用Date,而是使用Java8新的时间和日期API?
-
Java日期时间API系列30-----Jdk8中java.time包中的新的日期时间API类,减少时间精度方法性能比较和使用。
-
解决Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题
-
【Java基础学习笔记】5、类、对象和方法