【问题标题】:How am I able to find the elapsed time between 2 strings?我怎样才能找到两个字符串之间的经过时间?
【发布时间】:2014-04-05 03:27:50
【问题描述】:

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

    }
};

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

【问题讨论】:

  • 您问的是两个问题,而不是一个。 (a) 将字符串解析为时间值,(b) 计算经过的时间。两者都在 StackOverflow 上被多次询问和回答。
  • 我知道他们之前被问过多次,但没有一个人有帮助。他们都是在A点到当前时间之间选择时间,而不是时间A和时间B,不管当前时间是什么。如果他们不这样做,他们会使用日期和时间,但我理所当然地不在乎日期是什么,因为我的老板会让我工作 24 小时以上,甚至这么晚/早。晚上/早上。我只是想制作一个基本的计算器。不多不少。
  • 如果你想要没有日期的时间,我的回答能解决你的问题吗?我评论的重点是您应该能够自己构建答案。如果您执行诸如“joda date parse”和“joda calculate time”或“joda elapsed”之类的搜索,您会发现大量代码和示例。
  • 我建议你应该关注日期。由于夏令时和其他异常情况,通常时间工作应与日期时间一起考虑和跟踪。这对你来说可能听起来是多余的,但最终痛苦会教你不然。
  • 就我个人而言,我认为我需要回到开始的基础......我不完全理解应该是“公共”、“私人”、“静态”等等......我不知道如何调用这些函数来完成 onClick 的工作。我阅读、关注并理解了 android.com 慷慨提供的“构建你的第一个应用程序”,但这并不能帮助我理解这些调用函数或它们被称为什么......关于在哪里寻找更多内容的任何想法深入了解这些或您可能知道有帮助的任何更好的教程?我为我缺乏知识而道歉。我确实想学习。

标签: android string time timepicker elapsedtime


【解决方案1】:

如果您使用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 日开始计算的,而不是从一天的开始。

【讨论】:

  • 你能给我一个简单的例子吗?我为我的无知道歉,但我只是应用程序制作场景的新手。干杯哥们!赞赏。
  • 当我使用'long hoursDiff = milliDiff / (60 * 60 * 1000);'我得到“milliDiff 无法解析为变量”
  • 您是否像我在示例中那样初始化milliDiff?如果您复制并粘贴我在那里写的四行,我相信它们应该可以在没有任何进一步更改的情况下工作,而 hoursDiff 将是您需要的答案。
  • 啊,抱歉。当我使用您提供的示例时,出现错误“运算符 - 未定义参数类型 java.util.Date、java.util.Date”。想法?
  • Ack,尝试减去 endDate.getTime() - startDate.getTime()。我错过了一步。
【解决方案2】:

一天≠24小时

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

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

java.time

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

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

Duration 类以秒和纳秒为单位跟踪时间跨度。见Oracle Tutorial

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-12-14
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2023-03-05
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多