gpt4 book ai didi

java - Android 以毫秒为单位转换时间

转载 作者:太空狗 更新时间:2023-10-29 13:51:29 27 4
gpt4 key购买 nike

我已经检查了有关以毫秒为单位转换时间的问题,并且我遵循了所有答案,但我仍然得到错误的小时数,尽管分钟和秒都可以。

在我的应用程序中,用户必须从 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:00Check the javadoc了解格式 HH:mm:ss 的含义,以便在需要不同格式时更改它(例如,如果您只需要 01:30,格式将为 HH:mm)。


Java 新日期/时间 API

旧类(DateCalendarSimpleDateFormat)有lots of problemsdesign 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/

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