1

所以我的方法接收一个 24 小时格式的时间(“HH:MM:SS”)并返回一个字符串差时间。如果是当地时间下午 2:00,我应该能够发送它“16:30:00”(下午 4:30)并获得输出“2 小时 30 分钟”。但是代码有一些问题,我只是一个初学者,我需要帮助来修复它。

问题是如果时间是下午 4:40,我发送它“17:00:00”(下午 5:00)它会返回消息:12 小时 20 分钟而不是 0 小时 20 分钟。另一个问题是,如果我在当前时间发送它,它将返回“12 小时”,而不是应该返回的 24 小时。

请记住,我只是 java 的初学者,数学真的不是我的事,所以非常感谢任何帮助。谢谢。

private static String timeUntil(String distanceTime) {
String returnMsg = null;
try {
    SimpleDateFormat sdfDate = new SimpleDateFormat("hh:mm:ss");
    Date now = new Date();
    java.text.DateFormat df = new java.text.SimpleDateFormat("hh:mm:ss");
    Date date1 = df.parse(sdfDate.format(now));
    Date date2 = df.parse(distanceTime);
    long diff = date2.getTime() - date1.getTime();
    int timeInSeconds = (int) (diff / 1000);
    int hours, minutes;

    hours = timeInSeconds / 3600;
    timeInSeconds = timeInSeconds - (hours * 3600);
    minutes = timeInSeconds / 60;

    if (hours >= 0) {
    returnMsg = hours + " hours" +
            "\n" + minutes + " mins";
    } else {
    returnMsg = minutes + " mins";
    }
} catch (Exception e) {
    e.printStackTrace();
}
return returnMsg;
}
4

5 回答 5

4

在您的日期格式中,hh用于12小时时间。使用24小时时间HH

new SimpleDateFormat("HH:mm:ss");
于 2013-02-14T21:58:48.597 回答
0

这是一个更健壮并使用 Java 更现代的日期函数的示例。我可以逐点逐条说明您在示例中可以做得更好的所有事情,但有时给您一个好的示例并让您从其他人的代码中收集到最好的代码更容易。

import java.util.Calendar;

public class testSpace {
     public static void main (String ... args){
            System.out.println(timeUntil("00:12:12"));      
    }

    private static String timeUntil(String distanceTime){

        String[] times = distanceTime.split(":");

        Calendar now = Calendar.getInstance();

        Calendar then = Calendar.getInstance();
        then.set(Calendar.SECOND, Integer.parseInt(times[2]));
        then.set(Calendar.MINUTE, Integer.parseInt(times[1]));
        then.set(Calendar.HOUR, Integer.parseInt(times[0]) % 12);
        then.set(Calendar.AM_PM,  (Integer.parseInt(times[0]) >= 12 ) ? Calendar.PM : Calendar.AM);

        boolean isFuture = (then.getTimeInMillis() > now.getTimeInMillis());

        long interval = (isFuture)
            ? then.getTimeInMillis() - now.getTimeInMillis()
            : now.getTimeInMillis() - then.getTimeInMillis();

        return ((isFuture) ? "" : "-") + millToTime(interval);
    }

    public static long MILLISECOND_PER_HOUR = 1000*60*60;
    public static long MILLISECOND_PER_MIN = 1000*60;
    public static long MILLISECOND_PER_SECOND = 1000;

    public static String millToTime(long mill){
        long hours  = mill / MILLISECOND_PER_HOUR;
        long mins   = (mill % MILLISECOND_PER_HOUR) / MILLISECOND_PER_MIN;
        long sec    = ((mill % MILLISECOND_PER_HOUR) % MILLISECOND_PER_MIN) / MILLISECOND_PER_SECOND;
        return String.format("%d:%d:%d", hours, mins, sec);
    }
}
于 2013-02-14T23:16:55.523 回答
0

代码审查意见...

  1. 大多数 Date 类的方法已被弃用。您应该考虑使用日历 (GregorianCalendar) 而不是日期。

  2. 你的变量名通常没有意义——你必须知道变量的用途才能知道它的意义。如果您使用更好的变量名称,您的代码将更易于维护。df 可以重命名为“格式”或“日期格式”。

  3. 您“现在”创建一个日期对象,然后将其传递给您的 df DateFormat 实例,然后通过您的 sdfDate 实例将其转换回日期。这是不必要的。将其替换为Date date1 = new Date();并删除Date now = new Date();. 同样,我发现在单位之间转换时很难诊断错误,因此您应该更改diff以指示它是毫秒,例如diff_ms. 并且您应该保持名称一致 - 您从“不同”( diff) 更改为“timeInSeconds”。它们都应该是“timeInXxx”或“diff_xx”。distanceTime参数应该重命名为futureTime

  4. 你做了一堆数学来确定两次之间的差异,但是有一些库会为你做这件事。谷歌“两个日期之间的java差异”并找到很多答案。

  5. 您的代码始终假定第二次发生在“现在”之后。这应该包含在方法顶部的注释中。

  6. 当您实例化 date1 和 date2 时,它们可能都在同一天。尝试在创建对象后立即调试或至少将对象打印到标准输出,以查看是否是这种情况。这是你真正想要的吗?

  7. 您的代码不处理闰年。

  8. 与其自己处理所有的时间转换,不如寻找一个为您完成转换的库?

于 2013-02-14T22:23:11.987 回答
0

这是您的固定代码。我已将日期格式更改为 HH:mm:ss 以及您的计算逻辑。试试看,让我们知道

private static String timeUntil(String distanceTime) {
    String returnMsg = null;
    try {
        SimpleDateFormat sdfDate = new SimpleDateFormat("HH:mm:ss");
        Date now = new Date();
        java.text.DateFormat df = new java.text.SimpleDateFormat("HH:mm:ss");
        Date date1 = df.parse(sdfDate.format(now));
        Date date2 = df.parse(distanceTime);
        long diff = date2.getTime() - date1.getTime();
        int timeInSeconds = (int) (diff / 1000);
        int hours, minutes;

        hours = timeInSeconds / 3600;
        timeInSeconds = timeInSeconds - (hours * 3600);
        minutes = timeInSeconds / 60;

        if (hours != 0) {
        returnMsg = hours + " hours" +
                "\n" + minutes + " mins";
        } else {
        returnMsg = minutes + " mins";
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return returnMsg;
    }
于 2013-02-14T22:41:31.930 回答
0
于 2016-10-23T22:17:14.663 回答