我已经检查了有关以毫秒为单位转换时间的问题,并且我遵循了所有答案,但我仍然得到错误的小时数,尽管分钟和秒都可以。
在我的应用程序中,用户必须从 TimePickerDialog
中选择一个时间并在 TextView 中设置时间。例如,它将在时钟中显示 01:30
。它会显示 502125000222:30:00
我的代码TimePickerDialog
:
TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
Calendar mycalendar = Calendar.getInstance();
mycalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
mycalendar.set(Calendar.MINUTE, minute);
mycalendar.set(Calendar.SECOND, 0);
long times = mycalendar.getTimeInMillis();
// hmsTimeFormatter is a method return time format
String timerRemaind = hmsTimeFormatter(times);
//tv_remaindertime is TextView
tv_remaindertime.setText(timerRemaind);
............
还有这个转换毫秒的hmsTimeFormatter
方法:
private String hmsTimeFormatter(long milliSeconds) {
String hms = String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(milliSeconds),
TimeUnit.MILLISECONDS.toMinutes(milliSeconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliSeconds)),
TimeUnit.MILLISECONDS.toSeconds(milliSeconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliSeconds)));
return hms;
}
最佳答案
了解正在发生的事情:
Calendar.getInstance()
使用 JVM 默认时区中的当前日期/时间创建一个Calendar
- 您设置小时、分钟和秒(我想是
01:30:00
) - 您调用
getTimeInMillis()
,它返回自 unix 纪元 (1970-01-01T00:00Z
) 以来的毫秒数
然后您将此毫秒值与 TimeUnit
一起使用,但这不是您需要的。 TimeUnit
会将毫秒数视为时间量,但您需要的是一天中的某个时间:
- 一天中的时间是一天中的特定时刻,例如“上午 10 点” 或“下午 5 点 30 分” .
- 一个时间量就是耗时量,例如“10 分45 秒”,或“2 年, 4 个月 5 天 17 小时”,但它没有附加到特定时间点(“10 分钟相对于什么?”);这只是时间本身。
虽然这两个概念可能使用相同的词(“小时”、“分钟”、“秒”等),但它们并不是一回事。
TimeUnit
处理时间量,因此它会进行像“1000 秒等于多少分钟?”这样的转换。。
示例:TimeUnit.MILLISECONDS.toHours(value)
返回等于 value
毫秒的小时数(不是一天中的时间)。由于您使用的值是 getTimeInMillis()
的结果,因此您将获得自 1970 年 1 月以来的总小时数。
通过将 getTimeInMillis()
(表示特定时间点)的结果与 TimeUnit
一起使用,您误用了该值,将其视为一个数量时间。
要格式化日期,您可以使用 SimpleDateFormat
:
Calendar mycalendar = Calendar.getInstance();
mycalendar.set(Calendar.HOUR_OF_DAY, 1);
mycalendar.set(Calendar.MINUTE, 30);
mycalendar.set(Calendar.SECOND, 0);
// format: hour:minute:second
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String hms = sdf.format(mycalendar.getTime()); // 01:30:00
这样,hms
的值将是 01:30:00
。 Check the javadoc了解格式 HH:mm:ss
的含义,以便在需要不同格式时更改它(例如,如果您只需要 01:30
,格式将为 HH:mm
)。
Java 新日期/时间 API
旧类(Date
、Calendar
和SimpleDateFormat
)有lots of problems和 design issues ,并且它们正在被新的 API 取代。
在 Android 中,您可以使用 ThreeTen Backport ,Java 8 的新日期/时间类的一个很好的反向移植。要使其正常工作,您还需要 ThreeTenABP (更多关于如何使用它的信息 here)。
首先您创建一个 org.threeten.bp.LocalTime
(一个表示一天中的时间的类),然后您使用 org.threeten.bp.format 对其进行格式化。日期时间格式化程序
:
// create time for 01:30
LocalTime time = LocalTime.of(1, 30);
// format: hour:minute:second
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("HH:mm:ss");
String hms = fmt.format(time);
System.out.println(hms); // 01:30:00
此外,check the javadoc适用于所有可用格式。
关于java - Android 以毫秒为单位转换时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46424297/