用Java减去两个日期

时间:2014-05-11 14:17:44

标签: java date time subtraction

我想在Java中减去两个日期(一个常量和一个当前),但我遇到了奇怪的问题。这是代码:

DateFormat df = new SimpleDateFormat("HH:MM");
Date FirstLessonInterval=df.parse("08:45");
Date currentTime = new Date();

long diff = FirstLessonInterval.getTime()-currentTime.getTime();

String s = String.valueOf(diff);
LessonOrBreak=(diff);

我有减去分钟。当我想在FirstLessonInterval.toString()中看到FirstLessonInterval时,它显示了1970年。我该怎么办?

7 个答案:

答案 0 :(得分:3)

你忘记给出约会,你刚刚定义了一个时间:

DateFormat df = new SimpleDateFormat("HH:MM");
Date FirstLessonInterval=df.parse("08:45");

这是在unix time第0天,也就是1.1.1970

尝试类似

的内容
DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:MM");
Date FirstLessonInterval=df.parse("2014/05/10 08:45");

答案 1 :(得分:1)

1970年是所有时间都是根据计算机开始的地方。我们在您的问题中遗漏了一些代码吗?你可以用毫秒来了解当前时间,但我会看看JodaTime并使用它。

你得到1970年的原因....是因为我怀疑你的差异很小。然后,如果你把它看作一个日期,那么它将是一个小数字+ 1970年1月1日仍然是1970年。但正如我所说,我怀疑我们在你的问题中遗漏了一些代码。

在JodaTime中你可以像下面那样做一些事情,但我不确定你到底是什么

Interval i= new Interval(new DateTime(FirstLessonInterval), new DateTime());
System.out.println("Interval is: " + i.toDurationMillis());

答案 2 :(得分:1)

  1. 您的格式模式不正确,请使用小写mm来表示分钟
  2. 当你没有为过时的Java date api指定太多细节时,它会考虑自UNIX纪元(1970年1月1日)以来的时间
  3. 由于您假设日期与您提供的恒定时间参数相同且与时区无关,因此您可以将当前日期与UNIX纪元以来的时间进行比较:
  4. 保持接近原始代码;

    DateFormat df = new SimpleDateFormat("HH:mm");
    Date firstLessonInterval = df.parse("08:45");
    Date currentTime = new Date();
    
    // Format the current date comparable to UNIX epoch (only hold time params)
    String dateStr = df.format(currentTime.getTime());
    // Parse the modified date string to a date object
    Date comDate = df.parse(dateStr);
    // Take the difference in millis
    long diff = firstLessonInterval.getTime() - comDate.getTime();
    String s = String.valueOf(diff);
    // Print the number of minutes passed since
    System.out.println("Minutes {elapsed since/time to} 08:45 - " + Math.abs(diff) / 1000 / 60);
    

答案 3 :(得分:1)

缺少日期部分

正如其他正确答案所说,您使用的是java.util.Date类,它是一个同时包含日期部分和时间部分的日期时间类。

本地时间

如果你真的只关心时间,没有日期和没有时区,那么使用Joda-Time库和Java 8中的新java.tome包中找到的LocalTime类。顺便说一下java.util.Date和.Calendar类是众所周知的麻烦,应该避免。

约达时间

以下是一些包含日期时间和时区的代码。

使用Joda-Time 2.3库...

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Warsaw" );
DateTime dateTime = new DateTime( 2014, 1, 2, 8, 45, 0, timeZone );
DateTime now = new DateTime( 2014, 1, 2, 8, 30, 0, timeZone ); // Or DateTime.now( timeZone )
Duration duration = new Duration( dateTime, now );  // or use Period or Interval.

Joda-Time提供了一段时间(周期,间隔或持续时间)的智能课程和工作方法。例如,查看Minutes类。但如果您只需要毫秒,那么就去吧。

long millis = duration.getMillis();

答案 4 :(得分:0)

问题是您没有向SimpleDateFormat提供足够的信息。它正确设置了小时和分钟,但没有别的。

DateFormat df = new SimpleDateFormat("HH:mm");
System.out.println(df.parse("08:45"));          // Thu Jan 01 08:45:00 GMT 1970
System.out.println(new Date());                 // Sun May 11 07:52:50 GMT 2014

如果您希望您的日期与当前日期相关,请尝试:

Date curr = new Date();
Date date = new Date(curr.getYear(), 
                     curr.getMonth(), 
                     curr.getDate(), 
                     8, 45, 0);

System.out.println(date);                       // Sun May 11 08:45:00 GMT 2014
System.out.println(curr);                       // Sun May 11 07:52:50 GMT 2014

long diff = date.getTime() - curr.getTime();
System.out.println("Minutes: " + diff/6000);    // Minutes: 53

答案 5 :(得分:0)

我不知道这种方式是否有效,但无论如何它都是一个想法:

Date curr = new Date();
Date date = new Date(114,     /*114 is 2014 , don't know why*/ 
                     6, 
                     16, 
                     8, 45, 0);

System.out.println(curr); 
System.out.println(date);  

Date x = new Date(curr.getYear() - date.getYear() ,
        curr.getMonth() - date.getMonth(),
        curr.getDate() - date.getDate(),
        curr.getHours() - date.getHours(),
        curr.getMinutes() - date.getMinutes(),
        curr.getSeconds() - date.getSeconds()   );

答案 6 :(得分:0)

    String startDateString = "2017-03-08";
    String finishDateString = "2017-03-10";        

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.ENGLISH);
    LocalDate startDate = LocalDate.parse(startDateString, formatter);
    LocalDate finishDate = LocalDate.parse(finishDateString, formatter);

Integer day = finishDate.compareTo(startDate);

整数天将为3.这意味着两个日期之间的差异等于3天