万字博文教你搞懂java源马的日期和时间相关用法

本文详细介绍了Java日期和时间API的使用,包括Calendar的常见操作,解决跨年问题,LocalDateTime的时间计算和格式化,ZonedDateTime的时区转换,以及DateTimeFormatter的格式化陷阱。文章通过实例展示了每个类的关键方法,并讨论了它们的线程安全性和潜在问题,帮助读者深入理解Java日期时间处理。
摘要由CSDN通过智能技术生成

FastDateFormat.getInstance(CHINESE_DATE_TIME_PATTERN);

复制代码

看下对应的源码

/**

  • 获得 FastDateFormat实例,使用默认格式和地区

  • @return FastDateFormat

*/

public static FastDateFormat getInstance() {

return CACHE.getInstance();

}

/**

  • 获得 FastDateFormat 实例,使用默认地区

  • 支持缓存

  • @param pattern 使用{@link java.text.SimpleDateFormat} 相同的日期格式

  • @return FastDateFormat

  • @throws IllegalArgumentException 日期格式问题

*/

public static FastDateFormat getInstance(final String pattern) {

return CACHE.getInstance(pattern, null, null);

}

复制代码

这里有用到一个CACHE,看来用了缓存,往下看

private static final FormatCache CACHE = new FormatCache(){

@Override

protected FastDateFormat createInstance(final String pattern, final TimeZone timeZone, final Locale locale) {

return new FastDateFormat(pattern, timeZone, locale);

}

};

//

abstract class FormatCache {

private final ConcurrentMap<Tuple, F> cInstanceCache = new ConcurrentHashMap<>(7);

private static final ConcurrentMap<Tuple, String> C_DATE_TIME_INSTANCE_CACHE = new ConcurrentHashMap<>(7);

}

复制代码

image-20210728914309

在getInstance 方法中加了ConcurrentMap 做缓存,提高了性能。且我们知道ConcurrentMap 也是线程安全的。

实践

/**

  • 年月格式 {@link FastDateFormat}:yyyy-MM

*/

public static final FastDateFormat NORM_MONTH_FORMAT = FastDateFormat.getInstance(NORM_MONTH_PATTERN);

复制代码

image-2021072895013629

//FastDateFormat

public static FastDateFormat getInstance(final String pattern) {

return CACHE.getInstance(pattern, null, null);

}

复制代码

image-20210728205104833

image-2021072895259113

如图可证,是使用了ConcurrentMap 做缓存。且key值是格式,时区和locale(语境)三者都相同为相同的key。

问题

1、tostring()输出时,总以系统的默认时区格式输出,不友好。

2、时区不能转换

3、日期和时间的计算不简便,例如计算加减,比较两个日期差几天等。

4、格式化日期和时间的SimpleDateFormat对象是线程不安全的

5、Date对象本身也是线程不安全的

public class Date

implements java.io.Serializable, Cloneable, Comparable

{

}

复制代码

二:Calendar

==========

支持版本及以上


JDK1.1

介绍

Calendar类说明

Calendar类提供了获取或设置各种日历字段的各种方法,比Date类多了一个可以计算日期和时间的功能。

Calendar常用的用法

// 获取当前时间:

Calendar c = Calendar.getInstance();

int y = c.get(Calendar.YEAR);

int m = 1 + c.get(Calendar.MONTH);

int d = c.get(Calendar.DAY_OF_MONTH);

int w = c.get(Calendar.DAY_OF_WEEK);

int hh = c.get(Calendar.HOUR_OF_DAY);

int mm = c.get(Calendar.MINUTE);

int ss = c.get(Calendar.SECOND);

int ms = c.get(Calendar.MILLISECOND);

System.out.println(“返回的星期:”+w);

System.out.println(y + “-” + m + “-” + d + " " + " " + hh + “:” + mm + “:” + ss + “.” + ms);

复制代码

image-202107141981024

如上图所示,月份计算时,要+1;返回的星期是从周日开始计算,周日为1,1~7表示星期;

Calendar的跨年问题和解决方案

问题

背景:在使用Calend

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值