大家在开发过程中必不可少的事项和日期打交道,对接别的相互系统时,时间日期格式不一致,转化注意每次都要转化!大全
每次写完就忘记了,事项小编专门来整理一篇来详细说一下他们四个的相互转换的方法,方便后面使用!转化注意!大全
这里先说一下,为什么日期有Date了,还在JDK8中推出了LocalDateTime、LocalDate呢?
原因Date:
因此,如果需要在线程中使用日期时间相关的操作,建议使用线程安全的日期时间类,比如JDK8中引入的新日期时间API中的LocalDateTime、LocalDate等类,或者使用线程安全的DateFormat和Calendar类。
我们在说一下LocalDateTime他们是怎么实现线程安全的:
LocalDateTime它是由LocalDate和LocalTime两个不可变的类组成的。LocalDate和LocalTime各自都是线程安全的,它们的时间信息都是基于UTC(协调世界时)计算的,并且不依赖于系统的时区设置。LocalDateTime也是一样,它是由系统时区和UTC计算得到的。
有兴趣的可以看一下:协调世界时介绍。
这些类主要是使用了以下两个技术来解决线程安全问题:
综上所述,Java 8中的新日期时间API通过不可变性和线程封闭性等技术,有效地解决了线程安全问题。这使得开发者们可以更加安全和便利地在多线程环境下使用日期时间类。
基本上新的系统都会使用LocalDateTime来作为日期时间,减少并发问题!
LocalDate类有一个format()方法,可以将日期转成字符串。format()方法需要一个DateTimeFormatter对象作为参数。以下代码示例中,我们将日期对象转换为字符串。
String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
System.out.println("当前字符串日期:" + dateStr);
我们可以使用parse()方法从字符串中解析日期对象。
LocalDate date = LocalDate.parse(dateStr);
System.out.println("日期对象:" + date);
同样,我们可以使用DateTimeFormatter类将LocalDateTime类型的日期对象格式化为字符串。
String dateTimeStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("当前字符串日期时间:" + dateTimeStr);
我们也可以使用parse()方法从字符串中解析日期时间对象。
LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println("当前日期时间对象:" + dateTime);
由于Java 8之前的版本使用Date类处理日期时间,因此将Java 8日期时间转化为Date类型很常见,我们可以使用如下方法进行操作。
Date dateNew1 = Date.from(date.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
System.out.println("当前日期对象转date:" + dateNew1);
Date dateNew2 = Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
System.out.println("当前日期时间对象转date:" + dateNew2);
LocalDate localDate = dateNew2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
System.out.println("当前date转日期对象:" + localDate);
LocalDateTime localDateTime = dateNew2.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
System.out.println("当前date转日期时间对象:" + localDateTime);
可以自己抽离一个方法,根据格式化来转化为自己想要的格式!也可以使用三方的格式转化,比如:hutool。
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("date转String字符串:" + df.format(dateNew2));
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("String字符串转date:" + df1.parse(dateTimeStr));
需要注意的是:
SimpleDateFormat是线程不安全的类,不适用于多线程环境,所以在实际开发中需要注意线程安全问题。可以考虑使用ThreadLocal来解决线程安全问题。
public class ThreadSafeDateFormat {
private ThreadLocal<DateFormat> dateFormatThreadLocal = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
public DateFormat get() {
return dateFormatThreadLocal.get();
}
}
ThreadSafeDateFormat dateFormat = new ThreadSafeDateFormat();
System.out.println("date转String字符串安全版:" + dateFormat.get().format(dateNew2));
System.out.println("String字符串转date安全版:" + dateFormat.get().parse(dateTimeStr));
需要注意的是,在使用时需要注意时区和时间戳的问题,否则可能会出现一些错误。
总之,熟练掌握这些类型之间的转换方式可以提高我们的开发效率,也可以避免一些常见的错误,在实际开发中能够更加高效地处理日期时间相关的任务。
责任编辑:姜华 来源: 小王博客基地 JavaDateLocalDate(责任编辑:休闲)
优化项目审批环节 四川省阿坝州“四个聚焦”促进工业经济平稳增长
我国首台套丁二烯法己二腈工业化生产项目成功投产 补齐产业链短板
实现“双过半”!四川泸石高速建设持续加速 将于2024年底全线建成通车
森特股份(603098.SH)总市值50.5亿元 隆基股份拟溢价三成收购总股本股的27.25%
四川省阿坝州抓好生态环境问题整改全覆盖核查 推动问题整改水平质的提升
中国石油首台井口光电一体化加热炉试运成功 年均可减少碳排放113吨
工商银行提前还房贷有违约金吗?房贷42万提前还10万怎么算?