【问题标题】:The parameterized constructors of the java.util.Date class are deprecated. What is the alternative?java.util.Date 类的参数化构造函数已被弃用。什么是替代方案?
【发布时间】:2009-12-09 14:33:03
【问题描述】:

我可以用什么来代替它,new Date(2009, 12, 9)

感谢您的帮助。

【问题讨论】:

  • 有充分的理由,如果你想要 2009 年 12 月 12 日,你需要new Date(109, 11, 9)
  • @Yishai:我认为原因是“好”。
  • @Yishai:这似乎是一种随意的混淆,而不是有用。
  • 令我惊讶的是,像这样的琐碎问题已经在 API 文档中得到了回答(并且之前在 SO 中被问过无数次)很快就获得了投票,而棘手且更有趣的问题却没有得到太多投票。跨度>
  • 更好的主意是先查看 java 文档。任何像这样的核心类都会解释使用什么而不是弃用的方法。如果使用 Eclipse,一个方便的技巧是单击已弃用的方法,按住“Shift”并按“F2”,这将在浏览器的 java 文档中打开该方法。您可能需要先设置 java docs url。

标签: java date deprecated


【解决方案1】:

注意:这个答案写于 2009 年。从那时起,java.time 已成为 Java 中首选的日期/时间 API。


理想情况下,请改用Joda Time。它是一种比内置 API 优越得多的 API。然后,您需要根据您的具体要求在 LocalDateTimeDateTime 之间进行选择(这是一个复杂的领域 - 我不会尝试用一两句话来总结,但 docs 做得很好)。

如果绝对必要,请使用 java.util.Calendar 并在需要时将其转换为 Date

【讨论】:

  • Joda Time +1,与日期和日历相比,这是一个梦想。
  • 这本来可以很好,但我使用的是 gxt(谷歌网络工具包和 ext js),所以我认为我必须在这个 API 中使用日期对象。
  • @Tim:在问题中总是值得一提的是非标准环境......
【解决方案2】:

Calendar !

Calendar cal = Calendar.getInstance();
cal.set(2009, Calendar.DECEMBER, 12);

请注意,我并没有把 12 月放在 12 月,因为它实际上是 11(一月是 0)。

然后,您可以使用以下命令轻松添加或删除秒、分钟、小时、天、月或年:

cal.add(Calendar.HOUR, 2);
cal.add(Calendar.MONTH, -5);

最后,如果你想要一个日期:

cal.getTime();

【讨论】:

  • 请注意,在此解决方案中,小时、分钟、秒(和分数)设置为当前值。这不是很干净。
【解决方案3】:

如果您查看Javadoc,它会指出您使用Calendar

从 JDK 1.1 版开始,由 Calendar.set(year + 1900, month, date, hrs, min) 或 GregorianCalendar(year + 1900, month, date, hrs, 分钟)。

如果您查看 Date 构造函数参数,您就会明白为什么它被弃用了:

参数:

year - the year minus 1900.
month - the month between 0-11.
date - the day of the month between 1-31.
hrs - the hours between 0-23.
min - the minutes between 0-59.

year 不是您所期望的,month 也不是。

要表示您提到的日期,您需要像这样调用Date (不推荐)

new Date(2009-1900, 12-1, 9)

使用Calendar 的替代方法是

Calendar cal = Calendar.getInstance();
cal.set(2009, 11, 9); //year is as expected, month is zero based, date is as expected
Date dt = cal.getTime();

【讨论】:

  • 日历的月份仍然是从零开始的。
  • 实际上,月份是我所期望的。是日期让我发疯。 Java 中的一切都是从零开始的,除了日期!
  • @BlausC:确实如此。难怪人们更喜欢使用 Joda 日期时间而不是这个糟糕的 Calendar API。
  • 更新:这些糟糕的日期时间类已被 JSR 310 中定义的 java.time 类所取代。请参阅 Answer by Arvind Kumar Avinash 中的现代解决方案。
【解决方案4】:

您也可以使用SimpleDateFormat 对象:

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;


public class DateTest {
    public static void main( String [] args ) throws ParseException {
        SimpleDateFormat sdf =  new SimpleDateFormat("yyyy, MM, dd");
        Date date = sdf.parse("2009, 12, 9");
        System.out.println( date );
    }
}

【讨论】:

  • 请注意不要将SimpleDateFormat 设为static 实例,因为它不是线程安全的。见ibm.com/developerworks/java/library/j-jtp09263.html
  • :-o 我不知道它不是线程安全的。幸运的是,我使用它的大部分时间(尽管声明为类成员)都在线程安全上下文中:)
  • 使用 java.time 类以获得线程安全和许多其他好处。查看Answer by Arvind Kumar Avinash 中的现代解决方案。
【解决方案5】:

Tim,在您的 cmets 中,您提到您在 GXT 上下文中执行此操作 - 即在 GWT 客户端代码中。 GWT 不支持 GregorianCalendar,您很可能无法通过 GWTCompiler 输入 JodaTime(您可能可以,但您真的想要)。

如果您想在 GWT 中执行日历操作,我认为您确实可以选择使用 JNSI。请参阅 JavaScript 中的 Date 类。

【讨论】:

    【解决方案6】:

    java.time

    java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time API*

    另外,下面引用的是Home Page of Joda-Time的通知:

    请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。

    使用现代 API java.time 的解决方案:

    import java.time.LocalDate;
    import java.time.ZoneId;
    import java.time.ZonedDateTime;
    
    public class Main {
        public static void main(String[] args) {
            ZonedDateTime zdt = LocalDate.of(2009, 12, 9).atStartOfDay(ZoneId.of("Etc/GMT"));
            System.out.println(zdt);
        }
    }
    

    输出:

    2009-12-09T00:00Z[Etc/GMT]
    

    输出中的Z 是零时区偏移的timezone designator。它代表 Zulu 并指定 Etc/UTC 时区(时区偏移量为 +00:00 小时)。

    出于任何原因,如果您需要将此ZonedDateTime 的对象转换为java.util.Date 的对象,您可以这样做:

    Instant instant = zdt.toInstant();
    Date date = Date.from(instant);
    

    ONLINE DEMO

    java.util.Date 类似,Instant 表示UTC 中时间轴上的瞬时点,但与java.util.Date 不同,java.util.Date 不表示真正的日期时间对象(java.util.Date 对象仅表示数字自称为“纪元”的标准基本时间(即January 1, 1970, 00:00:00 GMT)以来的毫秒数,它表示一个真实的日期时间对象。

    Trail: Date Time了解更多关于java.timemodern Date-Time API*


    * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

    【讨论】:

      【解决方案7】:

      不幸的是,Java 中的日期支持非常糟糕。正式地,您可能必须使用日历来执行此操作,但我认为这不是必需的。就像其他人提到的那样,Joda 时间要好得多,但仍然不如 Ruby on Rails 中的日期那么容易使用。

      我不知道有任何 Java 包可以为您提供如此多的日期支持(Joda 有点不足,但已经接近),但是在 Groovy 中,使用 TimeCategory 可以为您提供非常类似于 Ruby on Rails 的日期支持。

      【讨论】:

      • 自从这篇文章以来发生了很多变化,随着在 JSR 310 中定义并内置到 Java 8 及更高版本中的 java.time 类的到来。查看Answer by Arvind Kumar Avinash 中的现代解决方案。
      【解决方案8】:
      GregorianCalendar(year + 1900, month, date)
      

      https://docs.oracle.com/javase/1.5.0/docs/api/java/util/Date.html

      【讨论】:

      • 要替换 new Date(...),您需要添加 .getTime()
      猜你喜欢
      • 2023-03-30
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 2017-12-04
      相关资源
      最近更新 更多