【问题标题】:Android Joda DateTime one hour offAndroid Joda DateTime 休息一小时
【发布时间】:2017-03-27 07:16:02
【问题描述】:

我有一个 TimePickerDialog,它可以让用户选择一个时间。 TimePickerDialog 有一个onTimeSet 方法,当用户完成时间选择时会调用该方法。 我将参数传递给第二种方法setTime(int hour, int minute),它保存值并显示格式化的时间。 这是该方法的代码sn-p:

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

【问题讨论】:

    标签: android datetime jodatime


    【解决方案1】:

    对于这个答案,我使用的是 joda-time 2.7(尽管它可能适用于以前的版本)。

    我还假设您的程序只关心 hourminute(我不是 Android 专家,但我看到了来自 TimePickerDialog 的文档好像是这样)。

    所以,如果你只操作 hourminute,你不需要使用DateTime 类(实际上你不应该在这种情况下) .

    这是因为DateTime 对象“了解”所有日期字段,包括日、月、年和时区。因此,当您创建 new DateTime() 时,它会在您的默认时区创建一个具有当前日期和时间的新对象。如果默认时区的当前日期是夏令时(也称为夏令时),您可以进行这些小时班次。

    (而且我相信 Android 会从设备系统中获取默认时区,因此它可能会根据运行代码的设备而有所不同 - 至少它在计算机中是这样工作的,所以对于设备)。

    由于您不需要知道日/月/年和时区,您可以使用 LocalTime 类 (org.joda.time.LocalTime),这是一个只有 小时分钟的类 字段(如果需要,还有秒数;如果您不关心秒数,它们将被设置为零)。最好的部分是:这个类不关心时区,所以 10:00 AM 将永远是 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"),这也会产生上面的输出(当你以这种方式使用格式化程序时,默认的语言环境不会改变输出)。

    【讨论】:

    • 谢谢,非常好的解释。我已经将它包含在我的代码中,并且它看起来可以正常工作。我希望这能解决问题。
    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2010-11-15
    • 2013-10-20
    相关资源
    最近更新 更多