8

使用 Java Date 实用程序时的真正含义,并且某些内容已被弃用。这是否意味着不鼓励使用,还是暗示禁止使用?

我猜使用不推荐使用的方法是不好的做法,但我不确定并想找出答案。

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

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

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

它工作得很好,我有它,但它使用了一种不推荐使用的方法。

编辑 - 我已经回去使用

SimpleDateFormat 格式化程序 = new SimpleDateFormat(); 
model.setDate(formatter.parse(request.getParameter("date");



日期格式为 MM/DD/YYY,例如 07/23/2010,但我收到ParseException

这可能来自什么?

4

10 回答 10

6

你是对的,这是不好的做法。在几乎所有情况下,不推荐使用的方法都会告诉您应该使用什么,这也不例外(请参阅Javadocs)。

您正在尝试DateString. 但是字符串是什么格式的呢?应该如何解析?它是英国还是美国日期格式?

执行此操作的“正确”方法是创建一个SimpleDateFormat实例,并调用其parse()方法传入您的文本字符串。这保证将来可以工作,并且现在会更加强大。

于 2010-07-29T16:50:15.890 回答
3

不推荐使用的对象或方法仅仅意味着如果你想在当前项目中使用它,而不是使用推荐的东西。他们仍然拥有它的原因是那些在弃用之前使用过弃用方法的遗留代码。典型的例子是StringTokenizervsString.split()方法。

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


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

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

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

ParseException 是由于您没有提供日期格式结构而导致的,因此 SimpleDateFormat 不知道您的日期是如何构造的。

于 2010-07-29T16:50:41.907 回答
3

很多人都提到了 Deprecated 的含义,但我没有看到任何解释为什么这些方法被弃用:

Sun(在他们成为 Oracle 的一部分之前)弃用了许多方法Date来让人们使用Calendar/GregorianCalendar类来进行日期操作。

于 2010-07-29T17:18:46.810 回答
2

“弃用”是什么意思

你可能听说过“自嘲式幽默”这个词,或者说是贬低说话者重要性的幽默。不推荐使用的类或方法就是这样。它不再重要。事实上,它是如此不重要,以至于您不应该再使用它,因为它已被取代并且将来可能不复存在。

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

于 2010-07-29T16:49:56.073 回答
2

你是对的,不鼓励使用不推荐使用的方法。这是因为这些方法在某些情况下可能存在问题或已被更乐观的解决方案取代,而且未来的版本可能不支持这些。

于 2010-07-29T17:04:37.020 回答
1

不推荐使用意味着它计划被删除,因为它是错误的或其他一些不好的原因。最好使用SimpleDateFormat.parse(); 解析你的字符串。

于 2010-07-29T16:51:14.653 回答
1

一般来说,当 Sun(Oracle 等)宣布不推荐使用 Java 方法时,这意味着他们改变了包含它的想法,他们不鼓励您使用它,并且他们可能会在未来的某个版本中将其删除。当然,它可能需要很长时间才能被删除,因为谁知道有多少现有代码在使用它,以及仅仅因为 Java 的发明者认为他们现在对如何更好地了解如何破坏现有程序有什么意义?做某事?

大概他们有充分的理由弃用某些东西,所以你应该调查他们为什么说一些更新的功能更好。

对于不推荐使用的 Date 方法,通常这意味着他们建议您现在使用 Calendar 或 SimpleDateFormat 类。在你的情况下,可能是后者。

于 2010-07-29T16:51:48.240 回答
0

deprecated:存在于当前版本的 Java 中,但会在某个时候从未来版本中删除的东西。

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

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

于 2010-07-29T17:15:47.000 回答
0

正如其他人所说,java.util.Date 方法已被弃用,因为 Java 团队认为他们在 java.util.Calendar 中有更好的解决方案。

不幸的是,该课程也被证明是令人困惑、麻烦且设计不佳的。

所以,是的,您应该避免使用已弃用的方法,以尊重它们的替代品。但是现在这些替代品(.Calendar)有了替代品(java.time)。

java.time

所有旧的日期时间类都已被Java 8 中内置的java.time框架所取代。新类的灵感来自非常成功的Joda-Time框架,该框架旨在作为其继任者,在概念上相似但经过重新架构。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅教程

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

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

新类包括LocalDate用于表示没有时间的仅日期值。

LocalDate localDate = LocalDate.parse( input , formatter );

如果您调用LocalDate,您将获得标准ISO 8601格式 YYYY-MM-DDtoString的日期值的字符串表示形式。要生成其他格式的字符串,请定义另一个格式化程序。或者调用“本地化”方法让 java.time 完成确定特定本地化格式的繁重工作。

于 2015-12-07T06:45:54.470 回答
-1

如果你使用它们,什么都不会破坏......但是。

但它们很可能在未来的版本中被删除。

于 2010-07-29T16:47:46.220 回答