【问题标题】:Getting yesterday - The method getDate() from the type Date is deprecated获取昨天 - 不推荐使用 Date 类型的方法 getDate()
【发布时间】:2013-02-18 14:09:58
【问题描述】:

我尝试获取昨天的日期。于是我写了下一个函数:

public  String getYestrday() {
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date = new Date();
    return dateFormat.format(date.getDate() - 1);
}

但它给了我下一个警告:

The method getDate() from the type Date is deprecated

它不起作用。

感谢您的帮助。

【问题讨论】:

  • 如果您完整阅读,弃用文本提示Calendar

标签: java date


【解决方案1】:

Date#getDate() 是 JDK 1.1 之后不推荐使用的方法。您应该使用 Calendar 类来操作日期。

来自API

在 JDK 1.1 之前,Date 类有两个附加功能。它 允许将日期解释为年、月、日、小时、分钟、 和第二个值。它还允许格式化和解析日期 字符串。不幸的是,这些函数的 API 不适合 走向国际化。从 JDK 1.1 开始,Calendar 类应该是 用于在日期和时间字段与 DateFormat 类之间进行转换 应该用于格式化和解析日期字符串。相应的 Date 中的方法已弃用。

API 中也明确记录了使用Date#getDate() 来使用Calendar#get(Calendar.DATE);

已弃用。从 JDK 1.1 版开始,替换为 Calendar.get(Calendar.DAY_OF_MONTH)

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
return dateFormat.format(cal.getTime());

【讨论】:

  • +1 用于避免小任务的额外库。 Calendar.DAY_OF_MONTHCalendar.DATE 都可以,它们是同义词。
【解决方案2】:

使用java.util.Calendar 执行此操作。或者试试JODA

【讨论】:

    【解决方案3】:

    避免使用 java.util.Date 和 .Calendar

    accepted answer 是正确的。然而,java.util.Date 和 .Calendar 类是出了名的麻烦。避开他们。使用Joda-Time 或新的java.time package(在Java 8 中)。

    将日期时间操作与格式化分开

    此外,问题中的代码将日期时间工作与格式混合在一起。将这些任务分开,使您的代码更清晰,测试/调试更容易。

    时区

    时区在日期时间工作中至关重要。如果您忽略此问题,将应用 JVM 的默认时区。更好的做法是始终指定而不是依赖默认值。即使您需要默认值,也要显式调用getDefault

    一天的开始由时区定义。巴黎的新一天比蒙特利尔更早。因此,如果“昨天”是指当天的第一刻,那么您应该 (a) 指定时区,并 (b) 致电 withTimeAtStartOfDay

    乔达时间

    Joda-Time 2.3 中的示例代码。

    DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
    DateTime today = DateTime.now( timeZone ); 
    

    或者从 java.util.Date 对象转换。

    DateTime today = new DateTime( myJUDate, timeZone );
    

    减去一天得到昨天(或前一天)。

    DateTime yesterday = today.minusDays( 1 );
    DateTime yesterdayStartOfDay = today.minusDays( 1 ).withTimeAtStartOfDay();
    

    默认情况下,Joda-Time 和 java.time 以 ISO 8601 格式解析/生成字符串。

    String output = yesterdayStartOfDay.toString(); // Uses ISO 8601 format by default.
    

    使用格式化程序将完整日期设置为四位数年份、两位数月份和两位数月份日期 (yyyy-MM-dd)。 Joda-Time 中已经定义了这样的格式化程序。

    String outputDatePortion = ISODateFormat.date().print( yesterdayStartOfDay );
    

    【讨论】:

      【解决方案4】:

      您可以使用Calendar 类来完成相同的任务:

      Calendar c = new Calendar();
      //c.add(Calendar.DAY_OF_MONTH, -1);
      Date d = c.getTime();
      

      【讨论】:

      • java.util.Calendar 的空构造函数受到保护。使用 Calendar.getInstance().getTime();而是
      【解决方案5】:

      以下作品适合我

      int date = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
      

      【讨论】:

        猜你喜欢
        • 2012-07-10
        • 1970-01-01
        • 2019-02-07
        • 1970-01-01
        • 2015-09-16
        • 2018-08-26
        • 2014-04-27
        • 1970-01-01
        • 2018-05-13
        相关资源
        最近更新 更多