日期时间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方法传入参数
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