我已经检查了有关转换时间的问题,以毫秒为单位,我遵循了所有答案,但我仍然得到错误的小时数,尽管分钟和秒都可以。
在我的应用程序中,用户必须从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;
}
答案 0 :(得分:1)
了解发生了什么:
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
,则格式为{{1} }})。
旧类(HH:mm
,Date
和Calendar
)有lots of problems和design issues,并且它们被新API取代
在Android中,您可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。为了使其有效,您还需要ThreeTenABP(更多关于如何使用它here)。
首先,您创建一个SimpleDateFormat
(一个代表当天时间的类),然后使用org.threeten.bp.LocalTime
格式化它:
org.threeten.bp.format.DateTimeFormatter
此外,check the javadoc适用于所有可用格式。
答案 1 :(得分:0)
您好,如何使用功能强大的库?它非常简单实用, 它可以让你远离多条线路 Joda-Time
用法: Gradle配置:
PaymentType
了解更多信息和文档:
https://github.com/JodaOrg/joda-time
http://www.joda.org/joda-time/
快乐的编码!
答案 2 :(得分:0)
如果我理解你的话,你想把毫米转换成HH:mm:ss。 为此,我们使用SimpleDateFormat
private String hmsTimeFormatter(long milliSeconds) {
Date date = new Date(milliSeconds);
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
return format.format(date);
}
只需尝试并将格式语法更改为您喜欢的格式