一、JDK8之前
1. java.lang.System
类
System
类提供的
public static long currentTimeMillis()
用来返回当前时间与1970年
1
月
1
日
0
时
0
分
0
秒之间以毫秒为单位的时间差。
此方法适于计算时间差
@Test
public void Test1(){
//system类中的
long time = System.currentTimeMillis();
System.out.println(time);//1624935200550
}
2. java.util.Date
类
表示特定的瞬间,精确到毫秒
构造器:
Date()
:
使用无参构造器创建的对象可以获取本地当前时间。
Date(long date)
常用方法
getTime():
返回自
1970
年
1
月
1
日
00:00:00 GMT
以来此
Date
对象表示的毫秒数。
toString():
把此
Date
对象转换为以下形式的
String
:
dow mon dd hh:mm:ss zzz yyyy 其中:
dow
是一周中的某一天
(Sun, Mon, Tue, Wed, Thu, Fri, Sat),
zzz
是时间标准。
其它很多方法都过时了
@Test
public void Test2(){
Date date = new Date();
System.out.println(date.toString());//Tue Jun 15 21:20:02 CST 2021
System.out.println(date.getTime());//1623763202274
Date date1 = new Date(1623763202274L);
System.out.println(date1);//Tue Jun 15 21:20:02 CST 2021
java.sql.Date date2 = new java.sql.Date(1623763202274L);
System.out.println(date2);//2021-06-15
Date date3 = new Date();
java.sql.Date date4 = new java.sql.Date(date3.getTime());
System.out.println(date4);//2021-06-15
}
3. java.text.SimpleDateFormat
类
Date
类的
API
不易于国际化,大部分被废弃了,
java.text.SimpleDateFormat
类是一个不与语言环
境有关的方式来格式化和解析日期的具体类。
它允许进行
格式化:日期->
文本
、
解析:文本->
日期
格式化:
SimpleDateFormat()
:默认的模式和语言环境创建对象
public SimpleDateFormat(String pattern)
:
该构造方法可以用
参数
pattern
指定的格式创建一个
对象,该对象调用:
public String format(Date date)
:
方法格式化时间对象
date
解析:
public Date parse(String source)
:
从给定字符串的开始解析文本,以生成 一个日期
@Test
public void testSimpleDateFormat() throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat();
//格式化
Date date = new Date();
System.out.println(date);//Tue Jun 29 11:00:14 CST 2021
System.out.println(sdf.format(date));//21-6-29 上午11:00
//解析
String str = "21-6-17 下午5:21";
Date date1 = sdf.parse(str);
System.out.println(date1);//Thu Jun 17 17:21:00 CST 2021
//指定方式格式化
// SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyy.MMMMM.dd GGG hh:mm aaa");
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
System.out.println(sdf1.format(date));//2021-06-29 11-00-14
//解析
System.out.println(sdf1.parse("2000-10-23 18-30-59"));//Mon Oct 23 18:30:59 CST 2000
}
4. java.util.Calendar(
日历
)
类
Calendar
是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
获取
Calendar
实例的方法:
①
使用
Calendar.getInstance()
方法;
② 调用它的子类
GregorianCalendar
的构造器。
一个
Calendar
的实例是系统时间的抽象表示,通过
get(int field)
方法来取得想要的时间信息。比如
YEAR
、
MONTH
、
DAY_OF_WEEK
、
HOUR_OF_DAY
、MINUTE、
SECOND
public void set(int field,int value)
public void add(int field,int amount)
public final Date getTime()
public final void setTime(Date date)
注意
:
获取月份时:一月是
0
,二月是
1
,以此类推,
12
月是
11
获取星期时:周日是
1
,周二是
2......
周六是
7
@Test
public void testCalendar(){
//实例化
Calendar calendar = Calendar.getInstance();
//get
int days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);//29
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));//180
//set
calendar.set(Calendar.DAY_OF_MONTH,27);//将月份日期设置为27
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);//27
//add
calendar.add(Calendar.DAY_OF_MONTH,1);//将月份日期天数加一
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);//28
//getTime():日历类-->date
Date date = calendar.getTime();
System.out.println(date);//Mon Jun 28 11:06:28 CST 2021
//setTime():date-->日历类
Date date1 = new Date();
calendar.setTime(date1);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days);//29
}
二、JDK8中新日期时间API
Calendar和Date面临的问题:
可变性:像日期和时间这样的类应该是不可变的。
偏移性:
Date
中的年份是从
1900
开始的,而月份都从
0
开始。
格式化:格式化只对
Date
有用,
Calendar
则不行。
此外,它们也不是线程安全的;不能处理闰秒等。
新日期时间API
java.time
–
包含值对象的基础包
java.time.chrono
–
提供对不同的日历系统的访问
java.time.format
–
格式化和解析时间和日期
java.time.temporal
–
包括底层框架和扩展特性
java.time.zone
–
包含时区支持的类
LocalDate
、
LocalTime
、
LocalDateTime
类是其中较重要的几个类,它们的实例是
不可变的对象
,
分别表示使用
ISO-8601
日历系统的日期、时间、日期和时间。它们提供了简单的本地日期或时
间,并不包含当前的时间信息,也不包含与时区相关的信息。
LocalDate
代表
IOS
格式(
yyyy-MM-dd
)的日期
,
可以存储 生日、纪念日等日期。
LocalTime表示一个时间,而不是日期。
LocalDateTime
是用来表示日期和时间的,
这是一个最常用的类之一。
方法f
方法:
方法 | 描述 |
now() / * now(ZoneId zone)
|
静态方法,根据当前时间创建对象
/
指定时区的对象
|
of()
| 静态方法,根据指定日期/时间创建对象 |
getDayOfMonth()/getDayOfYear()
|
获得月份天数
(1-31) /
获得年份天数
(1-366)
|
getDayOfWeek()
|
获得星期几
(
返回一个
DayOfWeek
枚举值
)
|
getMonth()
|
获得月份
,
返回一个
Month
枚举值
|
getMonthValue() / getYear()
|
获得月份
(1-12) /
获得年份
|
getHour()/getMinute()/getSecond()
|
获得当前对象对应的小时、分钟、秒
|
withDayOfMonth()/withDayOfYear()/
withMonth()/withYear()
|
将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
|
plusDays(), plusWeeks(),
plusMonths(), plusYears(),plusHours()
|
向当前对象添加几天、几周、几个月、几年、几小时
|
minusMonths() / minusWeeks()/
minusDays()/minusYears()/minusHours()
|
从当前对象减去几月、几周、几天、几年、几小时
|
@Test
public void test1(){
//now()获取当前
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate);//2021-06-29
System.out.println(localTime);//11:23:47.871
System.out.println(localDateTime);//2021-06-29T11:23:47.871
//of()指定时间没有偏移量
LocalDateTime localDateTime1 = LocalDateTime.of(2000, 10, 23, 15, 30, 59);
System.out.println(localDateTime1);//2000-10-23T15:30:59
//getXxx() 获取相关属性
System.out.println(localDateTime.getDayOfMonth());//29
System.out.println(localDateTime.getDayOfWeek());//TUESDAY
System.out.println(localDateTime.getDayOfYear());//180
System.out.println(localDateTime.getMonth());//JUNE
System.out.println(localDateTime.getMonthValue());//6
System.out.println(localDateTime.getMinute());//23
//体现不可变性
//withXxx 设置相关属性
LocalDate localDate1 = localDate.withDayOfMonth(20);
System.out.println(localDate);//2021-06-29
System.out.println(localDate1);//2021-06-20
//加减时间
LocalDateTime localDateTime2 = localDateTime.plusMonths(2);
System.out.println(localDateTime);//2021-06-29T11:23:47.871
System.out.println(localDateTime2);//2021-08-29T11:23:47.871
LocalDateTime localDateTime3 = localDateTime.minusDays(10);
System.out.println(localDateTime);//2021-06-29T11:23:47.871
System.out.println(localDateTime3);//2021-06-19T11:23:47.871
}
}
Instant
:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。
方法
| 描述 |
now()
|
静态方法,返回默认
UTC
时区的
Instant
类的对象
|
ofEpochMilli(long epochMilli)
|
静态方法,返回在
1970-01-01 00:00:00
基础上加上指定毫秒数之后的Instant
类的对象
|
atOffset(ZoneOffset offset)
| 结合即时的偏移来创建一个 OffsetDateTime |
toEpochMilli()
|
返回
1970-01-01 00:00:00
到当前时间的毫秒数,即为时间戳
|
@Test
public void test2(){
//now() 本初子午线对应的时间
Instant instant = Instant.now();
System.out.println(instant);//2021-06-29T03:32:16.566Z
//东八区对应的时间
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2021-06-29T11:32:16.566+08:00
long milli = instant.toEpochMilli();
System.out.println(milli);//1624937536566
Instant instant1 = Instant.ofEpochMilli(1624020809042L);
System.out.println(instant1);//2021-06-18T12:53:29.042Z
}
格式化与解析日期或时间:
java.time.format.DateTimeFormatter
类:该类提供了三种格式化方法:
预定义的标准格式。如:
ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
本地化相关的格式。如:
ofLocalizedDateTime(FormatStyle.LONG)
自定义的格式。如:
ofPattern(“yyyy-MM-dd hh:mm:ss”)
方 法
|
描 述
|
ofPattern(String pattern)
|
静态方法 , 返 回 一 个 指 定 字 符 串 格 式 的 DateTimeFormatter
|
format(TemporalAccessor t)
|
格式化一个日期、时间,返回字符串
|
parse(CharSequence text)
|
将指定格式的字符序列解析为一个日期、时间
|
@Test
public void test3(){
//方式一 预定义方式
DateTimeFormatter formatter1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//格式化
LocalDateTime localDateTime = LocalDateTime.now();
String str1 = formatter1.format(localDateTime);
System.out.println(localDateTime);//2021-06-29T11:38:12.632
System.out.println(str1);//2021-06-29T11:38:12.632
//解析
TemporalAccessor parse = formatter1.parse("2021-06-18T21:05:22.243");
System.out.println(parse);//{},ISO resolved to 2021-06-18T21:05:22.243
//方式二 本地方式
DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
String str2 = formatter2.format(localDateTime);
System.out.println(str2);//2021年6月29日 上午11时38分12秒
TemporalAccessor parse1 = formatter2.parse(str2);
System.out.println(parse1);//{},ISO resolved to 2021-06-29T11:38:12
//方式三 自定义
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh-mm-ss");
String str3 = formatter3.format(localDateTime);
System.out.println(str3);//2021-06-29 11-38-12
TemporalAccessor parse2 = formatter3.parse("2021-06-18 09-20-04");
System.out.println(parse2);//{NanoOfSecond=0, MilliOfSecond=0, HourOfAmPm=9, MinuteOfHour=20,
// SecondOfMinute=4, MicroOfSecond=0},ISO resolved to 2021-06-18
}