解析时间格式时发现的一个有趣的事
话不多说,在工作时有一个需求要求我通过一个时间格式的字符串解析出时间格式,然后我在网上找找看有没有什么工具可以用,但是也没发现什么这类工具,就干脆自己写了个简单的方法先解决了问题再说,结果就发现了一个有趣的东西。
先看看我写的那个简单的方法。
import com.google.common.base.Strings;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
public class test6 {
public static void main(String[] args) {
// 初始化一个字符串做测试
String dateStr = "2022-11-11 23:44";
// 必须把时间精度按照从高到低的顺序放在一个有序列表中,不然可能会匹配到其他低精度格式上
List<String> list = Arrays.asList("yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss", "yyyy_MM_dd HH:mm:ss",
"yyyy-MM-dd HH:mm", "yyyy/MM/dd HH:mm", "yyyy_MM_dd HH:mm",
"yyyy-MM-dd HH", "yyyy/MM/dd HH", "yyyy_MM_dd HH",
"yyyy-MM-dd", "yyyy/MM/dd", "yyyy_MM_dd",
"yyyy-MM", "yyyy/MM", "yyyy_MM");
String formatStr = getFormatStr(list, dateStr);
if (Strings.isNullOrEmpty(formatStr)) {
// 这里为什么把yyyyMMddHHmmss这类单独放一堆做处理呢,因为这种格式能匹配到其他格式,例如:2022-11-11 23:44
// 而这也是我遇到的有趣的事
List<String> simpleList = Arrays.asList("yyyyMMddHHmmss", "yyyyMMddHHmm", "yyyyMMddHH", "yyyyMMdd", "yyyyMM", "yyyy");
formatStr = getFormatStr(simpleList, dateStr);
}
// 最终得到时间格式
System.out.println(formatStr);
// 通过得到的格式输出一下当前时间
System.out.println(new SimpleDateFormat(formatStr).format(new Date()));
}
public static String getFormatStr(List<String> list, String dateStr) {
String curFormatStr = "";
for (String formatStr : list) {
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatStr);
// 如果时间格式不对,这里会抛出ParseException异常
simpleDateFormat.parse(dateStr);
curFormatStr = formatStr;
// 只要匹配上了,这里就直接退出循环,这也是为什么必须把时间精度按照从高到低的顺序放在一个有序列表中
break;
} catch (ParseException e) {
}
}
return curFormatStr;
}
}
运行结果也是正常的,成功解析出了字符串的时间格式为:yyyy-MM-dd HH:mm。
然后说说我遇到的情况,先贴源码。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.List;
public class test5 {
public static void main(String[] args) {
// 初始化一个字符串做测试
String dateStr = "2022-11-11 23:44";
List<String> list = Arrays.asList("yyyy-MM-dd HH:mm:ss", "yyyyMMddHHmmss", "yyyy/MM/dd HH:mm:ss", "yyyy_MM_dd HH:mm:ss",
"yyyy-MM-dd HH:mm", "yyyyMMddHHmm", "yyyy/MM/dd HH:mm", "yyyy_MM_dd HH:mm",
"yyyy-MM-dd HH", "yyyyMMddHH", "yyyy/MM/dd HH", "yyyy_MM_dd HH",
"yyyy-MM-dd", "yyyyMMdd", "yyyy/MM/dd", "yyyy_MM_dd",
"yyyy-MM", "yyyyMM", "yyyy/MM", "yyyy_MM",
"yyyy");
String formatStr = getFormatStr(list, dateStr);
}
public static String getFormatStr(List<String> list, String dateStr) {
String curFormatStr = "";
for (String formatStr : list) {
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatStr);
simpleDateFormat.parse(dateStr);
curFormatStr = formatStr;
System.out.println("时间格式字符串:" + dateStr);
System.out.println("匹配上的时间格式:" + formatStr);
// 那我把得到的格式反向给他还原回去,看看能不能得2022年11月11日23时44分的这个时间
System.out.println(new SimpleDateFormat(curFormatStr).parse(dateStr));
break;
} catch (ParseException e) {
}
}
return curFormatStr;
}
}
结果如下,yyyy-MM-dd HH:mm格式不仅能匹配上yyyyMMddHHmm格式字符串,而且我给他反向还原回去之后,时间还变了,不是原本的2022-11-11 23:44了。
感觉这个还是挺有趣的,之前没这样操作过确实也不知道这个现象,这个估计得研究源码才能知道为什么了,现在先把这个记一下,后面有时间看看源码,得到结果后再另写一篇博客。