Java中不推荐使用Date(String s)的完全等价物?

时间:2009-03-18 12:00:22

标签: java date

我有使用new Date(dateString)解析日期字符串的旧代码。编译代码会产生弃用警告 Date(java.lang.String) in java.util.Date has been deprecated

javadoc无意中建议我使用DateFormat.parse(),即使DateFormat类没有静态parse方法。

现在,我知道如何使用SimpleDateFormat,但我想确保我获得了depenedated Date构造函数的完全相同的行为

7 个答案:

答案 0 :(得分:49)

这是我的猜测(我发布为社区维基,所以如果我是对的,你可以投票):

Date parsed;
try {
    SimpleDateFormat format =
        new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
    parsed = format.parse(dateString);
}
catch(ParseException pe) {
    throw new IllegalArgumentException(pe);
}

答案 1 :(得分:8)

SimpleDateFormat是要走的路。但是,我是否可以指出,您可能不得不使用此方法定义一个SimpleDateFormat实例并构建Date对象。如果您这样做,请注意SimpleDateFormat不是线程安全的,您可能会遇到一些可能难以调试的问题!

我建议借此机会查看Joda这是一个更好的深思熟虑(和线程安全)API。它构成了JSR-310的基础,JSR-310是新提出的Java Date API。

我明白这是一项更多的工作。但是,鉴于您现在必须重构代码,这可能是值得的。

答案 2 :(得分:3)

如果你看一下Nicolas提到的Date.parse(String s)方法的来源,你会发现很难或不可能构建一个完全再现的日期格式行为。

如果您只想消除警告,可以将@SuppressWarnings({“deprecation”})放在调用Date(String)构造函数的方法之外。

如果您确实希望将来能够使用未来的JRE访问此行为,则可以从JDK源中提取该方法并将其放入您自己的源中。这需要仔细阅读源代码许可证并考虑其对特定项目的应用,并且可能根本不允许。

答案 3 :(得分:2)

DateFormat具有返回DateFormat实例的静态方法。我不知道哪一个(如果有的话)与Date(String s)具有相同的行为,但是你去了:

DateFormat.getInstance()
DateFormat.getDateInstance()
DateFormat.getTimeInstance()
DateFormat.getDateTimeInstance()

答案 4 :(得分:2)

简短回答(在进一步调查之前)是:不,它不等同。 Date(String toParse)构造函数等同于Date类的parse方法(也已弃用)...并且此方法的javadoc声称:

  

请注意,这与SimpleDateFormat中使用的小于100的年份的解释略有不同。

如果这是唯一的改变,我想你可以这样做。

答案 5 :(得分:1)

tl; dr

ZonedDateTime.format( 
    input , 
    DateTimeFormatter.ofPattern( 
        "EEE MMM dd HH:mm:ss zzz uuuu" , 
        Locale.ENGLISH 
    ) 
)

java.time

可怕的DateDateFormat类在几年前被现代的 java.time 类所取代,并采用了JSR 310

constructor you reference实际上是在静态方法Date.parse上调用的。如该文档所述,该方法采用多种格式。在 java.time 中,同一行为只有一点。但是,我怀疑您的应用程序会同时遇到所有这些各种格式的语法。

我建议您查看实际数据使用的特定格式。然后制作DateTimeFormatter对象的集合以进行匹配。请注意,与传统类不同, java.time 类完全是thread-safe。因此,您可以保留一组格式化程序,以便在整个应用程序和各个线程中重复使用。

对于接受的答案中显示的格式设置模式,这是使用DateTimeFormatter类的 java.time 中的等效格式。请注意,您应该明确声明所需/期望的语言环境,而不是隐式依赖JVM当前的默认语言环境。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss zzz uuuu" , Locale.ENGLISH ) ;
ZonedDateTime zdt = ZonedDateTime.format( input , f ) ;

您应尽可能避免使用旧式日期时间类,例如java.util.Date。但是,如果您必须具有Date才能与尚未更新为 java.time 的旧代码进行互操作,则可以进行转换。查看添加到旧类中的新转换方法。

错误命名的java.util.Date代表UTC的时刻。其现代等效  是java.time.Instant类。我们可以从Instant中提取ZonedDateTime。然后转换为Date

Instant instant = zdt.toInstant() ;        // Adjust from time zone to UTC.
java.util.Date d = Date.from( instant ) ;  // Convert from modern class `Instant` to legacy class `Date`. 

往另一个方向。

Instant instant = d.toInstant() ;                                        // Convert from legacy class `Date` to modern class `Instant`. 
ZonedDateTime zdt = instant.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;  // Adjust from UTC to the wall-clock time used by the people of a particular region (a time zone).

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 6 :(得分:0)

要解析ISO格式的日期时间字符串,您应使用DateFormat,如下所示:

java.text.DateFormat.getDateInstance().parse(dt);

使用SimpleDateFormat,您需要了解格式。