【问题标题】:Date object issue Mybatis using postgreSQLMybatis使用postgreSQL的日期对象问题
【发布时间】:2016-06-15 04:57:21
【问题描述】:

其实我不清楚这个问题是Java,JSP还是Mybatis。

目前面临的问题如下:

前端
Java JSP Struts 2 Spring

后端
PostgreSQL 9.3.XX

问题
在 PostgreSQL 中

birthday date;

在jsp中写的页面代码

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

在Java File中使用mybatis生成器生成如下代码

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 格式?

【问题讨论】:

    标签: java jsp struts2 date-conversion rfc3339


    【解决方案1】:

    Struts2 日期转换

    对于日期,Struts2 uses the SHORT format for the Locale associated 与当前请求

    这意味着,如果您使用的是印度语言环境,其格式为 dd/MM/yy,因此您可以安全地在 JSP 中输入 13/01/1988 并在操作中成功地将其转换为 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 的&lt;sj:datepicker&gt; 标签日期格式应该已经默认为yy-MM-dd,IIRC。


    把事情做好

    自动转换以 has been recently introduced 格式输入的日期,并且在 Struts 2.5(测试版)中可用。它也应该在下一个版本(2.3.25+)中发布。

    否则,您需要像下面这样create a converter

    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 日期选择器,as described in this answer

    【讨论】:

    • 非常感谢您的支持。它工作正常。
    • 不客气!随意对您可能认为有用的链接答案进行投票
    【解决方案2】:

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

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

    Locale locale = ActionContext.getContext().getLocale();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd", locale);
    try {
      birthday = sdf.parse(birthdayString);
    } catch (ParseException e) {
      e.printStackTrace();
    }
    

    【讨论】:

    • 感谢您的回复。但问题是当我当时在 java 控制台中的 jsp 页面 1988/01/13 中插入​​值时,其写入 [Sat Jun 11 00:00:00 JST 18] 因为在模型对象中是日期。这个问题是在使用 postgreSQL 时,我也在 sql server 中尝试过。没有任何问题。
    • 在控制台中应该是和上面一样的格式。
    • No.in 控制台输出是 Sat Jun 11 00:00:00 JST 18,同时从 jsp 1988/01/13 插入。
    • 默认格式由struts语言环境决定,但你可以使用固定格式dysplayFormat="yy/mm/dd"readonly="true"
    【解决方案3】:

    尝试将 UI String 格式转换为 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();
    }
    

    【讨论】:

    • 感谢您的回复。但问题是当我当时在 java 控制台中的 jsp 页面 1988/01/13 中插入​​值时,其写入 [Sat Jun 11 00:00:00 JST 18]
      1988/01/13 - Sat Jun 11 00:00:00 JST 18 这是一个错误的输出。
    • 你的问题出在前端吗?
    • 我也不知道。在 jsp 页面文本框中插入 1988/01/13 在 java 中获取输出 Sat Jun 11 00:00:00 JST 18 .my 变量类型是 Date 生日。
    • 尝试在您的日期选择器标签中添加日期格式属性displayFormat="mm/dd/yy"
    • 实际上我想在 jsp 页面中以 yyyy/mm/dd 显示日期格式,除了用户也输入这种格式。但正如你所说,我当时尝试输出是 Sun Jan 01 00:00 :00 JST 1989,同时输入 01/13/88 或 01/13/1988。
    猜你喜欢
    • 2018-03-30
    • 2016-12-14
    • 2012-11-28
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多