JSTL标签fmt:formatDate格式化日期出错

现象&背景:

  异常:

    "org.apache.jasper.JasperException: 在 [115] 行处理 [/WEB-INF/jsp/modules/receivedyaccnotify/receive_dy_acc_notify.jsp] 时发生异常"
  代码:
    <%@ taglib prefix= "fmt" uri= "http://java.sun.com/jsp/jstl/fmt" %>
    <td><fmt:formatDate value= "${record.transTime}" pattern= "yyyy-MM-dd HH:mm:ss" type= "date" /></td>

 

原因:

  关于这个异常的详细说明,可以参考【https://blog.csdn.net/lzf_hlh/article/details/81737222】,这次的异常发生的原因是类型转换导致的:即因为${record.transTime}取出来是String类型,无法转换为Date类型。

详解:

  从代码中进入【fmt:formatDate】的JSTL源代码中可以发现以下描述(红色字体):

  【Date and/or time to be formatted.】:需要转换的value得是Date对象类型

  【Name of the exported scoped variable which stores the formatted result as a String.】:返回的值是String类型

 1 <tag>
 2         <description>
 3             Formats a date and/or time using the supplied styles and pattern
 4         </description>
 5         <name>formatDate</name>
 6         <tag-class>org.apache.taglibs.standard.tag.rt.fmt.FormatDateTag</tag-class>
 7         <body-content>empty</body-content>
 8         <attribute>
 9             <description>
10                 Date and/or time to be formatted.
11             </description>
12             <name>value</name>
13             <required>true</required>
14             <rtexprvalue>true</rtexprvalue>
15         </attribute>
16         <attribute>
17             <description>
18                 Specifies whether the time, the date, or both
19                 the time and date components of the given
20                 date are to be formatted.
21             </description>
22             <name>type</name>
23             <required>false</required>
24             <rtexprvalue>true</rtexprvalue>
25         </attribute>
26         <attribute>
27             <description>
28                 Predefined formatting style for dates. Follows
29                 the semantics defined in class
30                 java.text.DateFormat. Applied only
31                 when formatting a date or both a date and
32                 time (i.e. if type is missing or is equal to
33                 "date" or "both"); ignored otherwise.
34             </description>
35             <name>dateStyle</name>
36             <required>false</required>
37             <rtexprvalue>true</rtexprvalue>
38         </attribute>
39         <attribute>
40             <description>
41                 Predefined formatting style for times. Follows
42                 the semantics defined in class
43                 java.text.DateFormat. Applied only
44                 when formatting a time or both a date and
45                 time (i.e. if type is equal to "time" or "both");
46                 ignored otherwise.
47             </description>
48             <name>timeStyle</name>
49             <required>false</required>
50             <rtexprvalue>true</rtexprvalue>
51         </attribute>
52         <attribute>
53             <description>
54                 Custom formatting style for dates and times.
55             </description>
56             <name>pattern</name>
57             <required>false</required>
58             <rtexprvalue>true</rtexprvalue>
59         </attribute>
60         <attribute>
61             <description>
62                 Time zone in which to represent the formatted
63                 time.
64             </description>
65             <name>timeZone</name>
66             <required>false</required>
67             <rtexprvalue>true</rtexprvalue>
68         </attribute>
69         <attribute>
70             <description>
71                 Name of the exported scoped variable which
72                 stores the formatted result as a String.
73             </description>
74             <name>var</name>
75             <required>false</required>
76             <rtexprvalue>false</rtexprvalue>
77         </attribute>
78         <attribute>
79             <description>
80                 Scope of var.
81             </description>
82             <name>scope</name>
83             <required>false</required>
84             <rtexprvalue>false</rtexprvalue>
85         </attribute>
86     </tag>

  因为从数据库读取的字段为字符串格式的"20230321165837",通过【fmt:formatDate】转换的时候以致发生异常。

  所以在调用之前将所需要转换的项目变成Date类型,那么可以通过【fmt:parseDate】进行转换解析,参考代码如下:

1 <td>
2     <fmt:parseDate value="${record.transTime}" var="trade_Date" pattern="yyyyMMddHHmmss" type="date"/>  //yyyyMMddHHmmss见补充说明※1.
3     <fmt:formatDate value="${trade_Date}" pattern="yyyy-MM-dd HH:mm:ss" type="date"/>                   //yyyy-MM-dd HH:mm:ss见补充说明※3.  type="date"见补充说明※2.
4 </td>

 

  补充说明:

  ※1.关于【yyyyyMMddHHmmss】:与转换的日期字符串的格式一致,否则可能回报【value attribute can not be parsed: "20230321165837"】错误。

    示例1:

    日期字符串:"20230321165837:

    转换格式:"yyyyyMMddHHmmss"

    示例2:

    日期字符串:"2023/03/21 16:58:37"

    转换格式:"yyyy/MM/dd HH:mm:ss"

    示例3:

    日期字符串:"2021-06-10T22:04:34"

    转换格式:"yyyy-MM-dd'T'HH:mm:ss"

    示例4:

    日期字符串:"2021-06-10T22:04:34+08:00"

    转换格式:"yyyy-MM-dd'T'HH:mm:ssXXX"

  ※2.关于【type="date"】:type有三个值【date, time, both】

    type="date":只显示日期部分

    type="time":只显示时间部分,精确到秒

    type="both":显示日期+时间,精确到秒

    如果pattern="yyyy-MM-dd HH:mm:ss"已经设置格式了,可以不要type属性,如果没有设置pattern属性,常规的日期+时间格式的显示,用type="both"即可(也可直接设置pattern属性),

    但是对于非常规格式的日期(如示例4),需要指定pattern="yyyy-MM-dd'T'HH:mm:ssXXX",此时可以不要type属性了。

    ▲注意:pattern的优先级高于type,即使设置了type,只要pattern被设置,最终的显示格式会以pattern显示。

  ※3.关于【yyyy-MM-dd HH:mm:ss】:这个可以是任意

  ※4.关于【fmt:parseDate】的入值与出值的类型说明:

  【Date string to be parsed.】:需要转换的value得是日期字符串

  【Name of the exported scoped variable in which the parsing result (of type java.util.Date) is stored.】:返回的值是java.util.Date类型

  1 <tag>
  2         <description>
  3             Parses the string representation of a date and/or time
  4         </description>
  5         <name>parseDate</name>
  6         <tag-class>org.apache.taglibs.standard.tag.rt.fmt.ParseDateTag</tag-class>
  7         <body-content>JSP</body-content>
  8         <attribute>
  9             <description>
 10                 Date string to be parsed.
 11             </description>
 12             <name>value</name>
 13             <required>false</required>
 14             <rtexprvalue>true</rtexprvalue>
 15         </attribute>
 16         <attribute>
 17             <description>
 18                 Specifies whether the date string in the
 19                 value attribute is supposed to contain a
 20                 time, a date, or both.
 21             </description>
 22             <name>type</name>
 23             <required>false</required>
 24             <rtexprvalue>true</rtexprvalue>
 25         </attribute>
 26         <attribute>
 27             <description>
 28                 Predefined formatting style for days
 29                 which determines how the date
 30                 component of the date string is to be
 31                 parsed. Applied only when formatting a
 32                 date or both a date and time (i.e. if type
 33                 is missing or is equal to "date" or "both");
 34                 ignored otherwise.
 35             </description>
 36             <name>dateStyle</name>
 37             <required>false</required>
 38             <rtexprvalue>true</rtexprvalue>
 39         </attribute>
 40         <attribute>
 41             <description>
 42                 Predefined formatting styles for times
 43                 which determines how the time
 44                 component in the date string is to be
 45                 parsed. Applied only when formatting a
 46                 time or both a date and time (i.e. if type
 47                 is equal to "time" or "both"); ignored
 48                 otherwise.
 49             </description>
 50             <name>timeStyle</name>
 51             <required>false</required>
 52             <rtexprvalue>true</rtexprvalue>
 53         </attribute>
 54         <attribute>
 55             <description>
 56                 Custom formatting pattern which
 57                 determines how the date string is to be
 58                 parsed.
 59             </description>
 60             <name>pattern</name>
 61             <required>false</required>
 62             <rtexprvalue>true</rtexprvalue>
 63         </attribute>
 64         <attribute>
 65             <description>
 66                 Time zone in which to interpret any time
 67                 information in the date string.
 68             </description>
 69             <name>timeZone</name>
 70             <required>false</required>
 71             <rtexprvalue>true</rtexprvalue>
 72         </attribute>
 73         <attribute>
 74             <description>
 75                 Locale whose predefined formatting styles
 76                 for dates and times are to be used during
 77                 the parse operation, or to which the
 78                 pattern specified via the pattern
 79                 attribute (if present) is applied.
 80             </description>
 81             <name>parseLocale</name>
 82             <required>false</required>
 83             <rtexprvalue>true</rtexprvalue>
 84         </attribute>
 85         <attribute>
 86             <description>
 87                 Name of the exported scoped variable in
 88                 which the parsing result (of type
 89                 java.util.Date) is stored.
 90             </description>
 91             <name>var</name>
 92             <required>false</required>
 93             <rtexprvalue>false</rtexprvalue>
 94         </attribute>
 95         <attribute>
 96             <description>
 97                 Scope of var.
 98             </description>
 99             <name>scope</name>
100             <required>false</required>
101             <rtexprvalue>false</rtexprvalue>
102         </attribute>
103     </tag>

 

posted on 2023-04-04 16:29  shiberhou  阅读(103)  评论(0编辑  收藏  举报

导航