Java中未弃用的日期(字符串s)的精确等价物?

Java中未弃用的日期(字符串s)的精确等价物?,java,date,Java,Date,我有一段旧代码,它使用newdate(dateString)解析日期字符串。编译代码会在java.util.Date已弃用中生成弃用警告日期(java.lang.String) javadoc毫无帮助地建议我使用DateFormat.parse(),即使DateFormat类没有静态的parse方法 现在,我知道如何使用SimpleDateFormat,但我想确保我得到的与依赖的Date构造函数的行为完全相同。DateFormat具有返回DateFormat实例的静态方法。我不知道哪一个(如果有

我有一段旧代码,它使用
newdate(dateString)
解析日期字符串。编译代码会在java.util.Date已弃用中生成弃用警告
日期(java.lang.String)

javadoc毫无帮助地建议我使用
DateFormat.parse()
,即使
DateFormat
类没有静态的
parse
方法


现在,我知道如何使用
SimpleDateFormat
,但我想确保我得到的与依赖的
Date
构造函数的行为完全相同。

DateFormat具有返回DateFormat实例的静态方法。我不知道哪一个(如果有的话)具有与
Date(String s)
相同的行为,但您可以这样做:

DateFormat.getInstance()
DateFormat.getDateInstance()
DateFormat.getTimeInstance()
DateFormat.getDateTimeInstance()
以下是我的猜测(我以社区维基的形式发布,如果我是对的,你可以投票):

简短的回答(在进一步调查之前)是:不,它不是等效的。Date(String toParse)构造函数相当于类Date的parse方法(该方法也不推荐使用)。。。该方法的优点在于:

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


如果这是唯一的改变,我想你可以走这条路。

SimpleDataFormat是一条路要走。但是,我可以指出,您可能觉得必须定义一个SimpleDataFormat实例并使用它构建日期对象。如果您这样做,请注意SimpleDataFormat不是线程安全的,您可能会遇到一些潜在的难以调试的问题

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


我知道这是一个多一点的工作。然而,考虑到您目前必须重构代码,这可能是值得的。

如果您查看Nicolas提到的Date.parse(String s)方法的源代码,您会发现构建一个能够准确地再现行为的日期格式将是困难的或不可能的

如果只想消除警告,可以将
@SuppressWarnings({“deprecation”})
放在调用日期(字符串)构造函数的方法之外


如果您真的想通过未来的JRE确保将来能够访问此行为,那么您可以从JDK源代码中提取该方法并将其放入您自己的源代码中。这需要仔细阅读源代码许可证并考虑它们在您的特定项目中的应用,可能根本不允许这样做。

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

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

使用SimpleDataFormat时,您需要知道格式。

tl;博士 java.time 可怕的
Date
DateFormat
类在几年前被现代的java.time类取代,并采用了

is实际上调用了静态方法。正如该文档所解释的,该方法采用多种格式。java.time中的相同行为只有一个点。然而,我怀疑你的应用程序是否同时遇到了所有这些不同格式的语法

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

对于已接受答案中显示的格式模式,这里是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
。但是,如果您必须有一个
日期
才能与尚未更新为java.time的旧代码进行互操作,则可以转换。查看添加到旧类的新转换方法

错误命名表示UTC中的一个时刻。它的现代等价物 这是我们班的学生。我们可以从我们的
ZoneDateTime
中提取一个
即时
。然后转换为
日期

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 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

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

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(是的,如果我想得到完全相同的行为,我会这么做。DateFormat.getInstance()更好的原因是它为当前语言环境返回适当的格式化程序。请,请,请不要,永远不要做“新的非法GargumentException():O.至少链接原始异常(新的IllegalArgumentException(pe))。我必须使用“新的SimpleDataFormat”(“EEE-MMM-dd-HH:mm:ss-zzz-yyyyy”,Locale.ENGLISH);”来实现这一点,以防其他人遇到问题。仅供参考,这些糟糕的日期时间类在几年前被
      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).