日期时间API
文章目录
- 计算世界时间的标准主要有:
- UTC
- GMT
- CST
System静态方法
System类提供的 public static long currentTimeMillis() 用来返回当前时间与 1970年1月1日0时0分0秒 之间以毫秒为单位的时间差。
long l = System.currentTimeMillis();
System.out.println(l);
Date类
java.util.Date类:
-
import java.util.Date; public class Main { public static void main(String[] args) { Date date = new Date(); // 创建了对应当前时间的Date对象 System.out.println(date.toString());// Thu Jan 14 18:10:32 CST 2021 System.out.println(date.getTime()); // 返回毫秒数 Date date1 = new Date(2001, 8, 19);// 创建指定年月日的Date对象 System.out.println(date1.toString()); Date date2 = new Date(1610619181448L);// 创建指定秒数的Date对象 System.out.println(date2.toString()); } }
java.sql.Date类:
-
是对应数据库中的时间,为了专门匹配数据库中的。
-
import java.sql.Date; public class Main { public static void main(String[] args) { Date date = new Date(1231231231L); // 创建了一个sql的Date对象 System.out.println(date);// 1970-01-15 // 父类对象不能强转换为子类对象,反之可以 } }
Calendar类
位于:java.util.Calendar
-
Calendar 是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
-
获取 Calendar 实例方法
- 使用 Calendar.getInstance() 方法
- 调用它的子类 GregorianCalendar 的构造器
-
一个 Calendar 的实例是系统时间的抽象表示,通过get(int field) 方法来取得想要得时间信息。比如 YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY、MINUTE、SECOND
API 功能 get(int filed) 返回指定的属性值 set(int filed, int change ) 将指定的属性设置为新的值 add(int filed, int ad) 在当前指定属性原来的值上加上指定的数 getTime() 返回一个Date对象 setTime(Date date) 将Calendar改为Date的时间 -
注意:
- 获取月份时:一月是从 0 开始的,后面的月份一次类推
- 获取星期:周日是 1,周一是 2, 。。。。 周六是 7
-
代码测试
-
import java.text.ParseException; import java.util.Calendar; import java.util.Date; public class Main { public static void main(String[] args) { // 实例化 // 方式1: 创建其子类 (GregorianCalendar)的对象 // 方式2: 调用它的静态方法getInstance() Calendar calendar = Calendar.getInstance(); // System.out.println(calendar.getClass()); //常用方法 // get() int days = calendar.get(Calendar.DAY_OF_MONTH); // 当前日期是这个月的第几天 System.out.println(days); System.out.println(calendar.get(Calendar.DAY_OF_YEAR));// 当前日期是这一年的第几天 // 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); System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); // getTime() Date date = calendar.getTime(); System.out.println(date); // setTime() Date date1 = new Date(); calendar.setTime(date1); System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); } }
SimpleDateFormat类
位于 java.text.SimpleDateFormat
- 它允许进行 格式化: 日期 -> 文本、**解析:**文本 -> 日期
- 格式化:
- SimpleDateFormat(): 默认的模式和语言环境创建对象
- public SimpleDateFormat(String pattern): 该构造方法可以用参数 pattern 指定的格式创建一个对象,该对象调用
- public String format(Date date): 方法格式化时间对象date
- 解析:
- public Date parse(String source): 给定字符串的开始解析文本,以生成一个日期。
测试默认的构造器,创建的对象
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat();
// 格式化:Date格式化为字符串
Date date = new Date();
System.out.println(date);
String format = sdf.format(date);
System.out.println(format);
// 解析: 格式化的逆过程
String str = "2021/1/17 下午6:41";
try {
Date date1 = sdf.parse(str);
System.out.println(date1);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
输出
Sun Jan 17 18:41:49 CST 2021
2021/1/17 下午6:41
Sun Jan 17 18:41:00 CST 2021
使用带参数的构造器
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) throws ParseException {
// 带参数的构造函数,中传入的希望格式化的样式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// 格式化
String s = sdf.format(new Date());
System.out.println(s);
// 解析
Date date = sdf.parse("2021-01-17 06:47:18");
System.out.println(date);
}
}
输出:
2021-01-17 06:49:36
Sun Jan 17 06:47:18 CST 2021
练习
-
将 “2020-09-08” 转换为 java.sql.Date.
- 先将字符串,转换成Date类
- 通过SimpleDateForm类的解析方法
- 将Date类转换成sql.Date
- 通过sql.Date带参数的构造器,用Date的getTime方法传入参数
- 先将字符串,转换成Date类
-
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Main { // 练习:将2020-09-08转换为sql.Date public static void main(String[] args) throws ParseException { testExer(); } public static void testExer() throws ParseException { String birth = "2020-09-08"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(birth); // 将Date 转换成 sql.Date, 同步构造器传入秒。 java.sql.Date birthDate = new java.sql.Date(date.getTime()); System.out.println(birthDate.toString()); } }
LocalDate类、LocalTime类、LocalDateTime类
方法 | 描述 |
---|---|
now() | 静态方法,根据当前的时间创建对象/指定时区的对象 |
of() | 静态方法。根据指定日期/时间创建对象 |
getDayOfMonth()/getDayOfYear() | 获得月份天数(1-31)/ 获得年份天数(1-366) |
getDayOfWeek() | 获得星期几(返回一个DayOfWeek 枚举值) |
getMonth() | 获得月份、返回一个Month枚举值 |
getMonthValue()/getYear() | 获得月份(1-12)/获得年份 |
getHour()/getMinute()/getSecond() | 获得当前对象对应的小时、分钟、秒 |
withDayOfMonth()/withDayOfYear()/withMonth()/withYear() | 将月份天数、年份天数、月份、年份修改为指定的值并返回新对象 |
plusDays(),pulsWeeks(),plusMonths(),plusYears(),plusHours() | 向当前对象添加几天,几周,几个月,几年,几小时 |
minusMonths(), minusWeeks(),minusDays(),minusYears(),minusHours() | 从当前对象减去几月,几周,几天几年,几个小时 |
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class Main {
public static void main(String[] args) {
// LocalDate
LocalDate localDate = LocalDate.now(); // 获取当前系统时间
System.out.println(localDate);
// LocalTime
LocalTime localTime = LocalTime.now(); // 获取当前系统时间
System.out.println(localTime);
// LocalDateTime
LocalDateTime localDateTime = LocalDateTime.now();// 获取当前系统时间
System.out.println(localDateTime);
// of()
LocalDateTime localDateTime1 = LocalDateTime.of(2021, 1, 17, 20, 0, 0);
System.out.println(localDateTime1);
// getXXX()
System.out.println(localDateTime.getDayOfMonth());
System.out.println(localDateTime.getDayOfWeek());
System.out.println(localDateTime.getMonth());
System.out.println(localDateTime.getMonthValue());
System.out.println(localDateTime.getMinute());
// 体现不可变性
LocalDate localDate1 = localDate.withDayOfMonth(22);
System.out.println(localDate);
System.out.println(localDate1);
}
}
Instant类
-
用来记录某个时间点,以秒为单位
-
方法 描述 now() 静态方法,返回默认UTC时区的Instant类的对象 ofEpochMilli(long epochMilli) 静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象 atOffset(ZoneOffse offset) 结合即时的偏移量来创建一个 OffsetDate Time toEpochMilli() 返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳
import java.time.*; public class Main { public static void main(String[] args) { // now(): 获取本初子午线对应的标准时间 Instant instant = Instant.now(); System.out.println(instant); // 添加时间偏移量 OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); System.out.println(offsetDateTime); // 获取距离 1970-01-01 00:00:00 到现在的毫秒数 long l = instant.toEpochMilli(); System.out.println(l); // 通过给定的毫秒数,计算Instant实例 Instant instant1 = Instant.ofEpochMilli(1610885932356L); System.out.println(instant1); } }
-
-
输出
-
2021-01-17T12:19:55.217502900Z 2021-01-17T20:19:55.217502900+08:00 1610885995217 2021-01-17T12:18:52.356Z
-
DateTimeFormatter类
位于 java.time.format.DateTime.Formatter类:该类提供了三种格式化方法
-
预定义格式标准。如:
ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
-
本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
-
自定义的格式化。如:ofPattern(“yyyy-MM-dd hh:mm:ss E”)
-
方法 描述 ofPattern(String pattern) 静态方法,返回一个指定字符串格式DateTimeFormatter format(TemporalAccessor t) 格式化一个日期、时间。返回字符串 parse(CharSequence text) 将指定格式的字符序列解析为一个日期、时间
import java.time.*; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; import java.time.temporal.TemporalAccessor; public class Main { public static void main(String[] args) { // 实例化 // 1 DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; // 格式化:把日期改为字符串 LocalDateTime localDateTime = LocalDateTime.now(); String s = formatter.format(localDateTime); System.out.println(localDateTime); System.out.println(s); // 解析:字符串到日期 TemporalAccessor parse = formatter.parse("2021-01-17T20:31:10.7686176"); System.out.println(parse); // 2 DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT); //格式化 String s1 = formatter1.format(localDateTime); System.out.println(s1); DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL); String s2 = formatter2.format(LocalDateTime.now()); System.out.println(s2); // 3 DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); // 格式化 String s3 = formatter3.format(LocalDateTime.now()); System.out.println(s3); } }
输出
2021-01-17T20:38:09.291183500 2021-01-17T20:38:09.2911835 {},ISO resolved to 2021-01-17T20:31:10.768617600 2021/1/17 下午8:38 2021年1月17日星期日 2021-01-17 08:38:09
-