我有使用new Date(dateString)
解析日期字符串的旧代码。编译代码会产生弃用警告 Date(java.lang.String) in java.util.Date has been deprecated
。
javadoc无意中建议我使用DateFormat.parse()
,即使DateFormat
类没有静态parse
方法。
现在,我知道如何使用SimpleDateFormat
,但我想确保我获得了depenedated Date
构造函数的完全相同的行为。
答案 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)
ZonedDateTime.format(
input ,
DateTimeFormatter.ofPattern(
"EEE MMM dd HH:mm:ss zzz uuuu" ,
Locale.ENGLISH
)
)
可怕的Date
和DateFormat
类在几年前被现代的 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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 6 :(得分:0)
要解析ISO格式的日期时间字符串,您应使用DateFormat,如下所示:
java.text.DateFormat.getDateInstance().parse(dt);
使用SimpleDateFormat,您需要了解格式。