java 时间相关

java8时间处理方式

  1. 1.8之前时间对象都是可变的,其后改为final不可变,每次时间上的修改会返回一个新的对象
  2. 新时间日期API常用、重要对象介绍
    1. ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则
    2. Instant: 用来表示时间线上的一个点(瞬时)
    3. LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的
    4. LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的
    5. LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的
    6. Clock: 用于访问当前时刻、日期、时间,用到时区
    7. Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔
    8. Period: 用于计算两个“日期”间隔
  3. LocalDate : 只含年月日的日期对象;LocalTime :只含时分秒的时间对象;LocalDateTime : 同时含有年月日时分秒的日期对象
  4. 使用
    1. 获取当前的时间对象,日期对象,总对象,使用now如LocalDate localDate = LocalDate.now();LocalDateTime localDateTime = LocalDateTime.now();
    2. 创建指定日期的对象,使用of,传入对应的年月日等,也可以传入instant对象
  5. 日期时间的加减
    • 对于LocalDate,只有精度大于或等于日的加减,如年、月、日;
    • 对于LocalTime,只有精度小于或等于时的加减,如时、分、秒、纳秒;
    • 对于LocalDateTime,则可以进行任意精度的时间相加减;
  6. 使用withof** 将时间设置为指定值,使用get***,获取指定时间,如年,月 等
  7. 时间戳Instant
    1. 事实上Instant就是java8以前的Date,
    2. 可以使用以下两个类中的方法在这两个类型之间进行转换,比如Date.from(Instant)就是用来把Instant转换成java.util.date的,而new Date().toInstant()就是将Date转换成Instant的
  8. 格式化
    1. 使用DateTimeFormatter进行格式化,存在一些默认的格式,使用ofPattern(“yyyy-MM-dd”)来自定义格式
    2. 再localtime格式化或者转化时,传入formatter对象即可
  9. 时间戳转换
    1. 将时间抽转换为为instant,再将instant转换为对应的localtime等
 timestamp = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
 LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()),ZoneId.of("Asia/Shanghai"))
LocalDateTime time2 =LocalDateTime.ofEpochSecond(timestamp/1000,0,ZoneOffset.ofHours(8));

旧方式

Calendar

  1. Calendar类用于日期和时间字段的操作,它可以通过特定的方式设置和读取日期的特定部分,比如年、月、日、时等。Calendar类是一个抽象类。
  2. 创建:
    1. 通过Calendar calendar = Calendar.getInstance();获取对应实例,此时实例中存储的为当前时间
  3. 可以有针对性的获取,设置,增加,删除日期中某一部分的值,如年月日;月份从0开始,取出时要+1
  4. 日期、月份、天数相加减时,可以使用calendar
  5. 转换:
1. Calendar转换成Date
Calendar cal = Calendar.getInstance();
Date date = cal.getTime;
2. Date 转换成 Calendar
Date date = new Date();
Calendar cal = Calendar.getInstance();
Cal.setTime(date );

SimpleDateFormat 线程不安全问题

  1. 用于将日期转换为字符串或者将字符串转换为日期,其内部使用calendar来存储时间信息,其calandar为类成员变量,所以再多线程时,若共用一个 SimpleDateFormat ,会出现日期错误情况
  2. 错误原因:
    1. parse方法的最后,会调用CalendarBuilder的establish方法,入参就是SimpleDateFormat维护的Calendar实例,在establish方法中会调用calendar的clear方法
    2. 如果此时线程A将calendar清空且没有设置新值,线程B也进入parse方法用到了SimpleDateFormat对象中的calendar对象,此时就会产生线程安全问题!
    3. 出问题时会直接报错
  3. 解决办法
    1. 加锁
    2. 每次创建新的SimpleDateFormat
    3. 将SimpleDateFormat 添加到threadlocal中

时间字母对照

字母含义示例
y年份。一般用 yy 表示两位年份,yyyy 表示 4 位年份使用 yy 表示的年扮,如 11; 使用 yyyy 表示的年份,如 2011
M月份。一般用 MM 表示月份,如果使用 MMM,则会 根据语言环境显示不同语言的月份使用 MM 表示的月份,如 05; 使用 MMM 表示月份,在 Locale.CHINA 语言环境下,如“十月”;在 Locale.US 语言环境下,如 Oct
d月份中的天数。一般用 dd 表示天数使用 dd 表示的天数,如 10
D年份中的天数。表示当天是当年的第几天, 用 D 表示使用 D 表示的年份中的天数,如 295
E星期几。用 E 表示,会根据语言环境的不同, 显示不 同语言的星期几使用 E 表示星期几,在 Locale.CHINA 语 言环境下,如“星期四”;在 Locale.US 语 言环境下,如 Thu
H一天中的小时数(0~23)。一般用 HH 表示小时数使用 HH 表示的小时数,如 18
h一天中的小时数(1~12)。一般使用 hh 表示小时数使用 hh 表示的小时数,如 10 (注意 10 有 可能是 10 点,也可能是 22 点)
m分钟数。一般使用 mm 表示分钟数使用 mm 表示的分钟数,如 29
s秒数。一般使用 ss 表示秒数使用 ss 表示的秒数,如 38
S毫秒数。一般使用 SSS 表示毫秒数使用 SSS 表示的毫秒数,如 156
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值