java8时间处理方式
1.8之前时间对象都是可变的,其后改为final不可变,每次时间上的修改会返回一个新的对象 新时间日期API常用、重要对象介绍 1. ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则 2. Instant: 用来表示时间线上的一个点(瞬时) 3. LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的 4. LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的 5. LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的 6. Clock: 用于访问当前时刻、日期、时间,用到时区 7. Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔 8. Period: 用于计算两个“日期”间隔 LocalDate : 只含年月日的日期对象;LocalTime :只含时分秒的时间对象;LocalDateTime : 同时含有年月日时分秒的日期对象 使用
获取当前的时间对象,日期对象,总对象,使用now如LocalDate localDate = LocalDate.now();LocalDateTime localDateTime = LocalDateTime.now();
创建指定日期的对象,使用of,传入对应的年月日等,也可以传入instant对象 日期时间的加减
对于LocalDate,只有精度大于或等于日的加减,如年、月、日; 对于LocalTime,只有精度小于或等于时的加减,如时、分、秒、纳秒; 对于LocalDateTime,则可以进行任意精度的时间相加减; 使用withof** 将时间设置为指定值,使用get***,获取指定时间,如年,月 等 时间戳Instant
事实上Instant就是java8以前的Date, 可以使用以下两个类中的方法在这两个类型之间进行转换,比如Date.from(Instant)就是用来把Instant转换成java.util.date的,而new Date().toInstant()就是将Date转换成Instant的 格式化
使用DateTimeFormatter进行格式化,存在一些默认的格式,使用ofPattern(“yyyy-MM-dd”)来自定义格式 再localtime格式化或者转化时,传入formatter对象即可 时间戳转换
将时间抽转换为为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
Calendar类用于日期和时间字段的操作,它可以通过特定的方式设置和读取日期的特定部分,比如年、月、日、时等。Calendar类是一个抽象类。 创建:
通过Calendar calendar = Calendar.getInstance();
获取对应实例,此时实例中存储的为当前时间 可以有针对性的获取,设置,增加,删除日期中某一部分的值,如年月日;月份从0开始,取出时要+1 日期、月份、天数相加减时,可以使用calendar 转换:
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 线程不安全问题
用于将日期转换为字符串或者将字符串转换为日期,其内部使用calendar来存储时间信息,其calandar为类成员变量,所以再多线程时,若共用一个 SimpleDateFormat ,会出现日期错误情况 错误原因:
parse方法的最后,会调用CalendarBuilder的establish方法,入参就是SimpleDateFormat维护的Calendar实例,在establish方法中会调用calendar的clear方法 如果此时线程A将calendar清空且没有设置新值,线程B也进入parse方法用到了SimpleDateFormat对象中的calendar对象,此时就会产生线程安全问题! 出问题时会直接报错 解决办法
加锁 每次创建新的SimpleDateFormat 将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