JAVA:SimpleDataFormat格式化字符串引发的惨案

项目场景

项目中发现某类消息的时间字符串都是08分钟,消息的创建时间99%以上都不是08分钟创建的,数据十分整齐


原因分析

经过排查发现本问题又和SimpleDateFormat有关, 新员工使用SimpleDateFormat 处理的时候格式字符串编写错误导致了这个问题

public class Test {
	public static void main(String[] args) {
		
		SimpleDateFormat format1=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println(format1.format(new Date()));
		
		SimpleDateFormat format2=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		System.out.println(format2.format(new Date()));
		
		SimpleDateFormat format3=new SimpleDateFormat("yyyy-MM-dd HH:MM:ss");
		System.out.println(format3.format(new Date()));
		
	}
}

当前时间是 2021-08-18 16:44:04, 先想想运行结果是什么,选中查看运行结果

2021-08-18 16:44:04
2021-08-18 04:44:04
2021-08-18 16:08:04

 

运行结果和你想的一样吗?

  • HH 表示 24小时制, hh表示12小时制
  • MM : 代表月份, mm表示分钟


解决方案

格式化字符串编写错误 yyyy-MM-dd HH:MM:ss  ,大写的MM 表示月数,本月是8月,所以yyyy-MM-dd HH:MM:ss 的结果是时间中的分钟等于08

应该修改为:yyyy-MM-dd HH:mm:ss


格式化字符串相关的一些资料

yyyy : 代表年(不去区分大小写) 假设年份为 2017

    "y" , "yyy" , "yyyy" 匹配的都是4位完整的年 如 : "2017"

    "yy" 匹配的是年分的后两位 如 : "15"

    超过4位,会在年份前面加"0"补位 如 "YYYYY"对应"02017"

MM : 代表月(只能使用大写) 假设月份为 9

    "M" 对应 "9"

    "MM" 对应 "09"

    "MMM" 对应 "Sep"

    "MMMM" 对应 "Sep"

    超出3位,仍然对应 "September"

    

dd : 代表日(只能使用小写) 假设为13号

    "d" , "dd" 都对应 "13"

    超出2位,会在数字前面加"0"补位. 例如 "dddd" 对应 "0013"

hh : 代表时(区分大小写,大写为24进制计时,小写为12进制计时) 假设为15时

    "H" , "HH" 都对应 "15" , 超出2位,会在数字前面加"0"补位. 例如 "HHHH" 对应 "0015"

    "h" 对应 "3"

    "hh" 对应 "03" , 超出2位,会在数字前面加"0"补位. 例如 "hhhh" 对应 "0003"

mm : 代表分(只能使用小写) 假设为32分

    "m" , "mm" 都对应 "32" ,  超出2位,会在数字前面加"0"补位. 例如 "mmmm" 对应 "0032"

ss : 代表秒(只能使用小写) 假设为15秒

    "s" , "ss" 都对应 "15" , 超出2位,会在数字前面加"0"补位. 例如 "ssss" 对应 "0015"

E : 代表星期(只能使用大写) 假设为 Sunday

    "E" , "EE" , "EEE" 都对应 "Sun"

    "EEEE" 对应 "Sunday" , 超出4位 , 仍然对应 "Sunday"

a : 代表上午还是下午,如果是上午就对应 "AM" , 如果是下午就对应 "PM"

前一篇:RabbitMQ教程发布确认PublishConfirm

猜你喜欢

转载自blog.csdn.net/Beijing_L/article/details/119783675