有没有办法设置用于将字符串解析为日期的默认DateFormat类?
我的背景:我从JDBC读取日期值时遇到异常,因为日期字符串不是预期的格式。
(2011-07-22上添加的文字):
似乎我需要确定我的问题描述:我使用外部专有数据库和专有JDBC驱动程序。在数据库端无法知道甚至更改列类型。当我尝试通过ResultSet.getDate()或ResultSet.getObject()读取ResultSet列时,在JDBC驱动程序中会触发一些异常,例如“1999年7月10日不是有效日期”。我想要实现的是通过设置一些适当的全局默认日期格式来避免这种内部异常。也许我需要首先实现一些自定义Locale并全局安装Locale?
答案 0 :(得分:5)
应该完全不需要这个。
日期应作为DATE
,DATETIME
或TIMESTAMP
字段存储在数据库中,具体取决于所使用的数据库和您要存储的信息(例如,仅限日期或日期)和时间相结合),而不是VARCHAR
或其他东西。这样一个特定于日期的字段将封面下的值基本上存储为整数/长整数,以纪元时间为值。
假设您使用的是日期+时间字段类型,例如DATETIME
或TIMESTAMP
,那么您应该使用PreparedStatement#setTimestamp()
将其保存在数据库中。这是一个示例,假设date
变量属于java.util.Date
类型:
preparedStatement.setTimestamp(1, new Timestamp(date.getTime()));
您应该使用ResultSet#getTimestamp()
从数据库中检索它们,而Timestamp
会返回SimpleDateFormat
,而{{3}}又是java.util.Date
的子类,因此您可以安全地向上转发它:
Date date = resultSet.getTimestamp("columnname");
至于将java.util.Date
对象解析/格式化为人类可读的String
格式,这在技术上应该在视图侧发生,而不是在持久层中发生。反过来,这取决于所使用的视图/ UI技术/框架,例如Swing,JSP,JSF,Struts2,Spring-MVC等。由于您的问题不清楚您正在使用哪一个,因此无法给出合适的答案。一般来说,他们都使用{{3}} API。你甚至可以以原始形式使用它。
答案 1 :(得分:4)
您可以设置默认的区域设置:
Locale.setDefault(Locale.US);
或者,您可以使用接受Locale的DateFormat
静态方法之一来获取您感兴趣的Locale的格式。如果您的日期格式与标准格式之一不匹配,您需要创建自己的SimpleDateFormat
(基于模式),并确保始终使用该模式而不是默认模式。