JDK1.8之前
java.util.Date
构造方法:
new Date()
new Date(long date)
经常使用的方法:
// 测试此日起是否在指定日期之后
boolean after(Date when)
// 测试此日期是否在指定日期之前
boolean before(Date when)
// 比较两个日期的相等性
boolean equals(Object obj)
// 返回自1970年1月1日00:00:00GMT以来此Date对象表示的毫秒数
long getTime()
案例:
@Test
public void test01() {
Date date = new Date();
// Sun Mar 29 10:22:09 CST 2020
System.out.println(date);
// 当前系统时间距离 1970-1-1 0:0:0 0毫秒的时间差,毫秒为单位
long l = System.currentTimeMillis();
// 1585448529778
System.out.println(l);
long time = date.getTime();
// 1585448529765
System.out.println(time);
Date date1 = new Date(1585445381544l);
// Sun Mar 29 09:29:41 CST 2020
System.out.println(date1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String format = sdf.format(1585445381544l);
// 2020-03-29 09:29:41.544
System.out.println(format);
}
@Test
public void test02() {
Date d1 = new Date();
Date d2 = new Date();
System.out.println(d1);
System.out.println(d2);
if (d1.after(d2)) {
System.out.println("d1.after.d2");
}
if (d1.before(d2)) {
System.out.println("d1.before.d2");
}
if (d1.equals(d2)) {
System.out.println("d1.equals.d2");
}
System.out.println(d1.getTime());
}
java.util.Calendar(抽象):
Date中很多方法已经过时了,推荐使用Calendar的方法
常用方法:
// 使用默认时区和语言环境获取一个Calendar实例
static Calendar getInstance()
// 使用默认时区和指定的语言环境获取一个日历
static Calendar getInstance(Locale aLocale)
// 使用指定时区和默认语言环境获取一个日历
static Calendar getInstance(TimeZone zone)
// 使用指定时区和语言环境获取一个日历
static Calendar getInstance(TimeZone zone, Locale aLocale)
// 返回给定日历字段的值
int get(int field)
Calendar类中包含很多方法,这里不一一列出,例如可以求当前月份的第一天或者最后一天等等
案例1:获取传入日期所在月的第一天
public void lastDayOfMonth(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int minDay = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DAY_OF_MONTH,minDay);
System.out.println(cal.getTime());
}
TimeZone:
案例一:获取所有时区
@Test
public void test04() {
String[] all = TimeZone.getAvailableIDs();
for (String s : all) {
System.out.println(s);
}
}
案例二:获取Calendar时指定时区
@Test
public void test05() {
TimeZone timeZone = TimeZone.getTimeZone("America/New_York");
Calendar instance = Calendar.getInstance(timeZone);
System.out.println(instance);
}
SimpleDateFormat
@Test
public void test09() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String str = sdf.format(date);
System.out.println(str);
}
@Test
public void test10() throws ParseException {
String str = "2020-03-24 11:29:16.684";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
// sdf也可以指定时区
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date parse = sdf.parse(str);
System.out.println(parse);
}
java.lang.System
System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒GMT之间以毫秒为单位的时间差。此方法适于计算时间差。
旧日期时间类型的缺点:
- 偏移性:Date中的年份是从1900开始的,而月份都是从0开始的
- 对象的可变性问题:大多数程序员认为一个日期时间的对象应该对应一个日期时间的点,不应该变化。Calendar类中可以使用三种方法更改日历字段:set()、add()、roll()
- 格式化:格式化只对Date有用,Calendar则不行。
- 此外,它们也不是线程安全的,不能处理闰秒等。
JDK1.8之后
Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。
- java.time – 包含值对象的基础包
- java.time.chrono – 提供对不同的日历系统的访问。
- java.time.format – 格式化和解析时间和日期
- java.time.temporal – 包括底层框架和扩展特性
- java.time.zone – 包含时区支持的类
Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。新的 java.time 中包含了所有关于时钟(Clock),本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。历史悠久的 Date 类新增了 toInstant() 方法,用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大简化了了日期时间和本地化的管理。
说明:大多数开发者只会用到基础包和format包,也可能会用到temporal包。因此,尽管有68个新的公开类型,大多数开发者,大概将只会用到其中的很少一部分。