Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java';s Date(…)构造函数已弃用;这是什么意思?_Java_Date_Constructor_Deprecated - Fatal编程技术网

Java';s Date(…)构造函数已弃用;这是什么意思?

Java';s Date(…)构造函数已弃用;这是什么意思?,java,date,constructor,deprecated,Java,Date,Constructor,Deprecated,我正在尝试创建一个日期,如下所示: date = new Date(year-1900, mon-1, day, hrs, min, sec); Instant pointInTime = dateTime.toInstant(); Date oldFashionedDate = Date.from(pointInTime); System.out.println(oldFashionedDate); Eclipse给了我这样的警告:“构造函数Date(int,int

我正在尝试创建一个日期,如下所示:

date = new Date(year-1900, mon-1, day, hrs, min, sec);
    Instant pointInTime = dateTime.toInstant();
    Date oldFashionedDate = Date.from(pointInTime);
    System.out.println(oldFashionedDate);
Eclipse给了我这样的警告:“构造函数
Date(int,int,int,int,int,int)
不推荐使用”


弃用构造函数意味着什么?我能做什么?

弃用意味着这是一种传统的或旧的方法,应该避免


根据本文档,请使用
Calendar.set(…)
,因为它已被弃用,这意味着您不应该真正使用它。您可以使用日历从字段生成日期。

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

相反,您可以使用
Calendar
API,正如完整的消息所希望向您建议的那样,或者(更好的是,IMO)您可以使用java 8中的
java.time
包(请参阅)。这两种API都是非常优秀的日期/时间API。到


当谈到不推荐使用的API时,如果编译器消息不建议使用其他API,那么Javadoc总是值得一看的——在本例中,Javadoc建议使用
Calendar.set(…)

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

在您的情况下,可以使用类而不是


顺便说一下,在Java8和更高版本中,这些旧类被新类()取代。受项目启发、定义和扩展。旧类仍然存在,您可以继续使用它们(同时避免使用它们不推荐的部分),但我们鼓励您转换到新类。

不推荐通常意味着不鼓励您使用该函数


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

弃用意味着不鼓励使用此构造函数,并且它可能会在将来的Java版本中被删除。使用日历API。

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

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

  • Calendar.set(年+1900,月,日,小时,分钟)

  • gregorianalendar(年+1900,月,日,小时,分钟)

正如建议的那样。

这里有一个代码片段,可以帮助您迁移代码。两张照片都一样

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
弃用意味着核心API和其他java库不依赖于它,它表示您有更好的方法

java.time …我能做什么

  • 确定时区
  • 使用java.time,现代java日期和时间API
  • 例如:

        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[美国/格拉斯湾]

    不要使用
    日期
    。那个班的设计总是很糟糕。大多数构造函数和方法很快被弃用是有原因的。它们不能跨时区可靠地工作。今天,我们有了更好的java.time

    仅当您需要一个
    日期
    用于无法升级到java.time的旧式API时,请按如下方式转换:

    date = new Date(year-1900, mon-1, day, hrs, min, sec);
    
        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的默认时区中,多年来这让很多人感到困惑(这只是避免使用该类的众多原因之一)。
    日期确实代表了正确的时间点,您可以将其用于遗留API

    不推荐使用构造函数

    许多人已经很好地解释了这一点。我并没有把20世纪90年代的不赞成作为删除构造函数的承诺。在Java9中,他们引入了将不推荐的项标记为删除的可能性。我仍然很好奇,看看他们是否会在某个时候将这个构造函数标记为删除

    链接
    • 解释如何使用java.time
    • 在OracleJDK9文档中

    避免它的方法不仅仅是“如果删除了代码,那么代码就不会被破坏”——通常情况下,替代方法首先是一种更好的方法(例如,更快、更健壮、更好的i18n支持等)。的确,它通常会被弃用,因为存在更好的替代方法。在Java 5和更新版本中,还有一个@Deprecated注释(实际上是
    java.lang.Deprecated
    ):我不明白为什么新日期(2011,1,1)将被淘汰,取而代之的是创建一个日历对象,然后设置它。如果您使用的是
    新的GregorianCalendar(…)
    您不需要在一年中增加1900。日历上有哪些日期是无法提供的?为什么他们不能直接添加新功能呢?是的,你应该避免使用j.u.Date/.Calendar。阅读关于Joda Time和java.Time的文章。如果要使用dates,请不要忘记至少看看ApacheCommonsLang;所有类型的实用程序(其中包括DateUtils),使处理日期(和字符串)变得不那么麻烦。请参阅更重要的内容,至少从Java8开始:查看。如果没有更好的方法可供使用