首页 > 编程语言 >在 Java 中,要处理 未知的输入格式(可能是日期字符串或时间戳字符串),统一返回日期对象。

在 Java 中,要处理 未知的输入格式(可能是日期字符串或时间戳字符串),统一返回日期对象。

时间:2024-12-11 09:33:37浏览次数:4  
标签:Java String Date 日期 字符串 格式 解析

在 Java 中,要处理 未知的输入格式(可能是日期字符串或时间戳字符串),可以通过以下步骤实现:

  1. 判断输入是日期字符串还是时间戳字符串

    • 如果是全数字组成的字符串,可以尝试将其解析为时间戳。
    • 否则,按照支持的日期格式解析。
  2. 支持多种日期格式

    • 定义常见日期格式的数组,逐一尝试解析日期字符串。
  3. 统一返回日期对象

    • 根据解析结果,返回 java.util.Date 或现代 java.time 类的实例。

示例代码

以下是完整的实现:

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Date;

public class FlexibleDateConverter {

    // 支持的日期格式
    private static final String[] DATE_FORMATS = {
        "yyyy-MM-dd HH:mm:ss",
        "yyyy-MM-dd",
        "MM/dd/yyyy HH:mm:ss",
        "MM/dd/yyyy",
        "dd-MM-yyyy",
        "dd/MM/yyyy"
    };

    /**
     * 将未知格式的字符串解析为 Date 对象
     */
    public static Date parse(String input) {
        // 判断是否是纯数字字符串(可能是时间戳)
        if (input.matches("\\d+")) {
            return parseTimestamp(input);
        }

        // 否则尝试按日期字符串解析
        return parseDateString(input);
    }

    /**
     * 将日期字符串解析为 Date 对象
     */
    private static Date parseDateString(String dateString) {
        for (String format : DATE_FORMATS) {
            try {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
                LocalDateTime localDateTime = LocalDateTime.parse(dateString, formatter);
                return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
            } catch (DateTimeParseException e) {
                // 忽略当前格式,尝试下一个
            }
        }
        throw new IllegalArgumentException("无法解析日期字符串: " + dateString);
    }

    /**
     * 将时间戳字符串解析为 Date 对象
     */
    private static Date parseTimestamp(String timestampString) {
        try {
            long timestamp = Long.parseLong(timestampString);
            return new Date(timestamp);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("无效的时间戳字符串: " + timestampString, e);
        }
    }

    public static void main(String[] args) {
        // 示例:日期字符串
        String dateString1 = "2024-12-09 14:30:00";
        String dateString2 = "12/09/2024";

        // 示例:时间戳字符串
        String timestampString = "1702117800000";

        System.out.println("解析日期字符串1: " + parse(dateString1));
        System.out.println("解析日期字符串2: " + parse(dateString2));
        System.out.println("解析时间戳字符串: " + parse(timestampString));
    }
}

输出示例

假设当前时区为 CST:

解析日期字符串1: Mon Dec 09 14:30:00 CST 2024
解析日期字符串2: Mon Dec 09 00:00:00 CST 2024
解析时间戳字符串: Mon Dec 09 14:30:00 CST 2024

代码解析

  1. 判断字符串类型

    • 使用正则表达式 \\d+ 判断输入是否是纯数字:
      • 如果是纯数字,尝试将其转换为 long 类型的时间戳。
      • 如果不是,则尝试按照日期格式解析。
  2. 支持多种日期格式

    • 定义 DATE_FORMATS 数组,存放常见的日期格式。
    • 使用 DateTimeFormatter 逐一尝试解析,直到成功解析。
  3. 解析时间戳字符串

    • 使用 Long.parseLong() 将字符串转换为时间戳。
    • java.util.Date 或现代 java.time.Instant 创建日期对象。
  4. 错误处理

    • 如果所有日期格式都无法匹配,或者时间戳转换失败,抛出 IllegalArgumentException 提示格式不合法。

优化点

  1. 支持更多的时间戳格式

    • 时间戳可以是秒级(10 位)或毫秒级(13 位)。可以通过以下代码自动适配:
      long timestamp = Long.parseLong(input);
      if (String.valueOf(timestamp).length() == 10) {
          timestamp *= 1000; // 秒转换为毫秒
      }
      return new Date(timestamp);
      
  2. 返回现代日期类型

    • 如果需要支持 java.time 类型(如 LocalDateTimeZonedDateTime),可以在解析时直接返回对应的类型:
      public static LocalDateTime parseToLocalDateTime(String input) {
          // 与上述逻辑类似,但最终返回 LocalDateTime
      }
      

总结

  • 多种日期格式:通过定义 DATE_FORMATS 数组支持多种日期字符串解析。
  • 自动识别时间戳:通过正则表达式判断输入是否为时间戳,并支持秒/毫秒的自动适配。
  • 统一返回:返回 Date 对象,便于兼容性。如果需要现代日期类,可以扩展返回 LocalDateTime 或其他类型。

这种实现方式适用于大多数场景,灵活且易于扩展。

标签:Java,String,Date,日期,字符串,格式,解析
From: https://www.cnblogs.com/Will-Chang/p/18598603

相关文章

  • java核心基础 第一章 基石篇
    内容概述在java的世界里,我们离不开三个核心的概念,这是java世界的基石。他们分别是java语言、JVM、JDK。本章的学习目标是深刻理解java语言、JVM、和JDK。并额外需要理解一个classpath这个概念。以及要知道java程序运行时都需要经历哪些环节。前置阅读本章涉及到的一些术......
  • 认识java
    认识JAVAJAVA简介主要特性以下是Java的一些主要特性以下是Java的一些其他特性Java开发环境Java程序结构学习Java学习Java通常涉及以下几个步骤JAVA简介Java是由SunMicrosystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由Ja......
  • 校园二手物品交易市场系统|Java|SSM|VUE| 前后端分离
                  【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apachetom......
  • 校园点餐系统|Java|SSM|JSP| 前后端分离
                  【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apachetom......
  • 摊位管理系统|Java|SSM|JSP| 前后端分离
                  【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apachetom......
  • Luogu P9606 CERC2019 ABB 题解 [ 绿 ] [ KMP ] [ 字符串哈希 ]
    ABB:KMP的做法非常巧妙。哈希思路显然正着做一遍哈希,倒着做一遍哈希,然后枚举回文中心即可。时间复杂度\(O(n)\)。代码#include<bits/stdc++.h>#definefifirst#definesesecond#definelc(p<<1)#definerc((p<<1)|1)usingnamespacestd;typedeflonglongll;......
  • Java 转 C之错误处理
    提纲:从Java转向C的错误处理概念概述Java异常机制与C返回值/errno的对比C中错误处理的常用方式详解函数返回值errno全局错误码自定义错误码setjmp/longjmp模拟异常常见错误码列表(POSIX环境为例)Java与C的错误处理示例对比全量示例:从文件读数据并处理错误......
  • 【java】在word指定书签处插入多个字符串
    1. 插入多个字符串,不加换行符/***插入字符串列表**@paramnode*@parambookmarkName书签名称*@paramlist*/publicstaticvoidwriteStringList(Nodenode,StringbookmarkName,List<String>list){try{......
  • 什么是 Java 中的 JIT(Just-In-Time)?
    Java中的JIT(Just-In-Time)编译器1.JIT的定义JIT(Just-In-Time)编译器是一种用于Java虚拟机(JVM)的动态编译技术。它在Java程序运行时,将Java字节码(Bytecode)转换为本地机器代码,从而提高程序的运行效率。位置:JIT是JVM的一部分,内嵌在JVM内部。目标:提升字节码执行的速度......
  • A306 基于Java+jsp+SQL的社交论坛 BBS 源码 文档
    社交论坛的设计与实现1.摘要2.开发目的和意义2.1系统开发目的2.2系统开发意义3.系统功能设计4.系统界面截图5.源码获取1.摘要摘要随着信息技术的快速发展,人与人之间交流方式越来越先进。在当今时代,QQ、留言板、博客、微信等已成为人们彼此沟通、交流信息的主要......