0

在解决这个问题时遇到了一些麻烦。我只是为自己制作一个工作表,以帮助计算我那天工作了多少小时。我有两个选择器,一个用于开始时间,一个用于结束时间。两个选择器都将所选时间格式化为字符串。现在我只需要找到开始字符串和结束字符串之间经过的小时数。我不处理日期更改,因此无需计算以前在这里让我感到困惑的天数/日期->计算 java 中的日期/时间差

这些是我的选择器听众。

private TimePickerDialog.OnTimeSetListener startPickerListener = new TimePickerDialog.OnTimeSetListener() {

    public void onTimeSet(TimePicker view, int selectedHour, int selectedMinute) {
        startHour = selectedHour;
        startMinute = selectedMinute;

        startTime.setText(new StringBuilder().append(padding_str(startHour)).append(":").append(padding_str(startMinute)));

    }
};
private TimePickerDialog.OnTimeSetListener finishPickerListener = new TimePickerDialog.OnTimeSetListener() {

    public void onTimeSet(TimePicker view, int selectedHour, int selectedMinute) {
        finishHour = selectedHour;
        finishMinute = selectedMinute;

        finishTime.setText(new StringBuilder().append(padding_str(finishHour)).append(":").append(padding_str(finishMinute)));

    }
};

任何帮助将不胜感激!干杯! (如果您需要更多信息,请告诉我。)

4

2 回答 2

0

如果使用SimpleDateFormat将字符串导入日期,则可以轻松计算时间差。像这样的东西:

Date startDate = new SimpleDateFormat("HH:mm", Locale.ENGLISH).parse(startHour + ":" + startMinute);
Date endDate = new SimpleDateFormat("HH:mm", Locale.ENGLISH).parse(endHour + ":" + endMinute);
long milliDiff = endDate - startDate;
long hoursDiff = milliDiff / (60 * 60 * 1000); //Convert millisecond of difference into hours

即使您碰巧在日期更改时工作,这也应该有效,因为毫秒是从 1970 年 1 月 1 日开始计算的,而不是从当天开始计算的。

于 2014-04-05T04:32:23.107 回答
0

一天≠24小时

您可能需要日期。由于夏令时 (DST) 和其他异常情况,一天可能并不总是 24 小时。例如,在美国,它可能是 23、24 或 25 小时。

但是,如果您确定要在 24 小时内工作,请使用Joda-TimeLocalTime中的类或 Java 8 中的新java.time 包。Java 捆绑的 java.util.Date 和 .Calendar 类是出了名的麻烦并且应该避免。(因此在 Java 8 中需要 java.time)

java.time

java.time框架包括一个类似于LocalTimeJoda-Time 的类。

LocalTime start = LocalTime.of( 9 , 0 );
LocalTime stop = LocalTime.of( 13 , 0 );

该类Duration以秒和纳秒为单位跟踪时间跨度。请参阅Oracle 教程

Duration duration = Duration.between( start , stop );

奇怪的是,在 Java 8 中,Duration该类缺少获取小时数部分、分钟数部分等的方法。您可以将跨度作为总小时数和总分钟数获得,并自己计算。Java 9 用新的“get part”方法弥补了这一缺陷。

乔达时间

您应该在 StackOverflow.com 上搜索“joda parse time”和“joda elapsed time”。但是为了让您继续前进,这是我脑海中浮现的一些 Joda-Time 2.3 代码(未经测试,只是输入)。

LocalTime start = new LocalTime( 13, 10 );
LocalTime stop = new LocalTime( 13, 14 );
int minutesBetween = Minutes.minutesBetween( start, stop ).getMinutes();
Period period = new Period( start, stop );
Duration duration = period.toDuration();

如果这是您的目标,可以在几个小时内查询 Period 对象。

尝试toString在这些对象上调用该方法。搜索 StackOverflow 以了解更多信息。

于 2014-04-05T05:10:18.343 回答