我正在构建一个小型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);
当选择一个时间时,它返回一个小时的int和分钟的int,我将其保存为全局变量。
稍后在我的应用程序中我想将这些数字转换为Time对象,然后我可以使用它来查看当前时间是大于还是小于该类中表示的时间。
我所做的就是:
Time tStart = new Time(startTimeHours, startTimeMinutes, 0);
但是eclips说这个构造函数已被弃用。但是,取长的构造函数似乎不被弃用。
我环顾四周,在一篇文章中有人建议使用Calendar对象 - 但我无法弄明白 - 如何获取它的新实例并设置我的时间。它看起来只是包含时间的开销。
这种情况的最佳做法是什么?如果我需要使用接受long变量的构造函数 - 如何将我的2个整数转换为该long值?
答案 0 :(得分: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
课程添加验证和计算,但这一切都取决于您想要做什么。
我们可以为您提供更准确的答案如果您向我们提供有关您需要存储的时间值的更多信息,更准确地说,是否还需要存储任何日期信息?
答案 1 :(得分:1)
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
从 modern Date-Time API 中详细了解 java.time
,Trail: Date Time*。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。
答案 2 :(得分:0)
而不是花时间制作使用有限的类,比如Time对象除了在包含Date的上下文之外没有任何用处之外,可以专注于让Dates更容易操作。
使用日历上的设置方法是一个严重的拖累,它很难看。由于这一点,日期/时间的东西在Java 8中被炸毁了。
那就是说,我刚才有点厌倦了,并制作了一个DateBuilder,它使用流畅的构建器设计模式,让你可以使用这样的方法轻松构建日期:
Date newDate = new DateBuilder().hour(10).minute(20).build();
最后,我添加了许多其他便利设施,这些令人讨厌的事情就像给我午夜一样,或者让我只是增加时间。关于Dates在Java中的工作方式真的很糟糕的是你发现自己编写了很多代码,它很丑陋,它大大降低了周围代码的可读性。 Builder将它区分开来。
令人惊讶的部分是跳入自己的类并添加类似添加功能的东西是多么容易,例如:
new DateBuilder(new Date()).addDays(3).build();
我在8中使用了新的Date东西,它更好。 Joda也更好,但有趣的是最终我不喜欢Joda那么多,因为虽然它更好,它只是带来了一些相同的东西进入代码,它失败了一个最重要的图书馆测试你采用:我每次使用它时都不得不回去阅读文档。使用Objective-C中的类别使我相信,通常最好的方法是设计你将要触摸自己的代码的顶层,部分原因是因为你更有可能制作一些你会流畅使用的东西(因此得名),但也因为它是准DSL:如果我要在不同的域中进行编程,我可能想要一个强调其他东西的不同DateBuilder。