java之日期时间类

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之间以毫秒为单位的时间差。此方法适于计算时间差

旧日期时间类型的缺点:

  1. 偏移性:Date中的年份是从1900开始的,而月份都是从0开始的
  2. 对象的可变性问题:大多数程序员认为一个日期时间的对象应该对应一个日期时间的点,不应该变化。Calendar类中可以使用三种方法更改日历字段:set()、add()、roll()
  3. 格式化:格式化只对Date有用,Calendar则不行。
  4. 此外,它们也不是线程安全的,不能处理闰秒等。

JDK1.8之后

Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。

  1. java.time – 包含值对象的基础包
  2. java.time.chrono – 提供对不同的日历系统的访问。
  3. java.time.format – 格式化和解析时间和日期
  4. java.time.temporal – 包括底层框架和扩展特性
  5. java.time.zone – 包含时区支持的类

Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。新的 java.time 中包含了所有关于时钟(Clock),本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。历史悠久的 Date 类新增了 toInstant() 方法,用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大简化了了日期时间和本地化的管理。

说明:大多数开发者只会用到基础包和format包,也可能会用到temporal包。因此,尽管有68个新的公开类型,大多数开发者,大概将只会用到其中的很少一部分。

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值