博物建设公司网站深圳最专业的高端网站建设
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:08
当前位置: 首页 > news >正文
博物建设公司网站,深圳最专业的高端网站建设,昆明hph网站建设,太原网站网络推广为什么建议使用你 LocalDateTime #xff0c;而不是 Date#xff1f; 在项目开发过程中经常遇到时间处理#xff0c;但是你真的用对了吗#xff0c;理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗 通过阅读本篇文章你将了解到#xff1a; 为什么需要LocalDate…为什么建议使用你 LocalDateTime 而不是 Date 在项目开发过程中经常遇到时间处理但是你真的用对了吗理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat吗 通过阅读本篇文章你将了解到 为什么需要LocalDate、LocalTime、LocalDateTime【java8新提供的类】 java8新的时间API的使用方式包括创建、格式化、解析、计算、修改 为什么需要LocalDate、LocalTime、LocalDateTime Date如果不格式化打印出的日期可读性差 Tue Sep 10 09:34:04 CST 2019 使用SimpleDateFormat对时间进行格式化但SimpleDateFormat是线程不安全的SimpleDateFormat的format方法最终调用代码 private StringBuffer format(Date date, StringBuffer toAppendTo, FieldDelegate delegate) { // Convert input date to time field list calendar.setTime(date); boolean useDateFormatSymbols useDateFormatSymbols(); for (int i 0; i compiledPattern.length; ) { int tag compiledPattern[i] 8; int count compiledPattern[i] 0xff; if (count 255) { count compiledPattern[i] 16; count | compiledPattern[i]; } switch (tag) { case TAG_QUOTE_ASCII_CHAR: toAppendTo.append((char)count); break; case TAG_QUOTE_CHARS: toAppendTo.append(compiledPattern, i, count); i count; break; default: subFormat(tag, count, delegate, toAppendTo, useDateFormatSymbols); break; } } return toAppendTo; } calendar是共享变量并且这个共享变量没有做线程安全控制。当多个线程同时使用相同的SimpleDateFormat对象【如用static修饰的SimpleDateFormat】调用format方法时多个线程会同时调用calendar.setTime方法可能一个线程刚设置好time值另外的一个线程马上把设置的time值给修改了导致返回的格式化时间可能是错误的。 在多并发情况下使用SimpleDateFormat需格外注意SimpleDateFormat除了format是线程不安全以外parse方法也是线程不安全的。parse方法实际调用alb.establish(calendar).getTime()方法来解析alb.establish(calendar)方法里主要完成了 重置日期对象cal的属性值 使用calb中中属性设置cal 返回设置好的cal对象 但是这三步不是原子操作 多线程并发如何保证线程安全 - 避免线程之间共享一个SimpleDateFormat对象每个线程使用时都创建一次SimpleDateFormat对象 创建和销毁对象的开销大 - 对使用format和parse方法的地方进行加锁 线程阻塞性能差 - 使用ThreadLocal保证每个线程最多只创建一次SimpleDateFormat对象 较好的方法 Date对时间处理比较麻烦比如想获取某年、某月、某星期以及n天以后的时间如果用Date来处理的话真是太难了你可能会说Date类不是有getYear、getMonth这些方法吗获取年月日很Easy但都被弃用了啊 Come On 一起使用java8全新的日期和时间API LocalDate 只会获取年月日 创建LocalDate //获取当前年月日 LocalDate localDate LocalDate.now(); //构造指定的年月日 LocalDate localDate1 LocalDate.of(2019, 9, 10); 获取年、月、日、星期几 int year localDate.getYear(); int year1 localDate.get(ChronoField.YEAR); Month month localDate.getMonth(); int month1 localDate.get(ChronoField.MONTH_OF_YEAR); int day localDate.getDayOfMonth(); int day1 localDate.get(ChronoField.DAY_OF_MONTH); DayOfWeek dayOfWeek localDate.getDayOfWeek(); int dayOfWeek1 localDate.get(ChronoField.DAY_OF_WEEK); LocalTime 只会获取几点几分几秒 创建LocalTime LocalTime localTime LocalTime.of(13, 51, 10); LocalTime localTime1 LocalTime.now(); 获取时分秒 //获取小时 int hour localTime.getHour(); int hour1 localTime.get(ChronoField.HOUR_OF_DAY); //获取分 int minute localTime.getMinute(); int minute1 localTime.get(ChronoField.MINUTE_OF_HOUR); //获取秒 int second localTime.getSecond(); int second1 localTime.get(ChronoField.SECOND_OF_MINUTE); LocalDateTime 获取年月日时分秒等于LocalDateLocalTime 创建LocalDateTime LocalDateTime localDateTime LocalDateTime.now(); LocalDateTime localDateTime1 LocalDateTime.of(2019, Month.SEPTEMBER, 10, 14, 46, 56); LocalDateTime localDateTime2 LocalDateTime.of(localDate, localTime); LocalDateTime localDateTime3 localDate.atTime(localTime); LocalDateTime localDateTime4 localTime.atDate(localDate); 获取LocalDate LocalDate localDate2 localDateTime.toLocalDate(); 获取LocalTime LocalTime localTime2 localDateTime.toLocalTime(); Instant 获取秒数 创建Instant对象 Instant instant Instant.now(); 获取秒数 long currentSecond instant.getEpochSecond(); 获取毫秒数 long currentMilli instant.toEpochMilli(); 个人觉得如果只是为了获取秒数或者毫秒数使用System.currentTimeMillis()来得更为方便 修改LocalDate、LocalTime、LocalDateTime、Instant LocalDate、LocalTime、LocalDateTime、Instant为不可变对象修改这些对象对象会返回一个副本 增加、减少年数、月数、天数等 以 LocalDateTime 为例 LocalDateTime localDateTime LocalDateTime.of(2019, Month.SEPTEMBER, 10, 14, 46, 56); //增加一年 localDateTime localDateTime.plusYears(1); localDateTime localDateTime.plus(1, ChronoUnit.YEARS); //减少一个月 localDateTime localDateTime.minusMonths(1); localDateTime localDateTime.minus(1, ChronoUnit.MONTHS); 通过 with 修改某些值 //修改年为2019 localDateTime localDateTime.withYear(2020); //修改为2022 localDateTime localDateTime.with(ChronoField.YEAR, 2022); 还可以修改月、日 时间计算 比如有些时候想知道这个月的最后一天是几号、下个周末是几号通过提供的时间和日期API可以很快得到答案 LocalDate localDate LocalDate.now(); LocalDate localDate1 localDate.with(firstDayOfYear()); 比如通过firstDayOfYear()返回了当前日期的第一天日期还有很多方法这里不在举例说明 格式化时间 LocalDate localDate LocalDate.of(2019, 9, 10); String s1 localDate.format(DateTimeFormatter.BASIC_ISO_DATE); String s2 localDate.format(DateTimeFormatter.ISO_LOCAL_DATE); //自定义格式化 DateTimeFormatter dateTimeFormatter DateTimeFormatter.ofPattern(dd/MM/yyyy); String s3 localDate.format(dateTimeFormatter); DateTimeFormatter默认提供了多种格式化方式如果默认提供的不能满足要求可以通过DateTimeFormatter的ofPattern方法创建自定义格式化方式 解析时间 LocalDate localDate1 LocalDate.parse(20190910, DateTimeFormatter.BASIC_ISO_DATE); LocalDate localDate2 LocalDate.parse(2019-09-10, DateTimeFormatter.ISO_LOCAL_DATE); 和SimpleDateFormat相比DateTimeFormatter是线程安全的 小结 LocalDateTimeDate有的我都有Date没有的我也有日期选择请Pick Me SpringBoot中应用LocalDateTime 将LocalDateTime字段以时间戳的方式返回给前端 添加日期转化类 public class LocalDateTimeConverter extends JsonSerializerLocalDateTime { Override public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeNumber(value.toInstant(ZoneOffset.of(8)).toEpochMilli()); } } 并在 LocalDateTime 字段上添加 JsonSerialize(using LocalDateTimeConverter.class) 注解如下 JsonSerialize(using LocalDateTimeConverter.class) protected LocalDateTime gmtModified; 将LocalDateTime字段以指定格式化日期的方式返回给前端 在 LocalDateTime 字段上添加 JsonFormat(shapeJsonFormat.Shape.STRING, patternyyyy-MM-dd HH:mm:ss) 注解即可如下 JsonFormat(shapeJsonFormat.Shape.STRING, patternyyyy-MM-dd HH:mm:ss) protected LocalDateTime gmtModified; 对前端传入的日期进行格式化 在 LocalDateTime 字段上添加 DateTimeFormat(pattern yyyy-MM-dd HH:mm:ss) 注解即可如下 DateTimeFormat(pattern yyyy-MM-dd HH:mm:ss) protected LocalDateTime gmtModified;
- 上一篇: 博物馆网站制作建设 网站工作汇报
- 下一篇: 博兴做网站vps绑定多个网站






