1

我正在构建一个小 android 应用程序,用户可以在其中选择一些操作的开始时间。

我正在使用 TimerPickerDialog:

mTimePicker = new TimePickerDialog(getContext(), new TimePickerDialog.OnTimeSetListener() {
    @Override
    public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) {
        startTimeHours = selectedHour;
        startTimeMinutes = selectedMinute;
}, hour, minute, is24hours);

and when a time is selected it returns an int for the hour and int for the minutes, which I save as a global variable.

稍后在我的应用程序中,我想将这些数字转换为一个 Time 对象,然后我可以使用它来查看当前时间是大于还是小于该类中表示的时间。

我所做的是:

Time tStart = new Time(startTimeHours, startTimeMinutes, 0);

但是 eclips 说这个构造函数已被弃用。但是,似乎并没有弃用需要很长时间的构造函数。

我环顾四周,在一篇帖子中有人建议使用 Calendar 对象——但我想不通——如何获取它的新实例并设置我的时间。它看起来像是只包含时间的开销。

这种情况的最佳实践是什么?如果我需要使用接受 long 变量的构造函数 - 如何将我的 2 个整数转换为那个 long 值?

4

3 回答 3

3

编辑2:

这就是您如何创建两个Date具有不同时间的对象并在之后进行比较:

Calendar calendar = Calendar.getInstance(); // By default the date and time is set to now

// Create first date
calendar.set(Calendar.HOUR_OF_DAY, 20);
calendar.set(Calendar.MINUTE, 5);
Date dateOne = calendar.getTime();

// Create second date
calendar.set(Calendar.HOUR_OF_DAY, 17);
calendar.set(Calendar.MINUTE, 36);
Date dateTwo = calendar.getTime();

// With before() you can check if a Date is before some other date
if(dateOne.before(dateTwo)) {
    // dateOne is before dateTwo
} else {
    // dateTwo is before dateOne
}

你也可以after()用来检查一些Date是否在其他一些之后Date


编辑:

Long您在问题的最后一段中提到的值是以毫秒为单位的纪元时间。你真的不应该使用Time框架中的这个类。我想你的意思是这个?您应该使用我在下面发布的解决方案。


原始答案:

我主要倾向于使用Date对象作为容器。创建Date实例的最佳实践是使用Calendar对象。尝试这样的事情:

// We get a Calendar instance with getInstance();
Calendar calendar = Calendar.getInstance();

// Now we set the date we want.
calendar.set(Calendar.YEAR, 2014);
calendar.set(Calendar.MONTH, 4);  // Be carefull, months start at 0. January = 0, Feburary = 1, March = 2,...
calendar.set(Calendar.DAY_OF_MONTH, 29);
calendar.set(Calendar.HOUR_OF_DAY, 20);
calendar.set(Calendar.MINUTE, 5);

// And finally we create the `Date` instance with getTime()
Date date = calendar.getTime();

// You can also do the reverse and set the time in a `Calendar` instance from a `Date` instance.
calendar.setTime(date);

这很简单,Calendar也很强大,但我认为这不适合你。因为这个解决方案创建了一个Date对象。因此,它存储的不仅仅是小时和分钟。

您必须决定这是否适用于您的情况。如果您真的只想存储小时和分钟,我建议您创建一个这样的自定义Time类:

public class Time {

    private int minute;
    private int hour;

    public int getMinute() {
        return minute;
    }

    public void setMinute(int minute) {
        this.minute = minute;
    }

    public int getHour() {
        return hour;
    }

    public void setHour(int hour) {
        this.hour = hour;
    }
}

如有必要,您还可以向此类添加验证和计算Time,但这一切都取决于您想要做什么。

我们可以给你一个更准确的答案如果你给我们更多关于你需要存储什么样的时间值的信息,更准确地说是否还必须存储任何日期信息?

于 2014-05-30T13:14:53.000 回答
1

与其花时间制作使用有限的类,比如一个除了包含 Date 的上下文之外真的没有任何用途的 Time 对象,不如专注于让 Dates 更易于操作。

在日历上使用 set 方法是一种严重的拖累,而且很丑陋。日期/时间的东西在 Java 8 中被炸毁了,部分原因就是这个。

也就是说,我前一段时间有点厌倦了,并制作了一个 DateBuilder ,它使用流利的构建器设计模式让您可以使用如下方法轻松构建日期:

Date newDate = new DateBuilder().hour(10).minute(20).build();

最后我添加了一堆其他的便利,比如给我午夜,或者让我只是增加时间。Java 中 Dates 工作方式的真正糟糕之处在于,您发现自己编写了很多代码,这很丑陋,并且大大降低了周围代码的可读性。Builder 对此进行了划分。

让人们惊讶的部分是,只需跳入您自己的类并添加类似 add 函数的东西是多么容易,例如:

new DateBuilder(new Date()).addDays(3).build();

我在 8 中使用了新的 Date 东西,它更好。Joda 也更好,但有趣的是,我最终并没有那么喜欢 Joda,因为虽然它更好,但它只是将一些相同的东西带入了代码中,并且它没有通过对你的库的最重要测试之一采用:每次我使用它时,我都不得不回去阅读文档。在 Objective-C 中使用类别让我确信,最好的方法是设计你自己将接触到的代码的顶层,部分原因是你更有可能制作一些你会流畅使用的东西(因此得名),但也因为它是准 DSL:如果我要在不同的领域进行编程,我可能想要一个不同的 DateBuilder 来强调其他事情。

于 2014-05-30T13:25:11.997 回答
1

java.time

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

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

import java.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        // Sample startTimeHours and startTimeMinutes (to be obtained from
        // TimerPickerDialog in your case
        int startTimeHours = 19;
        int startTimeMinutes = 0;

        LocalTime startTime = LocalTime.of(startTimeHours, startTimeMinutes);

        LocalTime now = LocalTime.now().truncatedTo(ChronoUnit.MINUTES);

        System.out.println(
                            now.isAfter(startTime) ?  "Past"    :
                            now.isBefore(startTime) ? "Future"  :
                                                      "Present"
        );
    }
}

输出:

Present

Trail: Date Time了解更多关于java.time现代日期时间 API *的信息。


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

于 2021-05-28T18:00:37.863 回答