如何在-01:-05:00到-01:05:00

时间:2017-01-09 09:45:26

标签: java

使用java减去时间1:10和2:15后,我得到的输出为毫秒,即毫秒-3900000。然后我将此毫秒转换为时间格式,然后生成的输出为 输出:-01:-05:00。

我期待的输出就像-01:05:00。 输出中只应有一个负号

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;

public class TimeAddition {
    public static void main(String args[]) throws ParseException {
        String b = "1:10";
        String a = "2:15";

     // converting String time into dateTime   
        DateFormat sdf = new SimpleDateFormat("hh:mm");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        Date bTime = sdf.parse(b);
        Date aTime = sdf.parse(a);

        long totalTime = bTime.getTime() - aTime.getTime();

        System.out.println("Total time in millisecond = " + totalTime);

        long millis = totalTime;

        String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
            TimeUnit.MILLISECONDS.toMinutes(millis)
                    - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
            TimeUnit.MILLISECONDS.toSeconds(millis)
                    - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));

        System.out.println("Time format " + hms);   
    }

}

产生的产出: 总时间(毫秒)= -3900000 时间格式-1:-5:00

预期时间格式= -01:05:00

4 个答案:

答案 0 :(得分:2)

你应该做那样的事情:

  • 您计算是否应添加符号( - )。
  • 如果时间量为负,则获得其绝对值(您也可以使用Maths.abs)。
  • 您使用之前的标志对其进行格式化。

给出了:

String sign = totalTime < 0 ? "-":"";
long millis = totalTime < 0 ? -totalTime:totalTime;
String hms = String.format("%s%02d:%02d:%02d", sign, TimeUnit.MILLISECONDS.toHours(millis),
                TimeUnit.MILLISECONDS.toMinutes(millis)
                       - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
                TimeUnit.MILLISECONDS.toSeconds(millis)
                        - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));

答案 1 :(得分:0)

只需更改此代码:

TimeUnit.MILLISECONDS.toMinutes(millis)
                - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))

到此代码:

TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)) - TimeUnit.MILLISECONDS.toMinutes(millis)

Tested successsfully

答案 2 :(得分:0)

您也可以使用这种方法轻松获得时差。

public static void main(String[] args)
{
     String time1 = "01:10:00";
     String time2 = "02:15:00";
     String finalDiff;

     try{
          SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
          Date date1 = format.parse(time1);
          Date date2 = format.parse(time2);

          long difference = date1.getTime() - date2.getTime();
          Date d;

          if(difference<0) {
              d = new Date(-1*difference);
              finalDiff = "-"+ format.format(d);
          }
          else{
              d = new Date(difference);
              finalDiff = format.format(d);
          }

          System.out.println(finalDiff);// gives the difference as required by you.

     }catch(Exception e){}
} 

答案 3 :(得分:0)

DateSimpleDateFormat都是老式的,不适合此目的。它们用于某个时间点及其在某个时区的表示,从不在一段时间间隔内。我不习惯将它们用于后者,或者我至少会在运行不同时区的计算机上进行彻底的测试。

我的建议是使用新的java.time包。尽管this answer的评论中讨论的事实是它不包括持续时间格式化程序。

    String b = "1:10";
    String a = "2:15";

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm", Locale.ROOT);
    LocalTime end = LocalTime.parse(b, dtf);
    LocalTime start = LocalTime.parse(a, dtf);
    Duration totalTime = Duration.between(start, end);
    String sign;
    if (totalTime.isNegative()) {
        totalTime = totalTime.negated();
        sign = "-";
    } else {
        sign = "";
    }
    long hours = totalTime.toHours();
    totalTime = totalTime.minusHours(hours);
    long minutes = totalTime.toMinutes();
    totalTime = totalTime.minusMinutes(minutes);
    long seconds = totalTime.getSeconds();
    System.out.format("%s%d:%02d:%02d%n", sign, hours, minutes, seconds);

打印:

-1:05:00

价格是我们需要明确处理负区间。好消息是库类为我们做了所有计算:计算时间长度并转换为小时,分钟和秒。