【问题标题】:java- difference between 2 different times in 2 different days [duplicate]java- 2个不同日子2个不同时间之间的差异[重复]
【发布时间】:2015-03-13 07:49:44
【问题描述】:

我想写一个程序来显示从现在到未来某个特定时间的剩余时间。因为我想使用Joda-Time我搜索了很多并找到了一些代码(例如this one),但我不知道如何在 2 个不同的日子里做 2 个不同的时间。有什么想法吗?

【问题讨论】:

  • 对你需要什么有点困惑。您是否只想区分“现在”和未来的特定日期?如果是这样,那么使用 Period 很容易做到。被“2 个不同的日子 2 个不同的时间”弄糊涂了
  • 你能发布你目前拥有的任何代码吗?它可以帮助我们了解您想要做什么。
  • 您的输入和预期输出是什么?
  • @MadProgrammer 我想给出 2 个日期(年、月、日、小时、分钟、秒),它给了我它们之间的持续时间(天、小时、分钟、秒)

标签: java jodatime


【解决方案1】:

你的意思是……

DateTime from = new DateTime(2014, DateTimeConstants.FEBRUARY, 15, 8, 51, 30, 100);
DateTime to = new DateTime(2016, DateTimeConstants.DECEMBER, 25, 17, 01, 51, 50);

Interval i = new Interval(from, to);
Period p = i.toPeriod(PeriodType.yearMonthDayTime());

System.out.println(p.getYears() + " years");
System.out.println(p.getMonths() + " months");
System.out.println(p.getDays() + " days");
System.out.println(p.getHours() + " hours");
System.out.println(p.getSeconds() + " seconds");
System.out.println(p.getMillis() + " millis");

哪些输出

2 years
10 months
10 days
8 hours
20 seconds
950 millis

现在使用...

DateTime from = new DateTime();
DateTime to = new DateTime(2015, 3, 21, 2, 15, 10);

相反,打印...

0 years
0 months
7 days
15 hours
26 seconds
755 millis

【讨论】:

  • 是的。这是正确的方法,我很高兴学习。谢谢。
  • @MadProgrammer thanx 但我得到了奇怪的结果! LocalDateTime from = new LocalDateTime(); LocalDateTime to = new LocalDateTime(2015, 3,21, 2, 15, 10); 给了我 0 天。为什么???!!
  • 是的,我在运行这个程序后也注意到了这一点。即使是您的输入,我相信它也不应该给 3 天。 @MadProgrammer
  • @muasif80 查看更新 - 显示我实际执行此操作的频率:P
  • :) 那么更新是什么?您现在获取期间对象的方式是更新或更改 DateTime。不过,我现在也要运行它。
【解决方案2】:
package com.test;

import java.util.Calendar;

import org.joda.time.Duration;

public class Main {

public Main() {
}

public static void main(String[] args) {
    Calendar calendar1 = Calendar.getInstance();
    Calendar calendar2 = Calendar.getInstance();

    calendar1.add(Calendar.DAY_OF_YEAR, 1);
    calendar1.add(Calendar.HOUR_OF_DAY, 2);
    calendar1.add(Calendar.MINUTE, 10);

    Duration duration = new Duration(calendar2.getTimeInMillis(), calendar1.getTimeInMillis());
    System.out.println(duration.getMillis());
    System.out.println(duration.getStandardDays());
    System.out.println(duration.getStandardMinutes());
    System.out.println(duration.getStandardHours());
    System.out.println(duration.getStandardSeconds());
}

}

我认为这可能对您有所帮助。

此代码将给出完全相同的持续时间。您需要将 calendar2 设置为将来的固定日期才能获得所需的结果。

更新 1

例如,您可以将其用于将来的固定日期。可以有其他更好的方法来实现相同的目标。

package com.test;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.joda.time.Duration;

public class Main {

public Main() {
}

public static void main(String[] args) throws ParseException {
    Calendar calendar1 = Calendar.getInstance();

    DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

    Date date1 = calendar1.getTime();
    Date date2 = df.parse("2015/03/20 10:30:00");


    Duration duration = new Duration(date1.getTime(), date2.getTime());
    long millis = duration.getMillis();
    long days = duration.getStandardDays();
    long mins = duration.getStandardMinutes();
    long hrs = duration.getStandardHours();
    long secs = duration.getStandardSeconds();

    System.out.println(days + ":" + (hrs % 24) + ":" + (mins%60) + ":" + (secs%(mins)) + " remaining");
}

}

【讨论】:

  • 这是使用Duration 的一种有趣方式。有什么理由不直接使用LocalDateTime 吗?
  • 我不知道 LocalDateTime :) 我认为它是特定的 jodatime。没有使用过 JodaTime 很多。很高兴向您学习。
  • 你的意思是像org.joda.time.LocalDateTime
  • @muasif80 无法正常工作:(
  • @Soheil 它怎么不能正常工作?您的输入和预期输出是什么?
【解决方案3】:

您提到您想使用 Joda-time,因此其他解决方案之一可能更适合您。

但是,现在也可以使用 Java 8 的本机 Time 库轻松完成相同的过程,如下所示:

public class Main {

    public static void main() {
        Instant then = Instant.EPOCH;  //1970-01-01T00:00:00Z
        Instant now = Instant.now(); //The current "instant" in time

        Duration duration = Duration.between(then, now);

        //Outputs the days, hours, minutes, and seconds between the epoch start and now.
        System.out.println(duration.getDays());
        System.out.println(duration.getHours());
        System.out.println(duration.getMinutes());
        System.out.println(duration.getSeconds());

        //If you want to account for having already displayed days 
        //when showing your hours, and so on down the units, do this:
        System.out.println(duration.getDays());
        duration = duration.minusDays(duration.getDays());

        System.out.println(duration.getHours());
        duration = duration.minusHours(duration.getHours());

        System.out.println(duration.getMinutes());
        duration = duration.minusMinutes(duration.getMinutes());

        System.out.println(duration.getSeconds());
    }

}

在此处查看完整的软件包文档:http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html

【讨论】:

  • 太棒了,但问题确实表明他们想要/需要使用 Joda-Time,并且考虑到他们想要两个日期之间的天、小时、分钟和秒,这表明 @987654323 @会是更好的选择
  • @MadProgrammer,我支持你。考虑到 Joda-time 的要求,我实际上在争论我是否应该回答,并最终认为这不会造成伤害,并且可能对讨论有用。根据您的评论,我已更新代码以显示以天、小时、分钟和秒为单位的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 2013-09-11
  • 2012-04-30
  • 2018-04-04
  • 1970-01-01
相关资源
最近更新 更多