我有一个TimePickerDialog,可让用户选择时间。 TimePickerDialog有一个onTimeSet
方法,当用户完成选择时间时会调用该方法。
我将参数传递给第二个方法setTime(int hour, int minute)
,该方法保存值并显示格式化的时间。
以下是该方法的代码段:
java.text.DateFormat dateFormatter =
java.text.DateFormat.getTimeInstance(java.text.DateFormat.SHORT, Locale.getDefault());
DateTime dt = new DateTime();
dt = dt.hourOfDay().setCopy(hour);
dt = dt.minuteOfHour().setCopy(minute);
String text = dateFormatter.format(dt.toDate());
问题是(有时,并非总是)小时值关闭一个甚至两个小时。我认为问题的原因与时区有关,但我不知道具体原因是什么。我也认为问题是由Joda DateTime对象引起的,因为在我实现Joda时间之前我没有任何问题,因为它也会在一小时后保存。 任何想法发生了什么/如何解决它?
答案 0 :(得分:1)
对于这个答案,我正在使用 joda-time 2.7 (尽管它可能适用于以前的版本)。
我还假设你的程序只关心小时和分钟(我不是Android专家,但我看到来自TimePickerDialog
的文档似乎是这样的。)
因此,如果您只操作小时和分钟,则无需使用DateTime
类(实际上您不应该使用此类)情况)。
这是因为DateTime
对象“了解”所有日期字段,包括日,月,年和时区。因此,当您创建new DateTime()
时,它会在默认时区中创建一个包含当前日期和时间的新对象。如果默认时区中的当前日期是夏令时(又名夏令时),则可以进行这些小时班次。
(我相信Android从设备的系统中获取默认时区,因此它可能会根据运行代码的设备而有所不同 - 至少它是如何在计算机中运行的,所以它不应该是不同的设备)。
由于您不需要知道日/月/年和时区,因此您可以使用LocalTime
班级(org.joda.time.LocalTime
),这是一个只有小时的班级, 分钟字段(如果需要,则为秒; 如果您不关心秒数,则将其设置为零)。最好的部分是:此课程不关心时区,因此上午10:00 将始终 10:00 AM 。
您也不需要使用java.text.DateFormat
,因为joda-time有自己的格式化程序。所以代码将是这样的:
public void setTime(int hour, int minute) {
// shortTime() is equivalent to DateFormat.SHORT
DateTimeFormatter fmt = DateTimeFormat.shortTime().withLocale(Locale.getDefault());
LocalTime time = new LocalTime(hour, minute);
String text = fmt.print(time);
System.out.println(text);
}
进行一些测试(假设默认语言环境为 en_US ):
setTime(9, 30); // prints 9:30 AM
setTime(10, 0); // prints 10:00 AM
PS:输出可能会根据您的默认Locale
(我也相信它来自设备的系统)而有所不同。如果你想要一个固定的格式(独立于语言环境),你可以使用DateTimeFormat.forPattern("h:mm a")
,这也会导致上面的输出(当你以这种方式使用格式化时,默认的语言环境不会改变输出)。