Java---SimpleDateFormat

SimpleDateFormat:一个对位置敏感的格式化解析日期的实体类。(java.text.SimpleDateFormat包中)

使用方法:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test{
//	private static final String SimpleDateFormat = null;2
	public static void main(String[] args) throws Exception {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println(simpleDateFormat.format(new Date()));
		System.out.println(simpleDateFormat.parse("2018-07-24 19:10:10"));
	}
}
  • 首先要定义一个日期的pattern模式,即SimpleDateFormat无论格式化日期还是解析日期都是按照这个pattern
  • 对于format需要传递一个Date对象,返回String,String会按照pattern生成
  • 对于parse需要传递一个按照上面pattern的字符串,传递错误的pattern会返回ParseException异常,传递正确会生成一个Date对象

格式化日期的pattern:

附:格式占位符
G 年代标志符
y 年
M 月
d 日
h 时 在上午或下午 (1~12)
H 时 在一天中 (0~23)
m 分
s 秒
S 毫秒
E 星期
D 一年中的第几天
F 一月中第几个星期几
w 一年中第几个星期
W 一月中第几个星期
a 上午 / 下午 标记符
k 时 在一天中 (1~24)
K 时 在上午或下午 (0~11)
z 时区

SimpleDateFormat会引发的问题:(SimpleDateFormat是线程不安全的)

1 输出值不对

2 内存泄露

解决办法:

  1. 定义一个SimpleDateFormat常量,
    protect static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);

    SimpleDateFormat线程不安全是因为SimpleDateFormat在格式化和解析字符串的时候都会通过中间对象Calendar对象进行转换。若有多个线程同时操作Calendar时,后来的线程会覆盖先来的线程数据。

  2. 新建SimpleDateFormat,即每次使用都新建一个SimpleDateFormat

  3. 使用ThreadLocal,由于ThreadLocal是线程之间隔离开的,对每个线程都是用ThreadLocal保存,就不会出现线程安全问题。

    private static ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new ThreadLocal<>();
    public static Date formatDate(String date) throws ParseException {
        SimpleDateFormat dayFormat = getSimpleDateFormat();
        return dayFormat.parse(date);
    }
    private static SimpleDateFormat getSimpleDateFormat() {    
        SimpleDateFormat simpleDateFormat = simpleDateFormatThreadLocal.get();
        if (simpleDateFormat == null){
            simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss")
            simpleDateFormatThreadLocal.set(simpleDateFormat);
        }
        return simpleDateFormat;
    }

     

  4. 使用第三方工具包:Joda-Time(推荐)和common-lang包

  5. jdk1.8中使用LocalDateTime、LocalDate、LocalTime类
  • LocalDatetime包含时间和日期
  • LocalDate:只包含日期,不包含时间
  • LocalTime:只包含时间,不包含日期

最后加一个时间戳转换成时间的代码:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test{
//	private static final String SimpleDateFormat = null;2

	public static void main(String[] args) throws Exception {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Long time = System.currentTimeMillis();
		Date date = new Date(Long.parseLong(String.valueOf(time)));
		System.out.println(simpleDateFormat.format(date));
//      简洁版
//      System.out.println(simpleDateFormat.format(new Date(Long.parseLong(String.valueOf(time)))));
	}
	
}

引自:

https://www.toutiao.com/a6581679469243662852/?tt_from=weixin&utm_campaign=client_share&timestamp=1532429943&app=news_article&utm_source=weixin&iid=38581213264&utm_medium=toutiao_android&wxshare_count=1

https://blog.csdn.net/hyp520520/article/details/78375290

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值