`
liyixing1
  • 浏览: 958954 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

时间类型,精度问题(Timestamp,Date)

SQL 
阅读更多
经过调试,发现最后转换器会进入com.opensymphony.xwork.util.XWorkBasicConverter类(xwork.jar包)的对应的doConvertToDate方法,该方法内容:

private Object doConvertToDate(Map context, Object value, Class toType) {
        Date result = null;

        if (value instanceof String && value != null && ((String)value).length() > 0) {
            String sa = (String) value;
            Locale locale = getLocale(context);

            DateFormat df = null;
            if (java.sql.Time.class == toType) {
                df = DateFormat.getTimeInstance(DateFormat.MEDIUM, locale);
            } else if (java.sql.Timestamp.class == toType) {
                Date check = null;
                SimpleDateFormat dtfmt = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT,
                        DateFormat.MEDIUM,
                        locale);
                SimpleDateFormat fullfmt = new SimpleDateFormat(dtfmt.toPattern() + MILLISECOND_FORMAT,
                        locale);

                SimpleDateFormat dfmt = (SimpleDateFormat) DateFormat.getDateInstance(DateFormat.SHORT,
                        locale);

                SimpleDateFormat rfc3339Format = new SimpleDateFormat(RFC3339_FORMAT);

                SimpleDateFormat[] fmts = {fullfmt, dtfmt, dfmt, rfc3339Format};
                for (int i = 0; i < fmts.length; i++) {
                    try {
                         //可以发现这里它会使用上面四种格式进行格式化(格式化失败进入异常),因此只有一个格式化会成功。我在页面中使用的<ww:datepicker name="act.actDate" label="活动时间"
format="%Y-%m-%d %H:%M" showstime="24">
</ww:datepicker>
只会被第三个格式化,而第三个格式化会被切去时间,所有出现了精度问题。
                        check = fmts[i].parse(sa);
                        df = fmts[i];
                        if (check != null) {
                            break;
                        }
                    } catch (ParseException ignore) {
                    }
                }
             } else if(java.util.Date.class == toType) {
            Date check = null;
                SimpleDateFormat d1 = (SimpleDateFormat)DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG, locale);
                SimpleDateFormat d2 = (SimpleDateFormat)DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, locale);
                SimpleDateFormat d3 = (SimpleDateFormat)DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale);
                SimpleDateFormat rfc3339Format = new SimpleDateFormat(RFC3339_FORMAT);
                SimpleDateFormat[] dfs = {d1, d2, d3, rfc3339Format}; //added RFC 3339 date format (XW-473)
                for (int i = 0; i < dfs.length; i++) {
                try {
                check = dfs[i].parse(sa);
                df = dfs[i];
                if (check != null) {
                break;
                }
                }
                catch (ParseException ignore) {
                }
                }
            }
            //final fallback for dates without time
            if (df == null){
            df = DateFormat.getDateInstance(DateFormat.SHORT, locale);
            }
            try {
            df.setLenient(false); // let's use strict parsing (XW-341)
                result = df.parse(sa);
                if (! (Date.class == toType)) {
                    try {
                        Constructor constructor = toType.getConstructor(new Class[]{long.class});
                        return constructor.newInstance(new Object[]{new Long(result.getTime())});
                    } catch (Exception e) {
                        throw new XworkException("Couldn't create class " + toType + " using default (long) constructor", e);
                    }
                }
            } catch (ParseException e) {
                throw new XworkException("Could not parse date", e);
            }
        } else if (Date.class.isAssignableFrom(value.getClass())) {
            result = (Date) value;
        }
        return result;
    }
分享到:
评论

相关推荐

    oracle中TIMESTAMP与DATE比较

    在Oracle数据库中,`TIMESTAMP`与`DATE`两种数据类型是用于存储日期和时间信息的关键组成部分,但它们之间存在显著的区别,特别是在处理时间和精度方面。本文将深入探讨这两种数据类型的特点,以及如何在实际应用中...

    mysql时间类型对应的java类型1

    本文将深入探讨MySQL数据库中的时间类型以及它们在Java编程语言中相对应的数据类型,以及如何在两者之间进行转换。 MySQL数据库提供了多种时间类型来处理日期和时间数据: 1. **DATE**:这个类型仅存储日期,格式...

    oracle中TIMESTAMP与DATE比较.pdf

    Oracle数据库中的`DATE`和`TIMESTAMP`是两种常见的日期和时间数据类型,它们在处理时间信息时有着不同的特性和用途。 首先,`DATE`数据类型是我们最常使用的,它可以存储日期和时间,包括世纪、年、月、日、小时、...

    Oracle date 和 timestamp 区别详解

    为了解决DATE类型的精度问题,Oracle引入了TIMESTAMP数据类型,它不仅包含DATE的所有信息,还增加了微秒或纳秒级别的精度。这使得TIMESTAMP能够区分在同一秒内发生的事件。例如,`SELECT CAST(date1 AS TIMESTAMP) ...

    关于Hinbernate中TimeStamp类型字段处理的小例子

    与`java.util.Date`相比,Timestamp提供了更高的精度(1纳秒),并且可以存储时区信息。 - 在数据库中,Timestamp通常用来记录数据的创建或修改时间,以保持审计跟踪或实现版本控制。 2. **Hibernate中的Timestamp...

    关于MySQL 时间类型 datetime、bigint、timestamp,你用哪个?

    ### MySQL时间类型详解:datetime、bigint、timestamp 在MySQL中,根据不同的应用场景和需求,可以选择多种方式来存储日期和时间信息。本篇文章将详细介绍三种常用的时间类型:`datetime`、`bigint` 和 `timestamp`...

    python timestamp和datetime之间转换详解

    1. **时间精度**:Python 的 `datetime` 类默认支持微秒级别的精度,但在实际应用中,需要注意前端 JavaScript 中的 `Date.now()` 函数返回的是毫秒级的时间戳。因此,在进行跨平台的时间戳传递时要注意精度转换。 ...

    KETTLE时间戳-源数据自带时间

    Kettle支持多种数据类型,其中包括时间戳(Timestamp)。在Kettle的步骤中,如"表输入"(Table Input)、"CSV文件输入"(CSV File Input)等,可以自动识别并处理源数据中的时间戳字段。通过"字段映射"(Field ...

    时间戳与时间互换精确到毫秒

    例如,在Python中,可以使用`datetime`模块的`timestamp()`和`fromtimestamp()`方法进行转换,同时,`datetime.datetime.now().microsecond`可以获取当前时间的微秒部分,从而达到毫秒级别的精度。 在Java中,`java...

    oracle --timestamp

    接着通过`TO_TIMESTAMP`函数将字符串格式的日期时间转换成`TIMESTAMP`类型的数据并插入到表中: ```sql INSERT INTO test VALUES ( TO_TIMESTAMP('2006-01-01 12:10:10.1', 'YYYY-MM-DD HH24:MI:SS.FF'), TO_...

    oracle时间类型

    Oracle的DATE类型是最常用的时间类型,它可以存储日期和时间信息,包括年、月、日、小时、分钟和秒。值得注意的是,尽管名为DATE,但它实际上包含了日期和时间两部分。日期部分的范围是从公元前4712年1月1日到公元...

    Java数据类型和MySql数据类型对应一览

    在 Java 中,日期时间类型对应的是 java.sql.Date、java.sql.Time、java.sql.Timestamp 等类型。在 MySql 中,日期时间类型对应的是 DATE、TIME、DATETIME、TIMESTAMP 等类型。其中,DATE 类型用于存储日期,TIME ...

    Java中Date,Calendar,Timestamp的区别以及相互转换与使用

    - Oracle数据库提供了多种日期时间类型,包括 DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE 和 TIMESTAMP WITH LOCAL TIME ZONE。 - DATE 类型包含世纪、年、月、日、时、分、秒信息。 - TIMESTAMP 类型是 DATE 的...

    Oracle9i数据类型Java数据类型Schema类型对比.doc

    - TIME: 对应 Java 的 Time 类型,但 Oracle9i 中没有单独的时间类型,通常用 DATE 类型表示。 - BLOB: 对应 Java 的 Object 类型,用于存储二进制大数据。 2. Java 数据类型: - Java 的基本数据类型如 byte, ...

    MySQL 日期和时间类型.pdf

    在选择合适的日期和时间类型时,需要考虑数据的精度需求、存储空间以及可能的日期范围。同时,理解这些类型在不同情况下的表现对于优化数据库设计和提高查询效率至关重要。在实际应用中,根据业务需求灵活选择和使用...

    Mysql、orcale 中的数据类型与java中的数据类型对应表.pdf

    日期时间类型包括 date、datetime 和 timestamp 等。字符串类型包括 char、varchar 和 text 等。 在 Java 中,对应 MySQL 的数值类型可以使用基本数据类型,例如 int、long、float 和 double 等。对应日期时间类型...

    MySQL日期数据类型、MySQL时间类型使用总结.docx

    MySQL数据库在处理日期和时间数据时提供了多种数据类型,包括日期类型和时间类型。这些数据类型的选择对于数据库设计和性能优化至关重要。以下是关于MySQL日期和时间类型的详细说明: 日期类型: 1. **datetime**:...

    Oracle中TIMESTAMP的几种类型介绍与实例

    在Oracle数据库中,`TIMESTAMP` 是一种用于存储日期和时间数据类型的字段,与传统的`DATE`类型相比,它的精度更高,能够精确到小数秒。`TIMESTAMP` 类型的精度可设置为 0 到 9 位,缺省情况下是 6 位,这意味着它...

Global site tag (gtag.js) - Google Analytics