我已经检查了有关以毫秒为单位转换时间的问题,并且遵循所有答案,但是尽管分钟和秒数还可以,但小时数还是错误的。
在我的应用程序中,用户必须从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
将把毫秒数视为时间,但是您需要的是一天中的时间:尽管两个概念可能使用相同的词(“小时”,“分钟”,“秒”等),但它们不是同一回事。
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.DateTimeFormatter
对其进行格式化:// 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/