gpt4 book ai didi

Android Joda DateTime 关闭一小时

转载 作者:行者123 更新时间:2023-11-30 00:38:16 25 4
gpt4 key购买 nike

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

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 时间之前我没有遇到任何问题,而且它也会在一小时后保存。知道会发生什么/如何解决它吗?

最佳答案

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

我还假设您的程序只关心小时分钟(我不是 Android 专家,但我看到了来自 TimePickerDialog< 的文档 似乎是这样)。

因此,如果您只处理小时分钟,则不需要使用DateTime 类(实际上您不应该t 在这种情况下)。

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

关于Android Joda DateTime 关闭一小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43040081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com