Java中哪些日期方法已经被弃用?

8

当使用Java日期工具时,如果某些内容已被弃用,这意味着什么?这意味着不鼓励使用它,还是意味着禁止使用它?

我猜测使用已弃用的方法是一种不好的做法,但不确定并希望得到确认。

例如,我正在尝试使用以下代码:

String date = request.getParameter("date"); 
model.setDate(new Date(date));

当然...这只是一个高级示例,但在这种情况下,我的模型使用类型 日期(Date),我需要将请求中的日期作为字符串提取出来,并用它创建一个日期。

我现有的方法可以正常工作,但它正在使用过时的方法。

编辑 - 我已经回退使用:

SimpleDateFormat formatter = new SimpleDateFormat(); 
model.setDate(formatter.parse(request.getParameter("date");



日期格式为 MM/DD/YYYY,例如 07/23/2010,但我收到了一个 ParseException 异常。

这可能是由什么引起的?

10个回答

6

您说得对,这是不好的做法。在几乎所有情况下,弃用的方法都会告诉您应该使用什么替代方法,而这也不例外(请参见Javadocs)。

您正在尝试从一个String创建一个Date。但是这个字符串是什么格式的?应该如何解析它?它是英国还是美国的日期格式?

正确的做法是创建一个SimpleDateFormat实例,并调用它的parse()方法传入您的文本字符串。这可以保证在将来工作,并且现在更加稳健。


4
最好使用更好的API,比如Joda Time :) - Jon Skeet
1
嗯...是的。:-) 但建议重写所有现有代码以使用新日期对象对于*这种情况来说过于夸张了。 - Andrzej Doyle
2
@Jon Skeet,总是使用更好的API的问题是你最终会拥有一堆API,并且不断需要检查存储库中的新版本。 - Buhake Sindi
2
@The Elite Gentleman:虽然我同意一般情况下你可能会遇到问题,但是Joda Time非常稳定,而且比现有的API好太多了,绝对值得使用。它比java.util.Date/Calendar要好得多,是一个巨大的进步。 - Jon Skeet

3

过时的对象或方法只是意味着如果您想在当前项目中使用它,最好使用被推荐的方法。它们仍然存在的原因是为了那些在它被弃用之前使用过弃用方法的遗留代码。一个典型的例子是StringTokenizerString.split()方法。

对于您的日期示例,请使用SimpleDateFormat将字符串转换为日期。这允许您从中创建一个日期格式,以便可以解析您的字符串日期以创建一个日期对象。


对于您的编辑,请执行以下操作

SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy"); 

model.setDate(formatter.parse(request.getParameter("date")));

ParseException是由于您没有提供日期格式结构,因此SimpleDateFormat不知道您的日期结构而引起的。


3
很多人提到了“Deprecated”的含义,但我并没有看到任何解释为什么这些方法被弃用:
在成为Oracle的一部分之前,Sun公司已经将Date中的许多方法标记为“Deprecated”,以便让人们使用Calendar/GregorianCalendar类来进行日期操作。

2

“Deprecated” 的含义
你可能听说过“自嘲幽默”的术语,或者是一种将演讲者的重要性最小化的幽默。一个被废弃的类或方法就像这样。它不再重要了。事实上,它是如此不重要,以至于你不应该再使用它,因为它已经被取代了,而且在未来可能会消失。
Java 提供了一种表达废弃的方式,因为随着类的演变,其 API(应用程序编程接口)必然会发生变化:方法会因一致性而改名,新的和更好的方法会被添加,字段也会改变。但是这些变化引入了一个问题。你需要保留旧的 API,直到开发人员转换到新的 API,但你不希望他们继续编程到旧的 API。
废弃类、方法或成员字段的能力解决了这个问题。Java 支持两种废弃机制:注释(从 J2SE 5.0 开始支持)和 Javadoc 标记(从 1.1 开始支持)。对旧 API 的现有调用仍然有效,但是注释会导致编译器在找到对已废弃程序元素的引用时发出警告。Javadoc 标记和相关评论警告用户不要使用已废弃的项目,并告诉他们要使用什么替代品。

http://download-llnw.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html


2

你说得对,使用已弃用的方法是不被鼓励的。这是因为这些方法在某些情况下可能存在问题,或者已经被更优秀的解决方案所取代。而且未来的版本可能不再支持这些方法。


1

Deprecated 意味着计划将其删除,因为它存在缺陷或其他不良原因。 最好使用 SimpleDateFormat.parse(); 来解析您的字符串。


1
一般来说,当Sun(Oracle或其他公司)宣布Java方法已过时时,意味着他们改变了想法,不鼓励您使用该方法,并且在将来的某个版本中可能会将其删除。当然,在删除之前可能需要很长时间,因为谁知道有多少现有代码在使用它,而且仅仅因为Java的发明者认为他们现在有更好的想法来做某些事情,破坏现有程序有何意义?
可以推测他们废弃某些东西有充分的理由,因此您应该调查为什么他们认为某些新功能更好。
对于已过时的日期方法,通常意味着他们建议您现在使用Calendar或SimpleDateFormat类。在您的情况下,可能是后者。

0
正如其他人所说,java.util.Date的方法已被弃用,因为Java团队认为它们在java.util.Calendar中有更好的解决方案。
不幸的是,那个类也被证明很令人困惑、麻烦和设计不良。
所以,是的,您应该避免使用已弃用的方法,而是使用它们的替代方法。但现在这些替代方法(.Calendar)也有了替代品(java.time)。

java.time

所有旧的日期时间类都已被 Java 8 内置的 java.time 框架所取代。新的类受到了非常成功的 Joda-Time 框架的启发,旨在成为其继承者,概念类似但重新架构。由 JSR 310 定义。由 ThreeTen-Extra 项目进行扩展。请参阅 Tutorial

使用 java.time.format 包来解析和生成日期时间值的字符串表示形式。

String input = "07/23/2010";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MM/dd/yyyy" );

新的类包括 LocalDate,用于表示仅包含日期值而不包含时间的值。
LocalDate localDate = LocalDate.parse( input , formatter );

如果您在 LocalDate 上调用 toString,则会获得日期值的字符串表示形式,格式为标准 ISO 8601 格式,即 YYYY-MM-DD。要生成其他格式的字符串,请定义另一个格式化程序。或者调用“localize”方法,让 java.time 在确定特定本地化格式方面承担重任。

0

已弃用:指在当前版本的Java中存在,但将在未来某个时候从版本中删除的内容。

对于您的编辑,您需要正确初始化SimpleDateFormat,以便它知道输入的格式是什么。 对于07/22/1978格式:

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");


-1

如果您使用它们,目前不会有任何问题……但是它们可能会在未来的版本中被删除。


大多数与日期相关的弃用是由于错误导致的,因此由于这些错误可能会导致一些问题。 - user177800

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接