Java日期时间使用
Posted 巧克力爱王子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java日期时间使用相关的知识,希望对你有一定的参考价值。
一、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
以上是关于Java日期时间使用的主要内容,如果未能解决你的问题,请参考以下文章