一、基础知识
① GMT(Greenwich Mean Time)代表格林尼治标准时间。
② GMT又作为世界时,被称为UT
③ CST可以代表以下4个不同的时区:
- Central Standard Time (USA) UT-6:00
- Central Standard Time (Australia) UT+9:30
- China Standard Time UT+8:00
- Cuba Standard Time UT-4:00 (古巴)
④ 在java中获取的CST使用中国时区,在js中默认采用美国中部时间。
二、JDK8之前的日期和时间
1、java.util.Date类
Date date = new Date()
System.out.println(date);
// Sat Oct 16 14:15:30 CST 2021
System.out.println(date.toString());
// Sat Oct 16 14:15:30 CST 2021
// 上面方法两个都表示当前时间,不过显示的格式不符合中国人
System.out.println(System.currentTimeMillis());
System.out.println(date.getTime());
// 1634365656101
// 上面两个方法获取到的是从1970年元旦到现在的毫秒数
Date date2 = new Date(long date); // 创建指定毫秒数
2、java.sql.Date类
java.sql.Date date1 = new java.sql.Date(1634365656081L);
// 2021-10-16
3、java.text.SimpleDateForma类
SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
Date date = new Date();
// Sat Oct 16 14:47:02 CST 2021
// 格式化:日期->String
String format = simpleDateFormat.format(date);
// 21-10-16 下午2:47
// 解析:string->日期
String str = "21-10-16 下午2:47"
Date date1 = simpleDateFormat.parse(str);
// 指定格式的simpleDateFormat,格式化和解析会按照参数的格式进行。
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd GGG hh:mm:ss aaa");
// 2021-10-16 公元 02:54:35 下午
4、java.util.Calendar类
日历类Calendar是一个抽象类,可以使用该类的静态方法来创建对象,也可以直接创建其子类GregorianCalendar对象。
Calendar calendar = Calendar.getInstance();
// 获得几天是这个月的第几天
int days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); // 16
// 改变calendar中的日历信息
calendar.set(Calendar.DAY_OF_MONTH,22);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); // 22
// 改变calendar中的日历信息,通过add改变
calendar.add(Calendar.DAY_OF_MONTH,3);
days = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(days); // 25
// 把Calendar类转换为Date类
Date time = calendar.getTime();
System.out.println(time); // Mon Oct 25 15:08:28 CST 2021
// 把Date类转换为Calendar类
Date date = new Date();
calendar.setTime(date);
System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); //16
5、注意事项
① 日历类获取月份时,一月是0…二月是1,十二月是11。
② 获取星期时,星期日是1,星期二是2…星期六是7。
三、JDK8中的API
在jdk1.0时,采用Date类,随后在JDK1.1后采用Calendar代替Date。但是它们都有一些问题:
① 可变性:像日期和时间这样的类应该是不可变的。
② 偏移性:Date中的年份是从1900年开始的,而月份都是从0开始的。
③ 格式化:只有Date能格式化,Calendar不行。
④ 它们不是线程安全的,不能处理闰秒。
针对上面的问题,JDK8吸收了Joda-Time的精华,引入了java.time API。包含了关于本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)
1、LocalDate,LocalTime,LocalDateTime
// 两种构造方法
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate); // 2021-10-16
System.out.println(localTime); // 15:28:04.023
System.out.println(localDateTime); // 2021-10-16T15:28:04.023
LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 6, 12, 13, 50);
System.out.println(localDateTime1);
System.out.println(localDateTime1.getMonth()); // OCTOBER
System.out.println(localDateTime1.getDayOfWeek()); // TUESDAY
// 设置方法,返回新的对象
LocalDateTime localDateTime2 = localDateTime1.withDayOfMonth(10);
2、DateTimeFormat
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyy-MM-dd hh:mm:ss");
// 格式化
String format = dateTimeFormatter.format(LocalDateTime.now());
// 解析
TemporalAccessor parse = dateTimeFormatter.parse(format);