Android Joda DateTime一小时关闭

时间:2017-03-27 07:16:03

标签: android datetime jodatime

我有一个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时间之前我没有任何问题,因为它也会在一小时后保存。 任何想法发生了什么/如何解决它?

1 个答案:

答案 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"),这也会导致上面的输出(当你以这种方式使用格式化时,默认的语言环境不会改变输出)。

相关问题