如何使用线程安全的时间类(jdk1.8)

1. Java8新时间特性

我们一般描述时间会用Date()对象来表示,但是为了时间显示更加符合习惯,会使用SimpleDateFormat来进行格式化。但是这种使用是存在缺陷的。

1.1 SimpleDateFormat线程不安全

SimpleDateFormat是线程不安全的,因为这个这个类是继承于DateFormat的,DateFormat中有一个Calender属性,可以说SimpleDateFormat的格式化就是依赖于这个属性进行操作的。

SimpleDateFormat的format方法中将传入的Date对象会交给calendar属性(calendar.setTime(date););当A线程传入时间a调用format方法进行格式化,format方法还没执行完,此时B线程传入时间b调用format方法进行格式化,则A线程中的calendar的time就变成了B线程传入的时间b了,当执行format方法中的subFormat方法时,获取到的格式化的时间是不正确的。

Java8中可以使用LocalDate(描述日期,即年月日)、LocalTime(描述时间,即时分秒)、LocalDateTime(日期时间,即年月日时分秒)对象来处理日期时间。

1.2 LocalDate的基本使用
public class Test2 {
    public static void main(String[] args){
        // 获取当前日期
        LocalDate date = LocalDate.now();
        System.out.println(date);
        // 获取年月日
        int year = date.getYear();
        int month = date.getMonthValue();  // date.getMonth()获取到的是Month对象
        int day = date.getDayOfMonth();
        System.out.println(year+"-"+month+"-"+day);
        // 修改日期
        LocalDate newDate = date.withYear(2019).withMonth(12).withDayOfMonth(12);
        System.out.println("修改后的时间:"+newDate);
        // 解析日期
        LocalDate parseDate = LocalDate.parse("2008-08-08");
        System.out.println("解析日期:"+parseDate);
    }
}

结果:
在这里插入图片描述
注意:

  • date.getMonth()获取到的是月份的英文单词,date.getMonthValue()才是获取数字的月份
  • 解析日期要注意,日期格式必须为yyyy-MM-dd这种,比如"2008-8-8"这种是会抛出异常的,必须要是两位的月份和日。而且间隔必须是横杠“-”不能是冒号“:”这个要注意,下面将的LocalTime的解析就是“:”间隔了,要注意区分。
1.3 LocalTime的基本使用
public class Test2 {
    public static void main(String[] args){
        // 获取时间
        LocalTime time = LocalTime.now();
        System.out.println(time);
        // 获取时分秒
        int hour = time.getHour();
        int minute = time.getMinute();
        int second = time.getSecond();
        System.out.println(hour+":"+minute+":"+second);
        // 修改时间
        LocalTime newTime = time.withHour(12).withMinute(9).withSecond(34);
        System.out.println("修改后的时间"+newTime);
        // 解析时间
        LocalTime parseTime = LocalTime.parse("20:12:08");
        System.out.println(parseTime);
    }
}

结果:

注意:

  • 解析日期要注意,日期格式必须为HH:mm:ss这种,比如“20:2:12”这种是会抛出异常的,必须要是两位的时分秒。而且间隔必须是“:”不能是“-”,和LocalDate是不同的。
1.4 LocalDateTime的基本使用
public class Test2 {
    public static void main(String[] args){
        // LocalDateTime的使用
        LocalDateTime date = LocalDateTime.now();
        System.out.println(date);
        // 获取年月日,时分秒
        // 和上面的LocalDate和LocalTime一样。
        System.out.println(date.getYear()+"-"+date.getMonthValue()+"-"+date.getDayOfMonth()+" "+
                date.getHour()+":"+date.getMinute()+":"+date.getSecond());
        // 修改日期时间
        System.out.println(date.withYear(2009).withHour(22).withSecond(12));
        // 解析日期时间
        System.out.println(LocalDateTime.parse("2008-12-02T12:12:12"));
    }
}

结果:
在这里插入图片描述
注意:

  • 获取和修改日期时间与LocalDate和LocalTime一样的用法。注意事项也一样
  • 解析日期时间要注意,按照我们的习惯可能日期和时间之间是用空格隔开,比如:“2008-12-02 12:12:12”,但是这样会抛出异常,必须用T来替代空格。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大骨熬汤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值