【问题标题】:java - how to hold time?java - 如何保持时间?
【发布时间】:2014-05-30 13:03:09
【问题描述】:

我正在构建一个小 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 值?

【问题讨论】:

  • 乘法,加上纪元的偏移量。不过,为什么你不能只使用 long 呢?
  • 这个Time 类是SQL 中的一个实用类。这可能不是您想要使用的。

标签: java android time java-time


【解决方案1】:

EDIT2:

这就是您如何创建两个不同时间的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 类。我想你的意思是this one?您应该使用我在下面发布的解决方案。


原始答案:

我主要倾向于使用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 类添加验证和计算,但这一切都取决于您想要做什么。

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

【讨论】:

  • 我需要在我的应用程序中做的是获取当前时间并检查它的大小或等于用户选择的时间。我该如何进行这样的比较?
  • 我假设您的意思只是比较同一天的不同时间?我将编辑我的答案。
【解决方案2】:

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

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

也就是说,我前一阵子有点受够了,并制作了一个 DateBuilder,它使用 fluent builder 设计模式让您可以使用以下方法轻松构建日期:

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 来强调其他事情。

【讨论】:

  • 你发布过 DateBuilder 吗?
  • 是的,它在我的 github 帐户上作为 gist here
【解决方案3】:

java.time

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

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

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.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

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 2019-12-22
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多