java.text.ParseException及日期格式化

这篇具有很好参考价值的文章主要介绍了java.text.ParseException及日期格式化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在优化接口时,遇到该异常,导致前端页面一直报500错误:

java.text.parse,java,单元测试,springboot Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.text.ParseException: Unparseable date: "Fri Apr 07 20:16:19 CST 2023"] with root cause
java.text.ParseException: Unparseable date: "Fri Apr 07 20:16:19 CST 2023".....

经过一段时间搜索和查找资料,发现是由于使用了以下的格式转化方式导致该异常:

Format dataFormat = new SimpleDateFormat("yyyy-MM-dd");
Date parse = dataFormat.parse(String.valueOf(date));
System.out.println(parse);

我的初衷是想让时间格式话,所以采用了该方法,然而这样的作法会导致该异常,导致前端接受数据发生中断。于是我打开parseObject的源码:

public abstract Object parseObject (String source, ParsePosition pos);

    /**
     * Parses text from the beginning of the given string to produce an object.
     * The method may not use the entire text of the given string.
     *
     * @param source A <code>String</code> whose beginning should be parsed.
     * @return An <code>Object</code> parsed from the string.
     * @exception ParseException if the beginning of the specified string
     *            cannot be parsed.
     */
 public Object parseObject(String source) throws ParseException {
        ParsePosition pos = new ParsePosition(0);
        Object result = parseObject(source, pos);
        if (pos.index == 0) {
            throw new ParseException("Format.parseObject(String) failed",
                pos.errorIndex);
        }
        return result;
    }

从该源码可以看出,我们必须要有 ParsePosition参数,就是第一个parseObject(该参数使用了@NotNUll注解,这里显示不出来),有源码知该异常的主要是由于pos.index == 0。然而我们由于没有传入该参数导致使用了第二个parseObject方法,而该方法直接设置index=0,所以报异常,于是我又打开ParsePosition的源码:

public class ParsePosition {

    /**
     * Input: the place you start parsing.
     * <br>Output: position where the parse stopped.
     * This is designed to be used serially,
     * with each call setting index up for the next one.
     */
    int index = 0;
    int errorIndex = -1;

    /**
     * Retrieve the current parse position.  On input to a parse method, this
     * is the index of the character at which parsing will begin; on output, it
     * is the index of the character following the last character parsed.
     *
     * @return the current parse position
     */
    public int getIndex() {
        return index;
    }

    /**
     * Set the current parse position.
     *
     * @param index the current parse position
     */
    public void setIndex(int index) {
        this.index = index;
    }

    /**
     * Create a new ParsePosition with the given initial index.
     *
     * @param index initial index
     */
    public ParsePosition(int index) {
        this.index = index;
    }
}

可以看出默认index=0,这就是如果我们即使传入该参数,但index设置为0,或者-1,都会导致错误。

后面我加上该参数后测试成功了。

由这个异常我进行了其他的格式化测试:

测试一:

    @Test
    public void formatTest() throws ParseException {
        Date date = new Date();
        System.out.println(date);
    }
}

输出结果:

java.text.parse,java,单元测试,springboot

测试二:

 @Test
    public void formatTest() throws ParseException {
           DateFormat df2 = DateFormat.getDateInstance(DateFormat.MEDIUM);
           System.out.println(df2.format(new Date()));
    }

 输出结果:

java.text.parse,java,单元测试,springboot

 这是由于 DateFormat类中有很多内置的数据格式,这里使用的是MEDIUM,默认的数据格式。

java.text.parse,java,单元测试,springboot

 如果不想使用内置的数据格式,我们需要使用String类提供的format:

@Test
    public void formatTest() throws ParseException {
        Date date = new Date();
        System.out.println(String.format("%tc",date));
        System.out.println(String.format("%tF",date));
        System.out.println(String.format("%tD",date));
        System.out.println(String.format("%tr",date));
        System.out.println(String.format("%tT",date));
        System.out.println(String.format("%tR",date));
    }

输出:

java.text.parse,java,单元测试,springboot

这里是该方法的转化规则:

java.text.parse,java,单元测试,springboot

 如有错误,还望指正!

 文章来源地址https://www.toymoban.com/news/detail-699665.html

到了这里,关于java.text.ParseException及日期格式化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java格式化日期,时间(三种方法,建议收藏)

    在java中String类格式化的方法,是静态format()用于创建格式化的字符串。 format(String format, Object... args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字符串。 format(Locale locale, String format, Object... args) 使用指定的语言环境,制定字符串格式和参数生成格式化

    2024年02月15日
    浏览(47)
  • Java8日期时间类LocalDateTime格式化

    LocalDateTime日期时间格式化 LocalDateTime localDateTime = LocalDateTime.now() System.out.println(now.format( DateTimeFormatter.ofPattern(\\\"yyyy-MM-dd HH:mm:ss\\\") )); 测试1 测试2 测试2的结果

    2024年02月08日
    浏览(47)
  • JAVA中,日期格式化YYYY 与yyyy区别

    在java中我们时常会使用到日期格式化,例如“YYYY-MM-dd”、“yyyy-MM-dd” 今天我们来看一下大写Y与小写y有什么不同。 先总结:尽量使用小写y来表示年份。 我们直接来看代码 1.将日期设置成2023年12月31日,并且分别使用大写Y和小写y进行格式化打印; 2.结果 我们惊讶的发现,

    2024年01月23日
    浏览(40)
  • Java程序设计入门教程--日期格式化类SimpleDateFormat

           在程序设计中,经常用到特定的日期格式,此时就可以使用 java.text 包中的 SimpleDateFormat 类来对日期时间进行格式化,如可以将日期转换为指定格式的文本,也可将文本转换为日期。 目标格式 使用SimpleDateFormat类时,首先要定义一个要转换的日期时间目标格式。目标格

    2024年02月07日
    浏览(44)
  • 【Java 基础篇】Java日期和时间格式化与解析指南:SimpleDateFormat详解

    日期和时间在软件开发中经常被用到,无论是用于记录事件、计算时间间隔还是格式化日期以供用户友好的展示。Java 提供了强大的日期和时间处理工具,其中 SimpleDateFormat 类是一个重要的工具,用于格式化日期和时间,同时也支持解析日期和时间。本篇博客将深入探讨 Sim

    2024年02月09日
    浏览(62)
  • Java中日期时间格式化方法SimpleDateFormat和DateTimeFormatter使用完整示例及区别说明

    示例代码: 示例截图:  这里完整的用两种方法分别实现了日期和String的来回转换,鉴于SimpleDateFormat早已过时,且非线程安全,所以推荐大家首选使用DateTimeFormatter,用法基本都是差不多的。变化不大。但是DateTimeFormatter需要Java Level 8(8 - Lambdas, type annotations etc.),需留意。

    2023年04月09日
    浏览(43)
  • Oracle格式化日期

    将oralce中时间格式为XXX年XX月XX日,如下图: 需要给年月日 添加引号 ,如to_char(sysdate,\\\'yyyy \\\"年\\\" mm \\\"月\\\" dd \\\"日\\\" \\\' );

    2024年02月15日
    浏览(44)
  • C# 格式化日期

    除去string.Format()可以对日期进行格式化之外,*.ToString()也可以实现相同的效果: 另一种写法:

    2024年02月15日
    浏览(51)
  • js实现日期格式化

    获取到的是1970年1月1日至今的毫秒数 月份从0开始的所以要加1 实现日期格式化效果图 日期格式化实现效果图 其中包含封装一个不够两位数就补零的函数 一个不够两位数就补零的函数

    2024年02月13日
    浏览(77)
  • SQL Server日期格式化

    一、时间戳的生成 使用dateDiff方法,运算当前时间到标准时间之间的秒数。 DATEDIFF(s,‘1970-01-01 00:00:00’, getdate()) 二、日期格式转换 使用convert(data_type,source_data,style)进行格式转换。利用style控制转换格式。 结果: CONVERT(nvarchar(80),getdate(),0)----07 27 2022 8:33AM CONVERT(nvarchar(80),getd

    2024年02月06日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包