【问题标题】:Java's Date(...) constructor is deprecated; what does that mean?Java 的 Date(...) 构造函数已弃用;这意味着什么?
【发布时间】:2010-01-04 14:16:53
【问题描述】:

我正在尝试像这样创建Date

date = new Date(year-1900, mon-1, day, hrs, min, sec);

Eclipse 给了我这个警告:“构造函数 Date(int, int, int, int, int) 已弃用”。

构造函数被弃用是什么意思,我能做什么?

【问题讨论】:

标签: java date constructor deprecated


【解决方案1】:

Deprecated 的字面意思是不赞成,但更准确的翻译应该是retired已弃用表示此方法仍然可用,但您不应该使用它。将逐步淘汰。有一种新方法可以做同样的事情。不推荐使用的方法标有特殊的 Javadoc 注释:

/**
 *@deprecated Please now use newMethod()
 *@see newMethod()
 */

使用

  • Calendar.set(year + 1900, month, date, hrs, min)

  • GregorianCalendar(year + 1900, month, date, hrs, min)

按照by the API documentation的建议。

【讨论】:

  • 在Java 5及更新版本中,还有一个@Deprecated注解(实际上是java.lang.Deprecated):java.sun.com/javase/6/docs/api/java/lang/Deprecated.html
  • 我不明白为什么 new Date(2011,1,1) 会被淘汰,转而创建一个 Calendar 对象然后设置它。
  • 如果您使用的是new GregorianCalendar(...),则无需将 1900 添加到年份。
  • 日历有什么 Date 不能提供的?为什么他们不能直接添加新功能呢?
  • 是的,您应该避免使用 j.u.Date/.Calendar。阅读有关 Joda-Time 和 java.time 的 sibling answer by Jon Skeet
【解决方案2】:

这意味着你不应该在新代码中使用它。如果现在有更好的方法来实现某事,通常会出现这种情况,但为了向后兼容而保留旧方法。

相反,您可以使用Calendar API,正如希望向您建议的完整消息 - 或者(更好的 IMO)您可以使用 Java 8 中的 Joda Timejava.time 包(见tutorial)。这两者都是 优越的日期/时间 API。到

当涉及到已弃用的 API 时,如果编译器消息没有建议替代方案,则始终值得查看 Javadoc - 在这种情况下建议使用 Calendar.set(...)

【讨论】:

  • 如果没有更好的方法可以使用但使用现有方法很危险,我们可以使用已弃用的方法还是应该有新的替代方法?
  • @kamaci:根据我的回答,您应该使用 Calendar - 或 Joda Time。
  • 其实我的问题可能跑题了。我想了解已弃用的术语。
  • @kamaci:那又如何呢?基本上,它的意思是“请不要使用它”——通常,要么提供替代方案,要么它代表你无论如何都不应该做的事情。
  • @kamaci 为了扩展 Jon Skeet 的回答和评论,“已弃用”意味着该课程的作者对您说“我们搞砸了,这个方法或课程是个坏主意。所以请停止使用这个旧代码。而是使用我们设计得更好的新代码。我们想要删除这个旧代码,并且可能最终会这样做,但我们希望给人们时间来过渡。”。
【解决方案3】:

这意味着您通常不应在新代码中使用它,因为它很危险,或者因为存在更好的替代方案。当在非弃用代码中使用或覆盖弃用的程序元素时,编译器会发出警告。

在您的情况下,您可以使用 java.util.Calendar 类而不是 java.util.Date

顺便说一句,在 Java 8 及更高版本中,这些旧类被新的 java.time package (Tutorial) 所取代。受Joda-Time 启发,由JSR 310 定义,并由ThreeTen Extra 项目扩展。旧类仍然存在,您可以继续使用它们(同时避免使用它们已弃用的部分),但我们鼓励您过渡到新类。

【讨论】:

  • 实际上,.Date 和 .Calendar 现在都已被 Java 8 及更高版本中内置的新 java.time package 所取代。
  • @BasilBourque,您正在回复五年前的回答。
  • 是的,我是。虽然五年前发布,但今天人们仍在阅读它。读者应该更新提及替换部分弃用的类。
  • @BasilBourque,最好用附录更新答案本身。
  • @missingfaktor 哎呀,没看到你们两个之间的对话。我认为 Basil 的添加属于它自己的答案,但现在我看到您已经要求他将其添加到您的答案中。我已经恢复了我的回复。
【解决方案4】:

不推荐使用意味着它是做某事的遗留或旧方式,应该避免。

根据本文http://java.sun.com/j2se/1.4.2/docs/api/java/util/Date.html,使用Calendar.set(...)

【讨论】:

    【解决方案5】:

    这里有一个代码 sn-p 可帮助您迁移代码。两张图是一样的。

    import java.util.Calendar;
    import java.util.Date;
    
    public class Tinker {
    
        public static void main(String[] args) {
    
            int Y = 2015; // Year 2015
            int M = 11;   // 0..11 -- December
            int D = 15;   // 15th
            int H = 16;   // 4:00 PM
            int MN = 28;  // 4:28 PM
            int S = 41;   // 4:28:41
    
            Date d = new Date(Y-1900,M,D,H,MN,S);
    
            System.out.println(d);
    
            Calendar c = Calendar.getInstance();
            c.set(Y, M, D, H, MN, S);
    
            d = c.getTime();
            System.out.println(d);                      
    
        }
    
    }
    

    输出:

    Tue Dec 15 16:28:41 CST 2015
    Tue Dec 15 16:28:41 CST 2015
    

    【讨论】:

      【解决方案6】:

      因为它已被弃用意味着你不应该真正使用它。您可以改用日历从字段中生成日期。

      【讨论】:

        【解决方案7】:

        deprecated 表示不鼓励使用此构造函数,并且可能会在 Java 的未来版本中删除。使用日历 API。

        【讨论】:

          【解决方案8】:

          java.time

          ……我该怎么办?

          1. 确定时区。
          2. 使用现代 Java 日期和时间 API java.time。

          例如:

              ZoneId zone = ZoneId.of("America/Glace_Bay");
              ZonedDateTime dateTime = ZonedDateTime.of(2019, 10, 27, 12, 34, 56, 0, zone);
              System.out.println(dateTime);
          

          输出是:

          2019-10-27T12:34:56-03:00[美国/Glace_Bay]

          不要使用Date。那堂课总是设计得很糟糕。大多数构造函数和大多数方法很快被弃用是有原因的。它们不能跨时区可靠地工作。今天我们在 java.time 中的表现要好得多。

          仅当您需要 Date 来获取您现在无法升级到 java.time 的旧版 API 时,才可以像这样进行转换:

              Instant pointInTime = dateTime.toInstant();
              Date oldFashionedDate = Date.from(pointInTime);
              System.out.println(oldFashionedDate);
          

          我的时区的输出是:

          2019 年 10 月 27 日星期日 15:34:56 GMT

          一天中的时间与我们指定的不一致。这是因为我在不同的时区。 Date.toString(从 System.out.println 调用)在 JVM 的默认时区中呈现日期,这多年来一直困扰着许多人(这只是避免使用该类的众多原因之一)。 Date 确实代表了正确的时间点,您可以将它用于您的旧版 API。

          构造函数被弃用是什么意思,...

          许多人已经很好地解释了这一点。我没有将 1990 年代的弃用视为移除构造函数的承诺。在 Java 9 中,他们引入了将不推荐使用的项目标记为删除的可能性。我仍然很想知道他们是否会在某个时候将此构造函数标记为删除。

          链接

          【讨论】:

            【解决方案9】:

            不推荐使用通常意味着不鼓励您使用该功能。

            出于某种原因,已经决定没有 Java 会更好(因为存在更好的替代方案,而您应该使用它),因此它可能从Java 的未来版本。弃用基本上是一个警告,“这可能会在未来被删除,尽管我们将它保留一段时间,让您有机会首先从代码中删除它”

            【讨论】:

            • 避免它不仅仅是“如果它被删除,你的代码不会中断” - 通常替代方案是首先做它的更好方法(例如更快,更健壮,更好的 i18n 支持等)。
            • 是的,它通常已被弃用,因为存在更好的替代方案。
            【解决方案10】:

            弃用意味着核心 API 和其他 java 库不依赖于它,它表示您有更好的方法。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-07-17
              • 2021-09-10
              • 2019-01-20
              • 2018-01-19
              • 1970-01-01
              • 1970-01-01
              • 2016-08-10
              • 2022-12-12
              相关资源
              最近更新 更多