Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-以分钟为单位的时差_Java - Fatal编程技术网

Java-以分钟为单位的时差

Java-以分钟为单位的时差,java,Java,我在计算以分钟为单位的时差时遇到了这个问题。 它的工作原理很好,例如计算 2045年和2300年 但当我想计算两者之间的差异时,例如 2330(今天)和0245(明天)我得到了一个错误的答案。 代码如下: // This example works String dateStart = "2045"; String dateStop = "2300"; // This example doesnt work //String dateStart = "2

我在计算以分钟为单位的时差时遇到了这个问题。 它的工作原理很好,例如计算 2045年和2300年

但当我想计算两者之间的差异时,例如 2330(今天)和0245(明天)我得到了一个错误的答案。 代码如下:

    // This example works
    String dateStart = "2045";
    String dateStop = "2300";

    // This example doesnt work
    //String dateStart = "2330";
    //String dateStop = "0245";

    // Custom date format
    SimpleDateFormat format = new SimpleDateFormat("HHmm");  

    Date d1 = null;
    Date d2 = null;
    try {
        d1 = format.parse(dateStart);
        d2 = format.parse(dateStop);
    } catch (Exception e) {
        e.printStackTrace();
    }    

    long diff = d2.getTime() - d1.getTime();
    long minutes = TimeUnit.MILLISECONDS.toMinutes(diff);                      
    System.out.println("Time in minutes: " + minutes + " minutes.");

提前感谢

这是一个已解决的问题。如果您查看Joda时间库,您会发现您可能需要的所有时间和日期操纵函数:

在您的案例中,大致如下:

DateTime first = new DateTime(larger-time);
DateTime second = new DateTime(smaller-time);
DateTime difference = first.minusMillis(second.getMillis())

Joda将处理所有奇怪的边缘条件,如日/月/年之间的滚动、月长、闰年、夏令时、时区……

这不起作用,因为当你创建一个只有一个时间的新日期时,它假设这一天是“今天”

你能做的是:

// This example works
String dateStart = "2045";
String dateStop = "2300";

// This example doesnt work
//String dateStart = "2330";
//String dateStop = "0245";

// Custom date format
SimpleDateFormat format = new SimpleDateFormat("HHmm");  

Date d1 = null;
Date d2 = null;
try {
    d1 = format.parse(dateStart);
    d2 = format.parse(dateStop);
} catch (Exception e) {
    e.printStackTrace();
}

// MY ADDITION TO YOUR CODE STARTS HERE
if(d2.before(d1)){
    Calendar c = Calendar.getInstance(); 
    c.setTime(d2); 
    c.add(Calendar.DATE, 1);
    d2 = c.getTime();
}
// ENDS HERE

long diff = d2.getTime() - d1.getTime();
long minutes = TimeUnit.MILLISECONDS.toMinutes(diff);                      
System.out.println("Time in minutes: " + minutes + " minutes.");

但是你应该考虑使用java 8新的日期/时间特性,或者JoDaTime。

< P>你可以添加if语句来检查这是不是今天,如果没有,你可以添加一天到这个,因为你在比较时间,如果你添加了全天

,那就不会有问题了。
    if(d2.before(d1)){
        d2.setTime(d2.getTime()+86400000);
    }
试试看

考虑使用
java.time.*
Java8中引入的包中的类。它们在使用上非常方便,因为它们可以处理各种角落情况(例如,测量不同时区的分钟数,或在秋季和春季时间变化期间)

计算时差时,您需要知道的是:

  • LocalTime仅包含时间
  • LocalDate仅包含日期(无时间)
  • LocalDateTime包含这两个(日期+时间)
  • ZoneDateTime包含日期+时间+时区
这意味着,与以下各项相比,时间之间的差异将有所不同:

  • LocalTime您只能区分时间,因此20:4523:30的差异为2:45
  • LocalDate您无法计算任何时间差(不包含时间)
  • LocalDateTime您可以指定日期和时间,例如:1月1日20:45和1月3日23:30。时差为2:45和2天时差,或50:45
  • ZonedDateTime-与LocalDateTime相同,而且您还考虑了日光节约,因此如果在夜间更改时钟,它将被反射
下面是一个LocalDateTime的代码片段:

    LocalDateTime today2045    = LocalDateTime.of(
            LocalDate.now(),
            LocalTime.parse("20:45"));
    LocalDateTime tomorrow0230 = LocalDateTime.of(
            LocalDate.now().plusDays(1),
            LocalTime.parse("02:30"));

    System.out.println("Difference [minutes]: " + 
            Duration.between(today2045, tomorrow0230).toMinutes());
对于分区日期时间,考虑到春季/秋季时钟的变化:

    ZonedDateTime today2045    = ZonedDateTime.of(
            LocalDate.now(),
            LocalTime.parse("20:45"),
            ZoneId.systemDefault());
    ZonedDateTime tomorrow0230 = ZonedDateTime.of(
            LocalDate.now().plusDays(1),
            LocalTime.parse("02:30"),
            ZoneId.systemDefault());

    System.out.println("Difference [minutes]: " + 
            Duration.between(today2045, tomorrow0230).toMinutes());


可以在中找到有关构造函数的一些信息。

您需要在
d2
中添加1天。想想您的程序如何知道时间不是从当前日期开始的。@Semith您是如何解决问题的?我的回答有帮助吗?正确答案是什么?谢谢。这比我在回答中最初的方式要好得多。我已经用你的代码更新了我的答案。谢谢86400000假设所有的日子都正好有24小时。这对于日光节约来说是失败的,因为它总是在1970年1月1日增加24小时哇!因为使用了一个备受尊敬的图书馆,很多人投了反对票。任何身体护理来解释为什么你最初的回答没有可用的答案,只是建议去图书馆看看。也就是说,当第三方库基本上是一样的并且不需要依赖时,为什么还要依赖它呢?啊,是的。我整理了一个快速的答案,然后对其进行了编辑,添加了一个示例。当我结束时,我投了3张反对票——不到3分钟!更糟糕的是,投票结果并不适用于所有情况。你是对的,java.time是相同的东西,但它只是Java8。一些事实上的更正…Joda time和java.time不是一回事。它们共享一些基本概念,共享一些类/方法名称,共享同一个leader(stephencolbourne),但彼此不同。Joda Time启发了java.Time,但现在Joda Time处于维护模式,团队建议迁移到java.Time类。是的,java.time内置于JavaSE8中,JavaSE9中添加了一些小功能和修复。但是,在ThreeTen Backport项目中,许多功能被移植到Java 6和7,并在ThreeTenABP中进一步适用于Android。我理解的问题是,如何在几分钟内找到例如
“2330”
(今天)和
“0245”
(明天)之间的差异。Joda时间(或java 8功能)是解决这个问题的唯一可靠方法,而java 8功能肯定是一个改进,我认为答案完全可靠,我挑战你,“SurM云,指出它不是什么方式(我不知道Joda时间足够好,有一个合格的意见).这很有效,非常感谢。你能把我链接到新的Java8函数吗?对Java还是有点陌生,不知道新的功能为什么是downvoting?这回答了问题,符合最新的建议(???)。也许否决投票是因为在这个问题的两个答案中发布了相同的材料?@Basil Bourqe:没有。这一位首先获得了否决票。我想我正在编辑它,当我完成的时候,我得到了反对票。(A)当你整理并整合成一个单一的答案时,我会很高兴地向上投票。(B) 我建议使用“java.time”而不是“java8”,因为这个名称不会很好用。(C) 代码片段可能比您的完整类更容易阅读,该类带有人为的for循环。作为补充,如果您愿意,您可以将完整的代码放在一个在线工具(如IdeOne.com)中,并从您的答案链接到它。谢谢您的建议。特别是关于片段的。我们将牢记这一点,并在今天晚些时候完成更改。