通过时间格式的字符串解析时间格式

本文介绍了一种通过遍历预设时间格式列表来解析特定时间字符串的方法,并探讨了不同时间格式之间的匹配问题及其带来的有趣现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解析时间格式时发现的一个有趣的事

话不多说,在工作时有一个需求要求我通过一个时间格式的字符串解析出时间格式,然后我在网上找找看有没有什么工具可以用,但是也没发现什么这类工具,就干脆自己写了个简单的方法先解决了问题再说,结果就发现了一个有趣的东西。

​ 先看看我写的那个简单的方法。

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了。

在这里插入图片描述

感觉这个还是挺有趣的,之前没这样操作过确实也不知道这个现象,这个估计得研究源码才能知道为什么了,现在先把这个记一下,后面有时间看看源码,得到结果后再另写一篇博客。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佛祖保佑永不宕机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值