java中SimpleDateFormat解析日期格式的问题

java,simpledateformat · 浏览次数 : 0

小编点评

**如何正确处理日期格式** 为了正确处理日期格式,可以采取以下步骤: 1. **使用 `SimpleDateFormat` 类** 创建一个 `SimpleDateFormat` 对象,并使用 `setLenient(false)` 方法设置日期格式为 "yyyyMMdd",表示只接受精确的日期格式(20240601)。 ```java SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); sdf.setLenient(false); ``` 2. **使用 `parse()` 方法** 将用户传入的日期字符串转换为 `Date` 类型。 ```java Date d = sdf.parse("2024-06-01"); ``` 3. **使用 `format()` 方法** 将 `Date` 类型转换为 `String` 类型,并按照期望的日期格式输出。 ```java System.out.println(sdf.format(d)); ``` **示例** 假设用户传入的日期字符串为 "2024-06-01",那么代码将执行以下步骤: 1. 创建一个 `SimpleDateFormat` 对象,并设置格式为 "yyyyMMdd"。 2. 使用 `parse()` 方法将用户传入的日期字符串转换为 `Date` 类型。 3. 使用 `format()` 方法将 `Date` 类型转换为 `String` 类型,并输出结果。 **输出** ``` 20240601 ``` **注意** - 如果用户传入的日期格式不匹配 `yyyyMMdd`,例如 "2024-06-02",则会抛出 `ParseException` 错误。 - 如果用户传入的日期格式正确,但格式中包含非法字符,例如 "2024-06-01!",则也会抛出 `ParseException` 错误。

正文

图片

在日常写代码的过程中,我们经常要处理各种格式的日期,常见的日期格式有:“20240601”,“2024-06-01”,“2024-6-1”。如何正确地处理日期格式,尤其是对外接口中参数的日期格式,就很重要了,一个不小心就可能出现意想不到的问题。

举一个我遇到的真实例子:我们提供的对外接口中有一个参数是日期,定义的格式是“yyyyMMdd”,就是说我们要求用户在调用接口的时候要传“20240601”这样格式的日期,但是,接口提供出去,怎么用就是别人的事了…你会发现经常有用户调用接口的时候,传“2024-06-01”这样格式的日期。如果我们不对格式做校验会出现什么问题呢?

    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    Date d = sdf.parse("2024-06-01");
    System.out.println(sdf.format(d));

你猜上面这段代码的输出是什么?

是:20231206

出现的问题就是:用户希望查2024年6月1日的数据,接口返回的却是2023年12月6日的数据。

如何避免这个问题?我们需要对日期格式做强校验,当用户传的日期格式不是我们希望的日期格式的时候,我们就通过报错来提示用户。

正好SimpleDateFormat父类DateFormat提供了一个方法:public void setLenient(boolean lenient),这个方法可以控制是否容忍不正确的日期格式,它默认是true,我们需要改成false。就是不容忍错误格式,对格式做强验证。上面的代码可以改成:

    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    sdf.setLenient(false);
    Date d = sdf.parse("2024-06-01");
    System.out.println(sdf.format(d));

再运行上面的代码会抛出异常:Exception in thread “main” java.text.ParseException: Unparseable date: “2024-06-01”

当然,如果你不需要严格的日期校验,不希望代码抛异常,希望代码运行得更健壮,你就不要加这句:sdf.setLenient(false); 你需要根据实际情况来做决定。

以上就是我遇到过的SimpleDateFormat解析日期格式的问题。如果你有什么疑问,欢迎留言跟我讨论。


著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

https://wangxuan.me/tech/2024/06/03/validate-date-format-with-SimpleDateFormat.html

与java中SimpleDateFormat解析日期格式的问题相似的内容:

java中SimpleDateFormat解析日期格式的问题

在日常写代码的过程中,我们经常要处理各种格式的日期,常见的日期格式有:“20240601”,“2024-06-01”,“2024-6-1”。如何正确地处理日期格式,尤其是对外接口中参数的日期格式,就很重要了,一个不小心就可能出现意想不到的问题。 举一个我遇到的真实例子:我们提供的对外接口中有一个参数

Java面试题:SimpleDateFormat是线程安全的吗?使用时应该注意什么?

在Java开发中,我们经常需要获取和处理时间,这需要使用到各种不同的方法。其中,使用SimpleDateFormat类来格式化时间是一种常见的方法。虽然这个类看上去功能比较简单,但是如果使用不当,也可能会引发一些问题。

Java中可以用的大数据推荐算法

在Java中实现大数据推荐算法时,通常会使用一些开源的机器学习库,如Apache Mahout、Weka、DL4J(DeepLearning4j,用于深度学习)或者Spark MLlib(用于在Spark集群上运行)。由于完整实现一个大数据推荐算法的代码量可能非常大,并且需要配合具体的数据集和环境进

java中判断String类型为空和null的方法

1.判断一个String类型的变量是否为空(即长度为0)或者为null 在Java中,判断一个String类型的变量是否为空(即长度为0)或者为null,通常需要使用两个条件语句来进行检查。这是因为null表示变量没有引用任何对象,而空字符串("")表示变量引用了一个没有内容的字符串对象。 下面是一

Java遍历Map集合的方法

Java中遍历Map集合的常用方式主要有以下几种: 1.使用keySet()方法遍历 遍历Map的key集合,然后通过key获取value。 Map map = new HashMap<>(); map.put("one", 1); map.put("two", 2

京东二面:Sychronized的锁升级过程是怎样的

Java中Synchronized锁升级通过偏向锁、轻量级锁到重量级锁的动态转变,优化了多线程同步性能。偏向锁减少无竞争场景的开销,轻量级锁借助CAS与自旋优化低竞争环境,重量级锁确保高竞争下的互斥性。合理设计并发模型,监控锁状态并结合其他并发工具以充分利用锁升级优势。

Java 中的深拷贝和浅拷贝你了解吗?

Java 开发中,对象拷贝是常有的事,很多人可能搞不清到底是拷贝了引用还是拷贝了对象。本文将详细介绍相关知识,让你充分理解 Java 拷贝。

Java中CAS算法的集中体现:Atomic原子类库,你了解吗?

一、写在开头 在前面的博文中我们学习了volatile关键字,知道了它可以保证有序性和可见性,但无法保障原子性,结局原子性问题推荐使用synchronized、Lock或者AtomicInteger;我们还学习过CAS算法,在那篇博文中我们同样也提及atomic。那么今天,我们就来好好学一学Atom

字节面试:说说Java中的锁机制?

Java 中的锁(Locking)机制主要是为了解决多线程环境下,对共享资源并发访问时的同步和互斥控制,以确保共享资源的安全访问。 锁的作用主要体现在以下几个方面: 互斥访问:确保在任何时刻,只有一个线程能够访问特定的资源或执行特定的代码段。这防止了多个线程同时修改同一资源导致的数据不一致问题。 内

Java中的读写锁ReentrantReadWriteLock详解,存在一个小缺陷

写在开头 最近是和java.util.concurrent.locks包下的同步类干上了,素有 并发根基 之称的concurrent包中全是精品,今天我们继续哈,今天学习的主题要由一个大厂常问的Java面试题开始: 小伙子,来说一说Java中的读写锁,你都用过哪些读写锁吧? 这个问题小伙伴们遇到了该