1

实际上我不清楚这个问题是 Java、JSP 还是 Mybatis。

目前面临的问题如下:

前端
Java JSP Struts 2 Spring

后端
PostgreSQL 9.3.XX


PostgreSQL 中的问题

birthday date;

在jsp中写的页面代码

<sj:datepicker name="birthday" id="birthday"></sj:datepicker>

在使用 mybatis 生成器的 Java 文件中,它生成以下代码

private Date birthday;

在 Mybatis 文件中

insert into "TABLE" (birthday) values (#{birthday, jdbcType=DATE});

从 jsp 页面[1988/01/13]插入值时,然后在 java 控制台中获取

[Sat Jun 11 00:00:00 JST 18]价值。这是错误的。

如果我将私人日期生日更改为私人字符串生日,那么控制台没有任何问题,但在数据库中插入值会生成错误。

Error Code :42804 
birthday is a date trying to insert character varying.

我尝试了不同的方法,但仍然没有找到答案。

如何YYYY/MM/DD在日期对象中获取格式(不是在字符串中)?

4

3 回答 3

1

Struts2 日期转换

对于日期,Struts2使用SHORTLocale与当前请求关联的格式

这意味着如果您使用的是印度语言环境,格式是dd/MM/yy,因此您可以安全地输入13/01/1988JSP 并成功地将其转换为java.util.Date操作中的对象。

如果您使用的是美国语言环境,格式为MM/dd/yy,则需要插入01/13/1988,否则将无法正常工作。


ISO8601 和 RFC3339

为了处理这类问题,多年前国际标准组织制定了ISO 8601标准:

ISO 8601 数据元素和交换格式 - 信息交换 - 日期和时间的表示是涵盖日期和时间相关数据交换的国际标准。它由国际标准化组织 (ISO) 发布,于 1988 年首次发布。该标准的目的是提供一种明确且定义明确的日期和时间表示方法,以避免对日期的数字表示形式的误解和时间,特别是当数据在具有不同书写数字日期和时间惯例的国家之间传输时。

ISO 8601 日期格式是yyyy-MM-dd,您正在使用的格式。

在 HTML5 生态系统(日期选择器等)中选择并采用了 ISO 8601 的特定配置文件,并在RFC 3339中进行了描述。
它的完整表示略有不同,但仅日期格式是相同的 ( yyyy-MM-dd)。

Struts2-jQuery-plugin 的<sj:datepicker>标签日期格式应该已经默认为yy-MM-dd, IIRC。


把事情做好

以这种格式输入的日期的自动转换最近被引入并且在Struts 2.5 (beta) 中可用。它也应该在下一个版本(2.3.25+)中发布。

否则,您需要创建一个转换器,如下所示:

public class RFC3339Converter extends StrutsTypeConverter{

    @Override
    public String convertToString(Map context, Object o) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(o);
    }

    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         try {
             return (values[0].length()==0) ? null : (Date) sdf.parse(values[0]);
         } catch (ParseException e) {
             return values[0];
         }
    }
}

你可知道... ?

浏览器(可能)具有本机日期选择器,您可以将其与 JavaScript 日期选择器的优雅降级一起使用,如本答案中所述

于 2016-03-02T17:40:21.497 回答
0

尝试将 UI 字符串格式转换为 DB known( yyyy-MM-dd) 格式并插入数据库。

创建一些通用实用程序转换为字符串格式。

SimpleDateFormat formatter = new SimpleDateFormat("MM-dd-yyyy");
Date date = null;
try {
    date = formatter.parse(dateVal);
} catch (ParseException e) {
    e.printStackTrace();
}
于 2016-03-02T11:32:21.290 回答
0

您应该先从字符串属性解析日期,然后再将其存储到数据库,因为它已映射到Date对象。

您可以使用客户端使用的不同语言环境来解析它。当前语言环境在操作上下文中可用。

Locale locale = ActionContext.getContext().getLocale();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd", locale);
try {
  birthday = sdf.parse(birthdayString);
} catch (ParseException e) {
  e.printStackTrace();
}
于 2016-03-02T11:25:00.730 回答