什么可以替代已弃用的Date.getHours()方法?

19

如果一个Java方法已经被废弃,那么一定会存在另一种更好的方式实现相同的功能,对吗?

Date date = new Date();
date.getHours()

由于getHours()已被弃用,仅使用Date类来获取小时的最佳方法是什么?


6
Javadoc是什么意思? - JB Nizet
7个回答

13

Javadoc明确建议

Deprecated. As of JDK version 1.1, replaced by Calendar.get(Calendar.HOUR_OF_DAY).

Joda库是处理日期和时间的另一个最佳选择。


12

正如其他人所述,Javadoc建议使用Calendar.get(Calendar.HOUR_OF_DAY)代替。

Deprecated. As of JDK version 1.1, replaced by Calendar.get(Calendar.HOUR_OF_DAY).

以下是如何对已经设置了Date进行操作:

int getHourOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    return calendar.get(Calendar.HOUR_OF_DAY);
}

如果你想要0-23之间的数字,请使用Calendar.HOUR_OF_DAY,而对于0-11,请使用Calendar.HOUR


3
您的答案是唯一描述如何从现有日期获取小时数的答案,就像楼主所问的那样。您的答案应该被接受! - Martin Eckleben

10

这些方法已经被弃用。

你现在应该使用 java.util.Calendar#get()。

所以你的示例变成:

Calendar cal = Calendar.getInstance();
cal.get(Calendar.HOUR);

请参阅此类的Javadoc文档。

请注意,您可以通过调用cal.getTime()方法来获取一个Date对象。


6
Calendar cal = Calendar.getInstance();
cal.get(Calendar.HOUR);

如果你想将其作为日期:
Date date = cal.getTime();

错误。 Date.getHours() 尝试返回一天中的小时数(0-23)。cal.get(Calendar.HOUR) 返回上午或下午的小时数(0-11)。尽管这已经无关紧要了。Datecalendar 都设计不良且过时很久了。不要再使用它们。请使用 java.time,现代Java日期和时间API - Ole V.V.

5

你应该使用日历或者Joda Time库。

但如果你只能使用Date,那么这是你唯一的方法。注意,它不会调整时区。


3

java.time

java.util的日期时间API及其格式化API SimpleDateFormat已经过时且容易出错,建议完全停止使用并切换到现代日期时间API*

此外,下面引用了来自Joda-Time首页的通知:

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

使用现代日期时间API java.time的解决方案:

您可以使用ZonedDateTime#now(ZoneId)获取当前的日期时间对象,然后获取诸如时区偏移、年、月、日、小时、分、秒、纳秒等信息。如果不需要时区偏移量,则可以使用LocalDateTime#now(ZoneId)。但是,如果您只需要当前时间信息,则可以使用LocalTime#now(ZoneId)获取特定时区的本地时间,然后从LocalTime中获取小时、分、秒、纳秒等。

演示:

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        // Change the JVM's ZoneId, ZoneId.systemDefault() with the applicable ZoneId
        // e.g. ZoneId.of("America/Los_Angeles")
        ZoneId zoneId = ZoneId.systemDefault();

        ZonedDateTime zdt = ZonedDateTime.now(zoneId);
        System.out.println(zdt.getHour());

        LocalDateTime ldt = LocalDateTime.now(zoneId);
        System.out.println(ldt.getHour());

        LocalTime time = LocalTime.now(zoneId);
        System.out.println(time.getHour());
    }
}

样例运行结果:

13
13
13

在线演示

了解有关现代日期时间API的更多信息,请参阅教程:日期时间


* 如果由于任何原因,您必须坚持使用Java 6或Java 7,则可以使用ThreeTen-Backport将大多数java.time功能回溯到Java 6和7。如果您正在为Android项目工作,并且您的Android API级别仍不符合Java-8,请查看通过去糖化使用Java 8+ API如何在Android项目中使用ThreeTenABP


-1

使用以下代码。

Date date = new Date();
    System.out.println(date);
    System.out.println(new SimpleDateFormat("HH").format(date));
    System.out.println(new SimpleDateFormat("mm").format(date));
    System.out.println(new SimpleDateFormat("MM").format(date));
}

目前这个答案很难理解哪一行输出是期望的结果,除非知道或参考SimpleDateFormat的规范。请删除不必要的输出或详细说明每一行输出。 - Izruo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接